{"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: 865104 bytes, number of entries: 404\n+Zip file size: 866653 bytes, number of entries: 404\n drwxr-xr-x  2.0 unx        0 b- stor 24-May-13 22:09 META-INF/\n -rw-r--r--  2.0 unx      319 b- defN 24-May-13 22:09 META-INF/MANIFEST.MF\n drwxr-xr-x  2.0 unx        0 b- stor 24-May-13 22:09 docs/\n drwxr-xr-x  2.0 unx        0 b- stor 24-May-13 22:09 docs/org.apache.nifi/\n drwxr-xr-x  2.0 unx        0 b- stor 24-May-13 22:09 docs/org.apache.nifi/nifi-airtable-nar/\n drwxr-xr-x  2.0 unx        0 b- stor 24-May-13 22:09 docs/org.apache.nifi/nifi-airtable-nar/2.0.0-M3/\n drwxr-xr-x  2.0 unx        0 b- stor 24-May-13 22:09 docs/org.apache.nifi/nifi-airtable-nar/2.0.0-M3/org.apache.nifi.processors.airtable.QueryAirtableTable/\n@@ -243,15 +243,15 @@\n drwxr-xr-x  2.0 unx        0 b- stor 24-May-13 22:09 docs/org.apache.nifi/nifi-zendesk-services-nar/2.0.0-M3/org.apache.nifi.services.zendesk.ZendeskRecordSink/\n drwxr-xr-x  2.0 unx        0 b- stor 24-May-13 22:09 META-INF/maven/\n drwxr-xr-x  2.0 unx        0 b- stor 24-May-13 22:09 META-INF/maven/org.apache.nifi/\n drwxr-xr-x  2.0 unx        0 b- stor 24-May-13 22:09 META-INF/maven/org.apache.nifi/nifi-runtime-manifest/\n -rw-r--r--  2.0 unx    76637 b- defN 24-May-13 22:09 META-INF/DEPENDENCIES\n -rw-r--r--  2.0 unx    11358 b- defN 24-May-13 22:09 META-INF/LICENSE\n -rw-r--r--  2.0 unx      160 b- defN 24-May-13 22:09 META-INF/NOTICE\n--rw-r--r--  2.0 unx     1293 b- defN 24-May-13 22:09 build.properties\n+-rw-r--r--  2.0 unx     1188 b- defN 24-May-13 22:09 build.properties\n -rw-r--r--  2.0 unx     2722 b- defN 24-May-13 22:09 docs/org.apache.nifi/nifi-airtable-nar/2.0.0-M3/org.apache.nifi.processors.airtable.QueryAirtableTable/additionalDetails.html\n -rw-r--r--  2.0 unx     4031 b- defN 24-May-13 22:09 docs/org.apache.nifi/nifi-amqp-nar/2.0.0-M3/org.apache.nifi.amqp.processors.ConsumeAMQP/additionalDetails.html\n -rw-r--r--  2.0 unx     5854 b- defN 24-May-13 22:09 docs/org.apache.nifi/nifi-amqp-nar/2.0.0-M3/org.apache.nifi.amqp.processors.PublishAMQP/additionalDetails.html\n -rw-r--r--  2.0 unx     5394 b- defN 24-May-13 22:09 docs/org.apache.nifi/nifi-asana-processors-nar/2.0.0-M3/org.apache.nifi.processors.asana.GetAsanaObject/additionalDetails.html\n -rw-r--r--  2.0 unx    12176 b- defN 24-May-13 22:09 docs/org.apache.nifi/nifi-aws-nar/2.0.0-M3/org.apache.nifi.processors.aws.dynamodb.PutDynamoDBRecord/additionalDetails.html\n -rw-r--r--  2.0 unx     2407 b- defN 24-May-13 22:09 docs/org.apache.nifi/nifi-aws-nar/2.0.0-M3/org.apache.nifi.processors.aws.kinesis.stream.ConsumeKinesisStream/additionalDetails.html\n -rw-r--r--  2.0 unx     2063 b- defN 24-May-13 22:09 docs/org.apache.nifi/nifi-aws-nar/2.0.0-M3/org.apache.nifi.processors.aws.ml.polly.GetAwsPollyJobStatus/additionalDetails.html\n@@ -396,11 +396,11 @@\n -rw-r--r--  2.0 unx    21040 b- defN 24-May-13 22:09 docs/org.apache.nifi/nifi-update-attribute-nar/2.0.0-M3/org.apache.nifi.processors.attributes.UpdateAttribute/additionalDetails.html\n -rw-r--r--  2.0 unx     2308 b- defN 24-May-13 22:09 docs/org.apache.nifi/nifi-websocket-processors-nar/2.0.0-M3/org.apache.nifi.processors.websocket.ConnectWebSocket/additionalDetails.html\n -rw-r--r--  2.0 unx     4150 b- defN 24-May-13 22:09 docs/org.apache.nifi/nifi-windows-event-log-nar/2.0.0-M3/org.apache.nifi.processors.windows.event.log.ConsumeWindowsEventLog/additionalDetails.html\n -rw-r--r--  2.0 unx     2772 b- defN 24-May-13 22:09 docs/org.apache.nifi/nifi-workday-processors-nar/2.0.0-M3/org.apache.nifi.processors.workday.GetWorkdayReport/additionalDetails.html\n -rw-r--r--  2.0 unx     3375 b- defN 24-May-13 22:09 docs/org.apache.nifi/nifi-zendesk-nar/2.0.0-M3/org.apache.nifi.processors.zendesk.GetZendesk/additionalDetails.html\n -rw-r--r--  2.0 unx     7289 b- defN 24-May-13 22:09 docs/org.apache.nifi/nifi-zendesk-nar/2.0.0-M3/org.apache.nifi.processors.zendesk.PutZendeskTicket/additionalDetails.html\n -rw-r--r--  2.0 unx     7449 b- defN 24-May-13 22:09 docs/org.apache.nifi/nifi-zendesk-services-nar/2.0.0-M3/org.apache.nifi.services.zendesk.ZendeskRecordSink/additionalDetails.html\n--rw-r--r--  2.0 unx  4209579 b- defN 24-May-13 22:09 nifi-runtime-manifest.json\n+-rw-r--r--  2.0 unx  4209555 b- defN 24-May-13 22:09 nifi-runtime-manifest.json\n -rw-r--r--  2.0 unx     7850 b- defN 24-May-13 22:09 META-INF/maven/org.apache.nifi/nifi-runtime-manifest/pom.xml\n -rw-r--r--  2.0 unx       74 b- defN 24-May-13 22:09 META-INF/maven/org.apache.nifi/nifi-runtime-manifest/pom.properties\n-404 files, 5259168 bytes uncompressed, 755934 bytes compressed:  85.6%\n+404 files, 5259039 bytes uncompressed, 757483 bytes compressed:  85.6%\n"}, {"source1": "zipdetails --redact --scan --utc {}", "source2": "zipdetails --redact --scan --utc {}", "unified_diff": "@@ -4479,16153 +4479,16153 @@\n 099D0 Extract Zip Spec      14 (20) '2.0'\n 099D1 Extract OS            00 (0) 'MS-DOS'\n 099D2 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n 099D4 Compression Method    0008 (8) 'Deflated'\n 099D6 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-099DA CRC                   A60F7060 (2786029664)\n-099DE Compressed Size       000002EB (747)\n-099E2 Uncompressed Size     0000050D (1293)\n+099DA CRC                   13966CB5 (328625333)\n+099DE Compressed Size       000002BA (698)\n+099E2 Uncompressed Size     000004A4 (1188)\n 099E6 Filename Length       0010 (16)\n 099E8 Extra Length          0000 (0)\n 099EA Filename              'XXXXXXXXXXXXXXXX'\n #\n # WARNING: Offset 0x99EA: Filename 'XXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n 099FA PAYLOAD\n \n-09CE5 LOCAL HEADER #250     04034B50 (67324752)\n-09CE9 Extract Zip Spec      14 (20) '2.0'\n-09CEA Extract OS            00 (0) 'MS-DOS'\n-09CEB General Purpose Flag  0800 (2048)\n+09CB4 LOCAL HEADER #250     04034B50 (67324752)\n+09CB8 Extract Zip Spec      14 (20) '2.0'\n+09CB9 Extract OS            00 (0) 'MS-DOS'\n+09CBA General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-09CED Compression Method    0008 (8) 'Deflated'\n-09CEF Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-09CF3 CRC                   9CB4EC6B (2629102699)\n-09CF7 Compressed Size       00000546 (1350)\n-09CFB Uncompressed Size     00000AA2 (2722)\n-09CFF Filename Length       007D (125)\n-09D01 Extra Length          0000 (0)\n-09D03 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+09CBC Compression Method    0008 (8) 'Deflated'\n+09CBE Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+09CC2 CRC                   9CB4EC6B (2629102699)\n+09CC6 Compressed Size       00000546 (1350)\n+09CCA Uncompressed Size     00000AA2 (2722)\n+09CCE Filename Length       007D (125)\n+09CD0 Extra Length          0000 (0)\n+09CD2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x9D03: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x9CD2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-09D80 PAYLOAD\n+09D4F PAYLOAD\n \n-0A2C6 LOCAL HEADER #251     04034B50 (67324752)\n-0A2CA Extract Zip Spec      14 (20) '2.0'\n-0A2CB Extract OS            00 (0) 'MS-DOS'\n-0A2CC General Purpose Flag  0800 (2048)\n+0A295 LOCAL HEADER #251     04034B50 (67324752)\n+0A299 Extract Zip Spec      14 (20) '2.0'\n+0A29A Extract OS            00 (0) 'MS-DOS'\n+0A29B General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-0A2CE Compression Method    0008 (8) 'Deflated'\n-0A2D0 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-0A2D4 CRC                   445AD7B2 (1146804146)\n-0A2D8 Compressed Size       000006D4 (1748)\n-0A2DC Uncompressed Size     00000FBF (4031)\n-0A2E0 Filename Length       006E (110)\n-0A2E2 Extra Length          0000 (0)\n-0A2E4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+0A29D Compression Method    0008 (8) 'Deflated'\n+0A29F Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+0A2A3 CRC                   445AD7B2 (1146804146)\n+0A2A7 Compressed Size       000006D4 (1748)\n+0A2AB Uncompressed Size     00000FBF (4031)\n+0A2AF Filename Length       006E (110)\n+0A2B1 Extra Length          0000 (0)\n+0A2B3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xA2E4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xA2B3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-0A352 PAYLOAD\n+0A321 PAYLOAD\n \n-0AA26 LOCAL HEADER #252     04034B50 (67324752)\n-0AA2A Extract Zip Spec      14 (20) '2.0'\n-0AA2B Extract OS            00 (0) 'MS-DOS'\n-0AA2C General Purpose Flag  0800 (2048)\n+0A9F5 LOCAL HEADER #252     04034B50 (67324752)\n+0A9F9 Extract Zip Spec      14 (20) '2.0'\n+0A9FA Extract OS            00 (0) 'MS-DOS'\n+0A9FB General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-0AA2E Compression Method    0008 (8) 'Deflated'\n-0AA30 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-0AA34 CRC                   A2A96EA2 (2729012898)\n-0AA38 Compressed Size       0000092B (2347)\n-0AA3C Uncompressed Size     000016DE (5854)\n-0AA40 Filename Length       006E (110)\n-0AA42 Extra Length          0000 (0)\n-0AA44 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+0A9FD Compression Method    0008 (8) 'Deflated'\n+0A9FF Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+0AA03 CRC                   A2A96EA2 (2729012898)\n+0AA07 Compressed Size       0000092B (2347)\n+0AA0B Uncompressed Size     000016DE (5854)\n+0AA0F Filename Length       006E (110)\n+0AA11 Extra Length          0000 (0)\n+0AA13 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xAA44: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xAA13: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-0AAB2 PAYLOAD\n+0AA81 PAYLOAD\n \n-0B3DD LOCAL HEADER #253     04034B50 (67324752)\n-0B3E1 Extract Zip Spec      14 (20) '2.0'\n-0B3E2 Extract OS            00 (0) 'MS-DOS'\n-0B3E3 General Purpose Flag  0800 (2048)\n+0B3AC LOCAL HEADER #253     04034B50 (67324752)\n+0B3B0 Extract Zip Spec      14 (20) '2.0'\n+0B3B1 Extract OS            00 (0) 'MS-DOS'\n+0B3B2 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-0B3E5 Compression Method    0008 (8) 'Deflated'\n-0B3E7 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-0B3EB CRC                   7416DF2A (1947655978)\n-0B3EF Compressed Size       0000091D (2333)\n-0B3F3 Uncompressed Size     00001512 (5394)\n-0B3F7 Filename Length       007E (126)\n-0B3F9 Extra Length          0000 (0)\n-0B3FB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+0B3B4 Compression Method    0008 (8) 'Deflated'\n+0B3B6 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+0B3BA CRC                   7416DF2A (1947655978)\n+0B3BE Compressed Size       0000091D (2333)\n+0B3C2 Uncompressed Size     00001512 (5394)\n+0B3C6 Filename Length       007E (126)\n+0B3C8 Extra Length          0000 (0)\n+0B3CA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xB3FB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xB3CA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-0B479 PAYLOAD\n+0B448 PAYLOAD\n \n-0BD96 LOCAL HEADER #254     04034B50 (67324752)\n-0BD9A Extract Zip Spec      14 (20) '2.0'\n-0BD9B Extract OS            00 (0) 'MS-DOS'\n-0BD9C General Purpose Flag  0800 (2048)\n+0BD65 LOCAL HEADER #254     04034B50 (67324752)\n+0BD69 Extract Zip Spec      14 (20) '2.0'\n+0BD6A Extract OS            00 (0) 'MS-DOS'\n+0BD6B General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-0BD9E Compression Method    0008 (8) 'Deflated'\n-0BDA0 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-0BDA4 CRC                   826E1CC4 (2188254404)\n-0BDA8 Compressed Size       00000DE0 (3552)\n-0BDAC Uncompressed Size     00002F90 (12176)\n-0BDB0 Filename Length       007B (123)\n-0BDB2 Extra Length          0000 (0)\n-0BDB4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+0BD6D Compression Method    0008 (8) 'Deflated'\n+0BD6F Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+0BD73 CRC                   826E1CC4 (2188254404)\n+0BD77 Compressed Size       00000DE0 (3552)\n+0BD7B Uncompressed Size     00002F90 (12176)\n+0BD7F Filename Length       007B (123)\n+0BD81 Extra Length          0000 (0)\n+0BD83 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xBDB4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xBD83: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-0BE2F PAYLOAD\n+0BDFE PAYLOAD\n \n-0CC0F LOCAL HEADER #255     04034B50 (67324752)\n-0CC13 Extract Zip Spec      14 (20) '2.0'\n-0CC14 Extract OS            00 (0) 'MS-DOS'\n-0CC15 General Purpose Flag  0800 (2048)\n+0CBDE LOCAL HEADER #255     04034B50 (67324752)\n+0CBE2 Extract Zip Spec      14 (20) '2.0'\n+0CBE3 Extract OS            00 (0) 'MS-DOS'\n+0CBE4 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-0CC17 Compression Method    0008 (8) 'Deflated'\n-0CC19 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-0CC1D CRC                   1BE163AC (467755948)\n-0CC21 Compressed Size       00000476 (1142)\n-0CC25 Uncompressed Size     00000967 (2407)\n-0CC29 Filename Length       0084 (132)\n-0CC2B Extra Length          0000 (0)\n-0CC2D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+0CBE6 Compression Method    0008 (8) 'Deflated'\n+0CBE8 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+0CBEC CRC                   1BE163AC (467755948)\n+0CBF0 Compressed Size       00000476 (1142)\n+0CBF4 Uncompressed Size     00000967 (2407)\n+0CBF8 Filename Length       0084 (132)\n+0CBFA Extra Length          0000 (0)\n+0CBFC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             '\n #\n-# WARNING: Offset 0xCC2D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCBFC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-0CCB1 PAYLOAD\n+0CC80 PAYLOAD\n \n-0D127 LOCAL HEADER #256     04034B50 (67324752)\n-0D12B Extract Zip Spec      14 (20) '2.0'\n-0D12C Extract OS            00 (0) 'MS-DOS'\n-0D12D General Purpose Flag  0800 (2048)\n+0D0F6 LOCAL HEADER #256     04034B50 (67324752)\n+0D0FA Extract Zip Spec      14 (20) '2.0'\n+0D0FB Extract OS            00 (0) 'MS-DOS'\n+0D0FC General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-0D12F Compression Method    0008 (8) 'Deflated'\n-0D131 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-0D135 CRC                   11DB1110 (299569424)\n-0D139 Compressed Size       00000428 (1064)\n-0D13D Uncompressed Size     0000080F (2063)\n-0D141 Filename Length       007E (126)\n-0D143 Extra Length          0000 (0)\n-0D145 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+0D0FE Compression Method    0008 (8) 'Deflated'\n+0D100 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+0D104 CRC                   11DB1110 (299569424)\n+0D108 Compressed Size       00000428 (1064)\n+0D10C Uncompressed Size     0000080F (2063)\n+0D110 Filename Length       007E (126)\n+0D112 Extra Length          0000 (0)\n+0D114 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xD145: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xD114: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-0D1C3 PAYLOAD\n+0D192 PAYLOAD\n \n-0D5EB LOCAL HEADER #257     04034B50 (67324752)\n-0D5EF Extract Zip Spec      14 (20) '2.0'\n-0D5F0 Extract OS            00 (0) 'MS-DOS'\n-0D5F1 General Purpose Flag  0800 (2048)\n+0D5BA LOCAL HEADER #257     04034B50 (67324752)\n+0D5BE Extract Zip Spec      14 (20) '2.0'\n+0D5BF Extract OS            00 (0) 'MS-DOS'\n+0D5C0 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-0D5F3 Compression Method    0008 (8) 'Deflated'\n-0D5F5 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-0D5F9 CRC                   30A69673 (816223859)\n-0D5FD Compressed Size       000005CE (1486)\n-0D601 Uncompressed Size     00000C1C (3100)\n-0D605 Filename Length       007A (122)\n-0D607 Extra Length          0000 (0)\n-0D609 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+0D5C2 Compression Method    0008 (8) 'Deflated'\n+0D5C4 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+0D5C8 CRC                   30A69673 (816223859)\n+0D5CC Compressed Size       000005CE (1486)\n+0D5D0 Uncompressed Size     00000C1C (3100)\n+0D5D4 Filename Length       007A (122)\n+0D5D6 Extra Length          0000 (0)\n+0D5D8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xD609: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xD5D8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-0D683 PAYLOAD\n+0D652 PAYLOAD\n \n-0DC51 LOCAL HEADER #258     04034B50 (67324752)\n-0DC55 Extract Zip Spec      14 (20) '2.0'\n-0DC56 Extract OS            00 (0) 'MS-DOS'\n-0DC57 General Purpose Flag  0800 (2048)\n+0DC20 LOCAL HEADER #258     04034B50 (67324752)\n+0DC24 Extract Zip Spec      14 (20) '2.0'\n+0DC25 Extract OS            00 (0) 'MS-DOS'\n+0DC26 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-0DC59 Compression Method    0008 (8) 'Deflated'\n-0DC5B Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-0DC5F CRC                   0C316B32 (204565298)\n-0DC63 Compressed Size       000003A1 (929)\n-0DC67 Uncompressed Size     000006D7 (1751)\n-0DC6B Filename Length       0084 (132)\n-0DC6D Extra Length          0000 (0)\n-0DC6F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+0DC28 Compression Method    0008 (8) 'Deflated'\n+0DC2A Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+0DC2E CRC                   0C316B32 (204565298)\n+0DC32 Compressed Size       000003A1 (929)\n+0DC36 Uncompressed Size     000006D7 (1751)\n+0DC3A Filename Length       0084 (132)\n+0DC3C Extra Length          0000 (0)\n+0DC3E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             '\n #\n-# WARNING: Offset 0xDC6F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xDC3E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-0DCF3 PAYLOAD\n+0DCC2 PAYLOAD\n \n-0E094 LOCAL HEADER #259     04034B50 (67324752)\n-0E098 Extract Zip Spec      14 (20) '2.0'\n-0E099 Extract OS            00 (0) 'MS-DOS'\n-0E09A General Purpose Flag  0800 (2048)\n+0E063 LOCAL HEADER #259     04034B50 (67324752)\n+0E067 Extract Zip Spec      14 (20) '2.0'\n+0E068 Extract OS            00 (0) 'MS-DOS'\n+0E069 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-0E09C Compression Method    0008 (8) 'Deflated'\n-0E09E Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-0E0A2 CRC                   37BEEC96 (935259286)\n-0E0A6 Compressed Size       000006C9 (1737)\n-0E0AA Uncompressed Size     0000133B (4923)\n-0E0AE Filename Length       0080 (128)\n-0E0B0 Extra Length          0000 (0)\n-0E0B2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+0E06B Compression Method    0008 (8) 'Deflated'\n+0E06D Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+0E071 CRC                   37BEEC96 (935259286)\n+0E075 Compressed Size       000006C9 (1737)\n+0E079 Uncompressed Size     0000133B (4923)\n+0E07D Filename Length       0080 (128)\n+0E07F Extra Length          0000 (0)\n+0E081 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xE0B2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xE081: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-0E132 PAYLOAD\n+0E101 PAYLOAD\n \n-0E7FB LOCAL HEADER #260     04034B50 (67324752)\n-0E7FF Extract Zip Spec      14 (20) '2.0'\n-0E800 Extract OS            00 (0) 'MS-DOS'\n-0E801 General Purpose Flag  0800 (2048)\n+0E7CA LOCAL HEADER #260     04034B50 (67324752)\n+0E7CE Extract Zip Spec      14 (20) '2.0'\n+0E7CF Extract OS            00 (0) 'MS-DOS'\n+0E7D0 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-0E803 Compression Method    0008 (8) 'Deflated'\n-0E805 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-0E809 CRC                   D0AE7BE4 (3501095908)\n-0E80D Compressed Size       000003D9 (985)\n-0E811 Uncompressed Size     0000074C (1868)\n-0E815 Filename Length       0088 (136)\n-0E817 Extra Length          0000 (0)\n-0E819 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+0E7D2 Compression Method    0008 (8) 'Deflated'\n+0E7D4 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+0E7D8 CRC                   D0AE7BE4 (3501095908)\n+0E7DC Compressed Size       000003D9 (985)\n+0E7E0 Uncompressed Size     0000074C (1868)\n+0E7E4 Filename Length       0088 (136)\n+0E7E6 Extra Length          0000 (0)\n+0E7E8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXX'\n #\n-# WARNING: Offset 0xE819: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xE7E8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-0E8A1 PAYLOAD\n+0E870 PAYLOAD\n \n-0EC7A LOCAL HEADER #261     04034B50 (67324752)\n-0EC7E Extract Zip Spec      14 (20) '2.0'\n-0EC7F Extract OS            00 (0) 'MS-DOS'\n-0EC80 General Purpose Flag  0800 (2048)\n+0EC49 LOCAL HEADER #261     04034B50 (67324752)\n+0EC4D Extract Zip Spec      14 (20) '2.0'\n+0EC4E Extract OS            00 (0) 'MS-DOS'\n+0EC4F General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-0EC82 Compression Method    0008 (8) 'Deflated'\n-0EC84 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-0EC88 CRC                   4C134CE6 (1276333286)\n-0EC8C Compressed Size       000006D5 (1749)\n-0EC90 Uncompressed Size     0000103C (4156)\n-0EC94 Filename Length       0084 (132)\n-0EC96 Extra Length          0000 (0)\n-0EC98 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+0EC51 Compression Method    0008 (8) 'Deflated'\n+0EC53 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+0EC57 CRC                   4C134CE6 (1276333286)\n+0EC5B Compressed Size       000006D5 (1749)\n+0EC5F Uncompressed Size     0000103C (4156)\n+0EC63 Filename Length       0084 (132)\n+0EC65 Extra Length          0000 (0)\n+0EC67 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             '\n #\n-# WARNING: Offset 0xEC98: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEC67: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-0ED1C PAYLOAD\n+0ECEB PAYLOAD\n \n-0F3F1 LOCAL HEADER #262     04034B50 (67324752)\n-0F3F5 Extract Zip Spec      14 (20) '2.0'\n-0F3F6 Extract OS            00 (0) 'MS-DOS'\n-0F3F7 General Purpose Flag  0800 (2048)\n+0F3C0 LOCAL HEADER #262     04034B50 (67324752)\n+0F3C4 Extract Zip Spec      14 (20) '2.0'\n+0F3C5 Extract OS            00 (0) 'MS-DOS'\n+0F3C6 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-0F3F9 Compression Method    0008 (8) 'Deflated'\n-0F3FB Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-0F3FF CRC                   63086228 (1661493800)\n-0F403 Compressed Size       00000430 (1072)\n-0F407 Uncompressed Size     00000838 (2104)\n-0F40B Filename Length       0086 (134)\n-0F40D Extra Length          0000 (0)\n-0F40F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+0F3C8 Compression Method    0008 (8) 'Deflated'\n+0F3CA Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+0F3CE CRC                   63086228 (1661493800)\n+0F3D2 Compressed Size       00000430 (1072)\n+0F3D6 Uncompressed Size     00000838 (2104)\n+0F3DA Filename Length       0086 (134)\n+0F3DC Extra Length          0000 (0)\n+0F3DE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XX'\n #\n-# WARNING: Offset 0xF40F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF3DE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-0F495 PAYLOAD\n+0F464 PAYLOAD\n \n-0F8C5 LOCAL HEADER #263     04034B50 (67324752)\n-0F8C9 Extract Zip Spec      14 (20) '2.0'\n-0F8CA Extract OS            00 (0) 'MS-DOS'\n-0F8CB General Purpose Flag  0800 (2048)\n+0F894 LOCAL HEADER #263     04034B50 (67324752)\n+0F898 Extract Zip Spec      14 (20) '2.0'\n+0F899 Extract OS            00 (0) 'MS-DOS'\n+0F89A General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-0F8CD Compression Method    0008 (8) 'Deflated'\n-0F8CF Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-0F8D3 CRC                   9EF621C1 (2666930625)\n-0F8D7 Compressed Size       000005D9 (1497)\n-0F8DB Uncompressed Size     00000C90 (3216)\n-0F8DF Filename Length       0082 (130)\n-0F8E1 Extra Length          0000 (0)\n-0F8E3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+0F89C Compression Method    0008 (8) 'Deflated'\n+0F89E Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+0F8A2 CRC                   9EF621C1 (2666930625)\n+0F8A6 Compressed Size       000005D9 (1497)\n+0F8AA Uncompressed Size     00000C90 (3216)\n+0F8AE Filename Length       0082 (130)\n+0F8B0 Extra Length          0000 (0)\n+0F8B2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF8E3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF8B2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-0F965 PAYLOAD\n+0F934 PAYLOAD\n \n-0FF3E LOCAL HEADER #264     04034B50 (67324752)\n-0FF42 Extract Zip Spec      14 (20) '2.0'\n-0FF43 Extract OS            00 (0) 'MS-DOS'\n-0FF44 General Purpose Flag  0800 (2048)\n+0FF0D LOCAL HEADER #264     04034B50 (67324752)\n+0FF11 Extract Zip Spec      14 (20) '2.0'\n+0FF12 Extract OS            00 (0) 'MS-DOS'\n+0FF13 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-0FF46 Compression Method    0008 (8) 'Deflated'\n-0FF48 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-0FF4C CRC                   6BE0FFE8 (1809907688)\n-0FF50 Compressed Size       00000687 (1671)\n-0FF54 Uncompressed Size     00000EF6 (3830)\n-0FF58 Filename Length       006A (106)\n-0FF5A Extra Length          0000 (0)\n-0FF5C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+0FF15 Compression Method    0008 (8) 'Deflated'\n+0FF17 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+0FF1B CRC                   6BE0FFE8 (1809907688)\n+0FF1F Compressed Size       00000687 (1671)\n+0FF23 Uncompressed Size     00000EF6 (3830)\n+0FF27 Filename Length       006A (106)\n+0FF29 Extra Length          0000 (0)\n+0FF2B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xFF5C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xFF2B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-0FFC6 PAYLOAD\n+0FF95 PAYLOAD\n \n-1064D LOCAL HEADER #265     04034B50 (67324752)\n-10651 Extract Zip Spec      14 (20) '2.0'\n-10652 Extract OS            00 (0) 'MS-DOS'\n-10653 General Purpose Flag  0800 (2048)\n+1061C LOCAL HEADER #265     04034B50 (67324752)\n+10620 Extract Zip Spec      14 (20) '2.0'\n+10621 Extract OS            00 (0) 'MS-DOS'\n+10622 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-10655 Compression Method    0008 (8) 'Deflated'\n-10657 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-1065B CRC                   8743913D (2269352253)\n-1065F Compressed Size       000005DE (1502)\n-10663 Uncompressed Size     00000C44 (3140)\n-10667 Filename Length       006F (111)\n-10669 Extra Length          0000 (0)\n-1066B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+10624 Compression Method    0008 (8) 'Deflated'\n+10626 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+1062A CRC                   8743913D (2269352253)\n+1062E Compressed Size       000005DE (1502)\n+10632 Uncompressed Size     00000C44 (3140)\n+10636 Filename Length       006F (111)\n+10638 Extra Length          0000 (0)\n+1063A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1066B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1063A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-106DA PAYLOAD\n+106A9 PAYLOAD\n \n-10CB8 LOCAL HEADER #266     04034B50 (67324752)\n-10CBC Extract Zip Spec      14 (20) '2.0'\n-10CBD Extract OS            00 (0) 'MS-DOS'\n-10CBE General Purpose Flag  0800 (2048)\n+10C87 LOCAL HEADER #266     04034B50 (67324752)\n+10C8B Extract Zip Spec      14 (20) '2.0'\n+10C8C Extract OS            00 (0) 'MS-DOS'\n+10C8D General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-10CC0 Compression Method    0008 (8) 'Deflated'\n-10CC2 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-10CC6 CRC                   07A59EC9 (128294601)\n-10CCA Compressed Size       000004D1 (1233)\n-10CCE Uncompressed Size     00000C29 (3113)\n-10CD2 Filename Length       008A (138)\n-10CD4 Extra Length          0000 (0)\n-10CD6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+10C8F Compression Method    0008 (8) 'Deflated'\n+10C91 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+10C95 CRC                   07A59EC9 (128294601)\n+10C99 Compressed Size       000004D1 (1233)\n+10C9D Uncompressed Size     00000C29 (3113)\n+10CA1 Filename Length       008A (138)\n+10CA3 Extra Length          0000 (0)\n+10CA5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXX'\n #\n-# WARNING: Offset 0x10CD6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x10CA5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-10D60 PAYLOAD\n+10D2F PAYLOAD\n \n-11231 LOCAL HEADER #267     04034B50 (67324752)\n-11235 Extract Zip Spec      14 (20) '2.0'\n-11236 Extract OS            00 (0) 'MS-DOS'\n-11237 General Purpose Flag  0800 (2048)\n+11200 LOCAL HEADER #267     04034B50 (67324752)\n+11204 Extract Zip Spec      14 (20) '2.0'\n+11205 Extract OS            00 (0) 'MS-DOS'\n+11206 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-11239 Compression Method    0008 (8) 'Deflated'\n-1123B Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-1123F CRC                   63D24DDE (1674726878)\n-11243 Compressed Size       0000046A (1130)\n-11247 Uncompressed Size     00000E46 (3654)\n-1124B Filename Length       0084 (132)\n-1124D Extra Length          0000 (0)\n-1124F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+11208 Compression Method    0008 (8) 'Deflated'\n+1120A Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+1120E CRC                   63D24DDE (1674726878)\n+11212 Compressed Size       0000046A (1130)\n+11216 Uncompressed Size     00000E46 (3654)\n+1121A Filename Length       0084 (132)\n+1121C Extra Length          0000 (0)\n+1121E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             '\n #\n-# WARNING: Offset 0x1124F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1121E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-112D3 PAYLOAD\n+112A2 PAYLOAD\n \n-1173D LOCAL HEADER #268     04034B50 (67324752)\n-11741 Extract Zip Spec      14 (20) '2.0'\n-11742 Extract OS            00 (0) 'MS-DOS'\n-11743 General Purpose Flag  0800 (2048)\n+1170C LOCAL HEADER #268     04034B50 (67324752)\n+11710 Extract Zip Spec      14 (20) '2.0'\n+11711 Extract OS            00 (0) 'MS-DOS'\n+11712 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-11745 Compression Method    0008 (8) 'Deflated'\n-11747 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-1174B CRC                   2E17013D (773259581)\n-1174F Compressed Size       0000043F (1087)\n-11753 Uncompressed Size     00000888 (2184)\n-11757 Filename Length       008B (139)\n-11759 Extra Length          0000 (0)\n-1175B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+11714 Compression Method    0008 (8) 'Deflated'\n+11716 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+1171A CRC                   2E17013D (773259581)\n+1171E Compressed Size       0000043F (1087)\n+11722 Uncompressed Size     00000888 (2184)\n+11726 Filename Length       008B (139)\n+11728 Extra Length          0000 (0)\n+1172A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXXX'\n #\n-# WARNING: Offset 0x1175B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1172A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-117E6 PAYLOAD\n+117B5 PAYLOAD\n \n-11C25 LOCAL HEADER #269     04034B50 (67324752)\n-11C29 Extract Zip Spec      14 (20) '2.0'\n-11C2A Extract OS            00 (0) 'MS-DOS'\n-11C2B General Purpose Flag  0800 (2048)\n+11BF4 LOCAL HEADER #269     04034B50 (67324752)\n+11BF8 Extract Zip Spec      14 (20) '2.0'\n+11BF9 Extract OS            00 (0) 'MS-DOS'\n+11BFA General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-11C2D Compression Method    0008 (8) 'Deflated'\n-11C2F Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-11C33 CRC                   C1E5A225 (3253051941)\n-11C37 Compressed Size       000003A3 (931)\n-11C3B Uncompressed Size     0000070B (1803)\n-11C3F Filename Length       006D (109)\n-11C41 Extra Length          0000 (0)\n-11C43 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+11BFC Compression Method    0008 (8) 'Deflated'\n+11BFE Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+11C02 CRC                   C1E5A225 (3253051941)\n+11C06 Compressed Size       000003A3 (931)\n+11C0A Uncompressed Size     0000070B (1803)\n+11C0E Filename Length       006D (109)\n+11C10 Extra Length          0000 (0)\n+11C12 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x11C43: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x11C12: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-11CB0 PAYLOAD\n+11C7F PAYLOAD\n \n-12053 LOCAL HEADER #270     04034B50 (67324752)\n-12057 Extract Zip Spec      14 (20) '2.0'\n-12058 Extract OS            00 (0) 'MS-DOS'\n-12059 General Purpose Flag  0800 (2048)\n+12022 LOCAL HEADER #270     04034B50 (67324752)\n+12026 Extract Zip Spec      14 (20) '2.0'\n+12027 Extract OS            00 (0) 'MS-DOS'\n+12028 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1205B Compression Method    0008 (8) 'Deflated'\n-1205D Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-12061 CRC                   8950733E (2303750974)\n-12065 Compressed Size       00000350 (848)\n-12069 Uncompressed Size     0000064D (1613)\n-1206D Filename Length       006C (108)\n-1206F Extra Length          0000 (0)\n-12071 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+1202A Compression Method    0008 (8) 'Deflated'\n+1202C Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+12030 CRC                   8950733E (2303750974)\n+12034 Compressed Size       00000350 (848)\n+12038 Uncompressed Size     0000064D (1613)\n+1203C Filename Length       006C (108)\n+1203E Extra Length          0000 (0)\n+12040 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x12071: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x12040: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-120DD PAYLOAD\n+120AC PAYLOAD\n \n-1242D LOCAL HEADER #271     04034B50 (67324752)\n-12431 Extract Zip Spec      14 (20) '2.0'\n-12432 Extract OS            00 (0) 'MS-DOS'\n-12433 General Purpose Flag  0800 (2048)\n+123FC LOCAL HEADER #271     04034B50 (67324752)\n+12400 Extract Zip Spec      14 (20) '2.0'\n+12401 Extract OS            00 (0) 'MS-DOS'\n+12402 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-12435 Compression Method    0008 (8) 'Deflated'\n-12437 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-1243B CRC                   A0157ABE (2685762238)\n-1243F Compressed Size       0000034B (843)\n-12443 Uncompressed Size     00000643 (1603)\n-12447 Filename Length       006B (107)\n-12449 Extra Length          0000 (0)\n-1244B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+12404 Compression Method    0008 (8) 'Deflated'\n+12406 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+1240A CRC                   A0157ABE (2685762238)\n+1240E Compressed Size       0000034B (843)\n+12412 Uncompressed Size     00000643 (1603)\n+12416 Filename Length       006B (107)\n+12418 Extra Length          0000 (0)\n+1241A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1244B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1241A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-124B6 PAYLOAD\n+12485 PAYLOAD\n \n-12801 LOCAL HEADER #272     04034B50 (67324752)\n-12805 Extract Zip Spec      14 (20) '2.0'\n-12806 Extract OS            00 (0) 'MS-DOS'\n-12807 General Purpose Flag  0800 (2048)\n+127D0 LOCAL HEADER #272     04034B50 (67324752)\n+127D4 Extract Zip Spec      14 (20) '2.0'\n+127D5 Extract OS            00 (0) 'MS-DOS'\n+127D6 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-12809 Compression Method    0008 (8) 'Deflated'\n-1280B Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-1280F CRC                   164EC61D (374261277)\n-12813 Compressed Size       0000054E (1358)\n-12817 Uncompressed Size     00000B15 (2837)\n-1281B Filename Length       0091 (145)\n-1281D Extra Length          0000 (0)\n-1281F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+127D8 Compression Method    0008 (8) 'Deflated'\n+127DA Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+127DE CRC                   164EC61D (374261277)\n+127E2 Compressed Size       0000054E (1358)\n+127E6 Uncompressed Size     00000B15 (2837)\n+127EA Filename Length       0091 (145)\n+127EC Extra Length          0000 (0)\n+127EE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1281F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x127EE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-128B0 PAYLOAD\n+1287F PAYLOAD\n \n-12DFE LOCAL HEADER #273     04034B50 (67324752)\n-12E02 Extract Zip Spec      14 (20) '2.0'\n-12E03 Extract OS            00 (0) 'MS-DOS'\n-12E04 General Purpose Flag  0800 (2048)\n+12DCD LOCAL HEADER #273     04034B50 (67324752)\n+12DD1 Extract Zip Spec      14 (20) '2.0'\n+12DD2 Extract OS            00 (0) 'MS-DOS'\n+12DD3 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-12E06 Compression Method    0008 (8) 'Deflated'\n-12E08 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-12E0C CRC                   4F9A1C4F (1335499855)\n-12E10 Compressed Size       000003FB (1019)\n-12E14 Uncompressed Size     000009AF (2479)\n-12E18 Filename Length       0075 (117)\n-12E1A Extra Length          0000 (0)\n-12E1C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+12DD5 Compression Method    0008 (8) 'Deflated'\n+12DD7 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+12DDB CRC                   4F9A1C4F (1335499855)\n+12DDF Compressed Size       000003FB (1019)\n+12DE3 Uncompressed Size     000009AF (2479)\n+12DE7 Filename Length       0075 (117)\n+12DE9 Extra Length          0000 (0)\n+12DEB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x12E1C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x12DEB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-12E91 PAYLOAD\n+12E60 PAYLOAD\n \n-1328C LOCAL HEADER #274     04034B50 (67324752)\n-13290 Extract Zip Spec      14 (20) '2.0'\n-13291 Extract OS            00 (0) 'MS-DOS'\n-13292 General Purpose Flag  0800 (2048)\n+1325B LOCAL HEADER #274     04034B50 (67324752)\n+1325F Extract Zip Spec      14 (20) '2.0'\n+13260 Extract OS            00 (0) 'MS-DOS'\n+13261 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-13294 Compression Method    0008 (8) 'Deflated'\n-13296 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-1329A CRC                   754F4527 (1968129319)\n-1329E Compressed Size       00000573 (1395)\n-132A2 Uncompressed Size     00001265 (4709)\n-132A6 Filename Length       0082 (130)\n-132A8 Extra Length          0000 (0)\n-132AA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+13263 Compression Method    0008 (8) 'Deflated'\n+13265 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+13269 CRC                   754F4527 (1968129319)\n+1326D Compressed Size       00000573 (1395)\n+13271 Uncompressed Size     00001265 (4709)\n+13275 Filename Length       0082 (130)\n+13277 Extra Length          0000 (0)\n+13279 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x132AA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x13279: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-1332C PAYLOAD\n+132FB PAYLOAD\n \n-1389F LOCAL HEADER #275     04034B50 (67324752)\n-138A3 Extract Zip Spec      14 (20) '2.0'\n-138A4 Extract OS            00 (0) 'MS-DOS'\n-138A5 General Purpose Flag  0800 (2048)\n+1386E LOCAL HEADER #275     04034B50 (67324752)\n+13872 Extract Zip Spec      14 (20) '2.0'\n+13873 Extract OS            00 (0) 'MS-DOS'\n+13874 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-138A7 Compression Method    0008 (8) 'Deflated'\n-138A9 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-138AD CRC                   896578EC (2305128684)\n-138B1 Compressed Size       00000746 (1862)\n-138B5 Uncompressed Size     00001327 (4903)\n-138B9 Filename Length       0090 (144)\n-138BB Extra Length          0000 (0)\n-138BD Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+13876 Compression Method    0008 (8) 'Deflated'\n+13878 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+1387C CRC                   896578EC (2305128684)\n+13880 Compressed Size       00000746 (1862)\n+13884 Uncompressed Size     00001327 (4903)\n+13888 Filename Length       0090 (144)\n+1388A Extra Length          0000 (0)\n+1388C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x138BD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1388C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-1394D PAYLOAD\n+1391C PAYLOAD\n \n-14093 LOCAL HEADER #276     04034B50 (67324752)\n-14097 Extract Zip Spec      14 (20) '2.0'\n-14098 Extract OS            00 (0) 'MS-DOS'\n-14099 General Purpose Flag  0800 (2048)\n+14062 LOCAL HEADER #276     04034B50 (67324752)\n+14066 Extract Zip Spec      14 (20) '2.0'\n+14067 Extract OS            00 (0) 'MS-DOS'\n+14068 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1409B Compression Method    0008 (8) 'Deflated'\n-1409D Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-140A1 CRC                   64624734 (1684162356)\n-140A5 Compressed Size       0000063D (1597)\n-140A9 Uncompressed Size     00000D24 (3364)\n-140AD Filename Length       0097 (151)\n-140AF Extra Length          0000 (0)\n-140B1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+1406A Compression Method    0008 (8) 'Deflated'\n+1406C Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+14070 CRC                   64624734 (1684162356)\n+14074 Compressed Size       0000063D (1597)\n+14078 Uncompressed Size     00000D24 (3364)\n+1407C Filename Length       0097 (151)\n+1407E Extra Length          0000 (0)\n+14080 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x140B1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x14080: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-14148 PAYLOAD\n+14117 PAYLOAD\n \n-14785 LOCAL HEADER #277     04034B50 (67324752)\n-14789 Extract Zip Spec      14 (20) '2.0'\n-1478A Extract OS            00 (0) 'MS-DOS'\n-1478B General Purpose Flag  0800 (2048)\n+14754 LOCAL HEADER #277     04034B50 (67324752)\n+14758 Extract Zip Spec      14 (20) '2.0'\n+14759 Extract OS            00 (0) 'MS-DOS'\n+1475A General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1478D Compression Method    0008 (8) 'Deflated'\n-1478F Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-14793 CRC                   2B6EF697 (728692375)\n-14797 Compressed Size       00000444 (1092)\n-1479B Uncompressed Size     000008CD (2253)\n-1479F Filename Length       0093 (147)\n-147A1 Extra Length          0000 (0)\n-147A3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+1475C Compression Method    0008 (8) 'Deflated'\n+1475E Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+14762 CRC                   2B6EF697 (728692375)\n+14766 Compressed Size       00000444 (1092)\n+1476A Uncompressed Size     000008CD (2253)\n+1476E Filename Length       0093 (147)\n+14770 Extra Length          0000 (0)\n+14772 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x147A3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x14772: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-14836 PAYLOAD\n+14805 PAYLOAD\n \n-14C7A LOCAL HEADER #278     04034B50 (67324752)\n-14C7E Extract Zip Spec      14 (20) '2.0'\n-14C7F Extract OS            00 (0) 'MS-DOS'\n-14C80 General Purpose Flag  0800 (2048)\n+14C49 LOCAL HEADER #278     04034B50 (67324752)\n+14C4D Extract Zip Spec      14 (20) '2.0'\n+14C4E Extract OS            00 (0) 'MS-DOS'\n+14C4F General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-14C82 Compression Method    0008 (8) 'Deflated'\n-14C84 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-14C88 CRC                   DBC79151 (3687289169)\n-14C8C Compressed Size       00000874 (2164)\n-14C90 Uncompressed Size     000013B1 (5041)\n-14C94 Filename Length       0091 (145)\n-14C96 Extra Length          0000 (0)\n-14C98 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+14C51 Compression Method    0008 (8) 'Deflated'\n+14C53 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+14C57 CRC                   DBC79151 (3687289169)\n+14C5B Compressed Size       00000874 (2164)\n+14C5F Uncompressed Size     000013B1 (5041)\n+14C63 Filename Length       0091 (145)\n+14C65 Extra Length          0000 (0)\n+14C67 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x14C98: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x14C67: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-14D29 PAYLOAD\n+14CF8 PAYLOAD\n \n-1559D LOCAL HEADER #279     04034B50 (67324752)\n-155A1 Extract Zip Spec      14 (20) '2.0'\n-155A2 Extract OS            00 (0) 'MS-DOS'\n-155A3 General Purpose Flag  0800 (2048)\n+1556C LOCAL HEADER #279     04034B50 (67324752)\n+15570 Extract Zip Spec      14 (20) '2.0'\n+15571 Extract OS            00 (0) 'MS-DOS'\n+15572 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-155A5 Compression Method    0008 (8) 'Deflated'\n-155A7 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-155AB CRC                   9AFFB21B (2600448539)\n-155AF Compressed Size       0000033F (831)\n-155B3 Uncompressed Size     0000064E (1614)\n-155B7 Filename Length       0097 (151)\n-155B9 Extra Length          0000 (0)\n-155BB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+15574 Compression Method    0008 (8) 'Deflated'\n+15576 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+1557A CRC                   9AFFB21B (2600448539)\n+1557E Compressed Size       0000033F (831)\n+15582 Uncompressed Size     0000064E (1614)\n+15586 Filename Length       0097 (151)\n+15588 Extra Length          0000 (0)\n+1558A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x155BB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1558A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-15652 PAYLOAD\n+15621 PAYLOAD\n \n-15991 LOCAL HEADER #280     04034B50 (67324752)\n-15995 Extract Zip Spec      14 (20) '2.0'\n-15996 Extract OS            00 (0) 'MS-DOS'\n-15997 General Purpose Flag  0800 (2048)\n+15960 LOCAL HEADER #280     04034B50 (67324752)\n+15964 Extract Zip Spec      14 (20) '2.0'\n+15965 Extract OS            00 (0) 'MS-DOS'\n+15966 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-15999 Compression Method    0008 (8) 'Deflated'\n-1599B Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-1599F CRC                   88CF36AA (2295281322)\n-159A3 Compressed Size       000004BC (1212)\n-159A7 Uncompressed Size     00000A4F (2639)\n-159AB Filename Length       0093 (147)\n-159AD Extra Length          0000 (0)\n-159AF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+15968 Compression Method    0008 (8) 'Deflated'\n+1596A Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+1596E CRC                   88CF36AA (2295281322)\n+15972 Compressed Size       000004BC (1212)\n+15976 Uncompressed Size     00000A4F (2639)\n+1597A Filename Length       0093 (147)\n+1597C Extra Length          0000 (0)\n+1597E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x159AF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1597E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-15A42 PAYLOAD\n+15A11 PAYLOAD\n \n-15EFE LOCAL HEADER #281     04034B50 (67324752)\n-15F02 Extract Zip Spec      14 (20) '2.0'\n-15F03 Extract OS            00 (0) 'MS-DOS'\n-15F04 General Purpose Flag  0800 (2048)\n+15ECD LOCAL HEADER #281     04034B50 (67324752)\n+15ED1 Extract Zip Spec      14 (20) '2.0'\n+15ED2 Extract OS            00 (0) 'MS-DOS'\n+15ED3 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-15F06 Compression Method    0008 (8) 'Deflated'\n-15F08 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-15F0C CRC                   9593555C (2509460828)\n-15F10 Compressed Size       000005DA (1498)\n-15F14 Uncompressed Size     00000D05 (3333)\n-15F18 Filename Length       009C (156)\n-15F1A Extra Length          0000 (0)\n-15F1C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+15ED5 Compression Method    0008 (8) 'Deflated'\n+15ED7 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+15EDB CRC                   9593555C (2509460828)\n+15EDF Compressed Size       000005DA (1498)\n+15EE3 Uncompressed Size     00000D05 (3333)\n+15EE7 Filename Length       009C (156)\n+15EE9 Extra Length          0000 (0)\n+15EEB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x15F1C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x15EEB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-15FB8 PAYLOAD\n+15F87 PAYLOAD\n \n-16592 LOCAL HEADER #282     04034B50 (67324752)\n-16596 Extract Zip Spec      14 (20) '2.0'\n-16597 Extract OS            00 (0) 'MS-DOS'\n-16598 General Purpose Flag  0800 (2048)\n+16561 LOCAL HEADER #282     04034B50 (67324752)\n+16565 Extract Zip Spec      14 (20) '2.0'\n+16566 Extract OS            00 (0) 'MS-DOS'\n+16567 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1659A Compression Method    0008 (8) 'Deflated'\n-1659C Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-165A0 CRC                   9640338D (2520789901)\n-165A4 Compressed Size       00000785 (1925)\n-165A8 Uncompressed Size     000013DD (5085)\n-165AC Filename Length       0091 (145)\n-165AE Extra Length          0000 (0)\n-165B0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+16569 Compression Method    0008 (8) 'Deflated'\n+1656B Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+1656F CRC                   9640338D (2520789901)\n+16573 Compressed Size       00000785 (1925)\n+16577 Uncompressed Size     000013DD (5085)\n+1657B Filename Length       0091 (145)\n+1657D Extra Length          0000 (0)\n+1657F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x165B0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1657F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-16641 PAYLOAD\n+16610 PAYLOAD\n \n-16DC6 LOCAL HEADER #283     04034B50 (67324752)\n-16DCA Extract Zip Spec      14 (20) '2.0'\n-16DCB Extract OS            00 (0) 'MS-DOS'\n-16DCC General Purpose Flag  0800 (2048)\n+16D95 LOCAL HEADER #283     04034B50 (67324752)\n+16D99 Extract Zip Spec      14 (20) '2.0'\n+16D9A Extract OS            00 (0) 'MS-DOS'\n+16D9B General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-16DCE Compression Method    0008 (8) 'Deflated'\n-16DD0 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-16DD4 CRC                   5232B519 (1379054873)\n-16DD8 Compressed Size       000009AF (2479)\n-16DDC Uncompressed Size     00001C1F (7199)\n-16DE0 Filename Length       0093 (147)\n-16DE2 Extra Length          0000 (0)\n-16DE4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+16D9D Compression Method    0008 (8) 'Deflated'\n+16D9F Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+16DA3 CRC                   5232B519 (1379054873)\n+16DA7 Compressed Size       000009AF (2479)\n+16DAB Uncompressed Size     00001C1F (7199)\n+16DAF Filename Length       0093 (147)\n+16DB1 Extra Length          0000 (0)\n+16DB3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x16DE4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x16DB3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-16E77 PAYLOAD\n+16E46 PAYLOAD\n \n-17826 LOCAL HEADER #284     04034B50 (67324752)\n-1782A Extract Zip Spec      14 (20) '2.0'\n-1782B Extract OS            00 (0) 'MS-DOS'\n-1782C General Purpose Flag  0800 (2048)\n+177F5 LOCAL HEADER #284     04034B50 (67324752)\n+177F9 Extract Zip Spec      14 (20) '2.0'\n+177FA Extract OS            00 (0) 'MS-DOS'\n+177FB General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1782E Compression Method    0008 (8) 'Deflated'\n-17830 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-17834 CRC                   57267C45 (1462139973)\n-17838 Compressed Size       0000083D (2109)\n-1783C Uncompressed Size     000013D6 (5078)\n-17840 Filename Length       0090 (144)\n-17842 Extra Length          0000 (0)\n-17844 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+177FD Compression Method    0008 (8) 'Deflated'\n+177FF Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+17803 CRC                   57267C45 (1462139973)\n+17807 Compressed Size       0000083D (2109)\n+1780B Uncompressed Size     000013D6 (5078)\n+1780F Filename Length       0090 (144)\n+17811 Extra Length          0000 (0)\n+17813 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x17844: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x17813: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-178D4 PAYLOAD\n+178A3 PAYLOAD\n \n-18111 LOCAL HEADER #285     04034B50 (67324752)\n-18115 Extract Zip Spec      14 (20) '2.0'\n-18116 Extract OS            00 (0) 'MS-DOS'\n-18117 General Purpose Flag  0800 (2048)\n+180E0 LOCAL HEADER #285     04034B50 (67324752)\n+180E4 Extract Zip Spec      14 (20) '2.0'\n+180E5 Extract OS            00 (0) 'MS-DOS'\n+180E6 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-18119 Compression Method    0008 (8) 'Deflated'\n-1811B Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-1811F CRC                   333FC2BB (859816635)\n-18123 Compressed Size       00000395 (917)\n-18127 Uncompressed Size     00000736 (1846)\n-1812B Filename Length       0097 (151)\n-1812D Extra Length          0000 (0)\n-1812F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+180E8 Compression Method    0008 (8) 'Deflated'\n+180EA Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+180EE CRC                   333FC2BB (859816635)\n+180F2 Compressed Size       00000395 (917)\n+180F6 Uncompressed Size     00000736 (1846)\n+180FA Filename Length       0097 (151)\n+180FC Extra Length          0000 (0)\n+180FE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1812F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x180FE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-181C6 PAYLOAD\n+18195 PAYLOAD\n \n-1855B LOCAL HEADER #286     04034B50 (67324752)\n-1855F Extract Zip Spec      14 (20) '2.0'\n-18560 Extract OS            00 (0) 'MS-DOS'\n-18561 General Purpose Flag  0800 (2048)\n+1852A LOCAL HEADER #286     04034B50 (67324752)\n+1852E Extract Zip Spec      14 (20) '2.0'\n+1852F Extract OS            00 (0) 'MS-DOS'\n+18530 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-18563 Compression Method    0008 (8) 'Deflated'\n-18565 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-18569 CRC                   10CC5E74 (281828980)\n-1856D Compressed Size       000004BC (1212)\n-18571 Uncompressed Size     000009CD (2509)\n-18575 Filename Length       0070 (112)\n-18577 Extra Length          0000 (0)\n-18579 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+18532 Compression Method    0008 (8) 'Deflated'\n+18534 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+18538 CRC                   10CC5E74 (281828980)\n+1853C Compressed Size       000004BC (1212)\n+18540 Uncompressed Size     000009CD (2509)\n+18544 Filename Length       0070 (112)\n+18546 Extra Length          0000 (0)\n+18548 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x18579: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x18548: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-185E9 PAYLOAD\n+185B8 PAYLOAD\n \n-18AA5 LOCAL HEADER #287     04034B50 (67324752)\n-18AA9 Extract Zip Spec      14 (20) '2.0'\n-18AAA Extract OS            00 (0) 'MS-DOS'\n-18AAB General Purpose Flag  0800 (2048)\n+18A74 LOCAL HEADER #287     04034B50 (67324752)\n+18A78 Extract Zip Spec      14 (20) '2.0'\n+18A79 Extract OS            00 (0) 'MS-DOS'\n+18A7A General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-18AAD Compression Method    0008 (8) 'Deflated'\n-18AAF Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-18AB3 CRC                   5F6BF872 (1600911474)\n-18AB7 Compressed Size       000004BC (1212)\n-18ABB Uncompressed Size     000009A0 (2464)\n-18ABF Filename Length       0070 (112)\n-18AC1 Extra Length          0000 (0)\n-18AC3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+18A7C Compression Method    0008 (8) 'Deflated'\n+18A7E Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+18A82 CRC                   5F6BF872 (1600911474)\n+18A86 Compressed Size       000004BC (1212)\n+18A8A Uncompressed Size     000009A0 (2464)\n+18A8E Filename Length       0070 (112)\n+18A90 Extra Length          0000 (0)\n+18A92 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x18AC3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x18A92: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-18B33 PAYLOAD\n+18B02 PAYLOAD\n \n-18FEF LOCAL HEADER #288     04034B50 (67324752)\n-18FF3 Extract Zip Spec      14 (20) '2.0'\n-18FF4 Extract OS            00 (0) 'MS-DOS'\n-18FF5 General Purpose Flag  0800 (2048)\n+18FBE LOCAL HEADER #288     04034B50 (67324752)\n+18FC2 Extract Zip Spec      14 (20) '2.0'\n+18FC3 Extract OS            00 (0) 'MS-DOS'\n+18FC4 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-18FF7 Compression Method    0008 (8) 'Deflated'\n-18FF9 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-18FFD CRC                   456B0BC9 (1164643273)\n-19001 Compressed Size       000005BD (1469)\n-19005 Uncompressed Size     00001135 (4405)\n-19009 Filename Length       006C (108)\n-1900B Extra Length          0000 (0)\n-1900D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+18FC6 Compression Method    0008 (8) 'Deflated'\n+18FC8 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+18FCC CRC                   456B0BC9 (1164643273)\n+18FD0 Compressed Size       000005BD (1469)\n+18FD4 Uncompressed Size     00001135 (4405)\n+18FD8 Filename Length       006C (108)\n+18FDA Extra Length          0000 (0)\n+18FDC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1900D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x18FDC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-19079 PAYLOAD\n+19048 PAYLOAD\n \n-19636 LOCAL HEADER #289     04034B50 (67324752)\n-1963A Extract Zip Spec      14 (20) '2.0'\n-1963B Extract OS            00 (0) 'MS-DOS'\n-1963C General Purpose Flag  0800 (2048)\n+19605 LOCAL HEADER #289     04034B50 (67324752)\n+19609 Extract Zip Spec      14 (20) '2.0'\n+1960A Extract OS            00 (0) 'MS-DOS'\n+1960B General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1963E Compression Method    0008 (8) 'Deflated'\n-19640 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-19644 CRC                   6A45582D (1782929453)\n-19648 Compressed Size       000004E4 (1252)\n-1964C Uncompressed Size     000009E0 (2528)\n-19650 Filename Length       0075 (117)\n-19652 Extra Length          0000 (0)\n-19654 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+1960D Compression Method    0008 (8) 'Deflated'\n+1960F Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+19613 CRC                   6A45582D (1782929453)\n+19617 Compressed Size       000004E4 (1252)\n+1961B Uncompressed Size     000009E0 (2528)\n+1961F Filename Length       0075 (117)\n+19621 Extra Length          0000 (0)\n+19623 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x19654: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x19623: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-196C9 PAYLOAD\n+19698 PAYLOAD\n \n-19BAD LOCAL HEADER #290     04034B50 (67324752)\n-19BB1 Extract Zip Spec      14 (20) '2.0'\n-19BB2 Extract OS            00 (0) 'MS-DOS'\n-19BB3 General Purpose Flag  0800 (2048)\n+19B7C LOCAL HEADER #290     04034B50 (67324752)\n+19B80 Extract Zip Spec      14 (20) '2.0'\n+19B81 Extract OS            00 (0) 'MS-DOS'\n+19B82 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-19BB5 Compression Method    0008 (8) 'Deflated'\n-19BB7 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-19BBB CRC                   4731534C (1194414924)\n-19BBF Compressed Size       0000051E (1310)\n-19BC3 Uncompressed Size     00000B90 (2960)\n-19BC7 Filename Length       0077 (119)\n-19BC9 Extra Length          0000 (0)\n-19BCB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+19B84 Compression Method    0008 (8) 'Deflated'\n+19B86 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+19B8A CRC                   4731534C (1194414924)\n+19B8E Compressed Size       0000051E (1310)\n+19B92 Uncompressed Size     00000B90 (2960)\n+19B96 Filename Length       0077 (119)\n+19B98 Extra Length          0000 (0)\n+19B9A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x19BCB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x19B9A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-19C42 PAYLOAD\n+19C11 PAYLOAD\n \n-1A160 LOCAL HEADER #291     04034B50 (67324752)\n-1A164 Extract Zip Spec      14 (20) '2.0'\n-1A165 Extract OS            00 (0) 'MS-DOS'\n-1A166 General Purpose Flag  0800 (2048)\n+1A12F LOCAL HEADER #291     04034B50 (67324752)\n+1A133 Extract Zip Spec      14 (20) '2.0'\n+1A134 Extract OS            00 (0) 'MS-DOS'\n+1A135 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1A168 Compression Method    0008 (8) 'Deflated'\n-1A16A Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-1A16E CRC                   CEBA8B64 (3468331876)\n-1A172 Compressed Size       000004A0 (1184)\n-1A176 Uncompressed Size     00000A7D (2685)\n-1A17A Filename Length       0076 (118)\n-1A17C Extra Length          0000 (0)\n-1A17E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+1A137 Compression Method    0008 (8) 'Deflated'\n+1A139 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+1A13D CRC                   CEBA8B64 (3468331876)\n+1A141 Compressed Size       000004A0 (1184)\n+1A145 Uncompressed Size     00000A7D (2685)\n+1A149 Filename Length       0076 (118)\n+1A14B Extra Length          0000 (0)\n+1A14D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1A17E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1A14D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-1A1F4 PAYLOAD\n+1A1C3 PAYLOAD\n \n-1A694 LOCAL HEADER #292     04034B50 (67324752)\n-1A698 Extract Zip Spec      14 (20) '2.0'\n-1A699 Extract OS            00 (0) 'MS-DOS'\n-1A69A General Purpose Flag  0800 (2048)\n+1A663 LOCAL HEADER #292     04034B50 (67324752)\n+1A667 Extract Zip Spec      14 (20) '2.0'\n+1A668 Extract OS            00 (0) 'MS-DOS'\n+1A669 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1A69C Compression Method    0008 (8) 'Deflated'\n-1A69E Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-1A6A2 CRC                   0DACEA84 (229436036)\n-1A6A6 Compressed Size       000004B1 (1201)\n-1A6AA Uncompressed Size     00000A95 (2709)\n-1A6AE Filename Length       0075 (117)\n-1A6B0 Extra Length          0000 (0)\n-1A6B2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+1A66B Compression Method    0008 (8) 'Deflated'\n+1A66D Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+1A671 CRC                   0DACEA84 (229436036)\n+1A675 Compressed Size       000004B1 (1201)\n+1A679 Uncompressed Size     00000A95 (2709)\n+1A67D Filename Length       0075 (117)\n+1A67F Extra Length          0000 (0)\n+1A681 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1A6B2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1A681: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-1A727 PAYLOAD\n+1A6F6 PAYLOAD\n \n-1ABD8 LOCAL HEADER #293     04034B50 (67324752)\n-1ABDC Extract Zip Spec      14 (20) '2.0'\n-1ABDD Extract OS            00 (0) 'MS-DOS'\n-1ABDE General Purpose Flag  0800 (2048)\n+1ABA7 LOCAL HEADER #293     04034B50 (67324752)\n+1ABAB Extract Zip Spec      14 (20) '2.0'\n+1ABAC Extract OS            00 (0) 'MS-DOS'\n+1ABAD General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1ABE0 Compression Method    0008 (8) 'Deflated'\n-1ABE2 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-1ABE6 CRC                   2E84B239 (780448313)\n-1ABEA Compressed Size       000006DB (1755)\n-1ABEE Uncompressed Size     0000121D (4637)\n-1ABF2 Filename Length       0076 (118)\n-1ABF4 Extra Length          0000 (0)\n-1ABF6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+1ABAF Compression Method    0008 (8) 'Deflated'\n+1ABB1 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+1ABB5 CRC                   2E84B239 (780448313)\n+1ABB9 Compressed Size       000006DB (1755)\n+1ABBD Uncompressed Size     0000121D (4637)\n+1ABC1 Filename Length       0076 (118)\n+1ABC3 Extra Length          0000 (0)\n+1ABC5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1ABF6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1ABC5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-1AC6C PAYLOAD\n+1AC3B PAYLOAD\n \n-1B347 LOCAL HEADER #294     04034B50 (67324752)\n-1B34B Extract Zip Spec      14 (20) '2.0'\n-1B34C Extract OS            00 (0) 'MS-DOS'\n-1B34D General Purpose Flag  0800 (2048)\n+1B316 LOCAL HEADER #294     04034B50 (67324752)\n+1B31A Extract Zip Spec      14 (20) '2.0'\n+1B31B Extract OS            00 (0) 'MS-DOS'\n+1B31C General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1B34F Compression Method    0008 (8) 'Deflated'\n-1B351 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-1B355 CRC                   10E7267F (283584127)\n-1B359 Compressed Size       000003B1 (945)\n-1B35D Uncompressed Size     000006FB (1787)\n-1B361 Filename Length       0090 (144)\n-1B363 Extra Length          0000 (0)\n-1B365 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+1B31E Compression Method    0008 (8) 'Deflated'\n+1B320 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+1B324 CRC                   10E7267F (283584127)\n+1B328 Compressed Size       000003B1 (945)\n+1B32C Uncompressed Size     000006FB (1787)\n+1B330 Filename Length       0090 (144)\n+1B332 Extra Length          0000 (0)\n+1B334 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1B365: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1B334: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-1B3F5 PAYLOAD\n+1B3C4 PAYLOAD\n \n-1B7A6 LOCAL HEADER #295     04034B50 (67324752)\n-1B7AA Extract Zip Spec      14 (20) '2.0'\n-1B7AB Extract OS            00 (0) 'MS-DOS'\n-1B7AC General Purpose Flag  0800 (2048)\n+1B775 LOCAL HEADER #295     04034B50 (67324752)\n+1B779 Extract Zip Spec      14 (20) '2.0'\n+1B77A Extract OS            00 (0) 'MS-DOS'\n+1B77B General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1B7AE Compression Method    0008 (8) 'Deflated'\n-1B7B0 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-1B7B4 CRC                   24E47A3B (618953275)\n-1B7B8 Compressed Size       000003B4 (948)\n-1B7BC Uncompressed Size     000006FF (1791)\n-1B7C0 Filename Length       0091 (145)\n-1B7C2 Extra Length          0000 (0)\n-1B7C4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+1B77D Compression Method    0008 (8) 'Deflated'\n+1B77F Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+1B783 CRC                   24E47A3B (618953275)\n+1B787 Compressed Size       000003B4 (948)\n+1B78B Uncompressed Size     000006FF (1791)\n+1B78F Filename Length       0091 (145)\n+1B791 Extra Length          0000 (0)\n+1B793 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1B7C4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1B793: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-1B855 PAYLOAD\n+1B824 PAYLOAD\n \n-1BC09 LOCAL HEADER #296     04034B50 (67324752)\n-1BC0D Extract Zip Spec      14 (20) '2.0'\n-1BC0E Extract OS            00 (0) 'MS-DOS'\n-1BC0F General Purpose Flag  0800 (2048)\n+1BBD8 LOCAL HEADER #296     04034B50 (67324752)\n+1BBDC Extract Zip Spec      14 (20) '2.0'\n+1BBDD Extract OS            00 (0) 'MS-DOS'\n+1BBDE General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1BC11 Compression Method    0008 (8) 'Deflated'\n-1BC13 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-1BC17 CRC                   042BB565 (69973349)\n-1BC1B Compressed Size       000007C6 (1990)\n-1BC1F Uncompressed Size     00001364 (4964)\n-1BC23 Filename Length       008C (140)\n-1BC25 Extra Length          0000 (0)\n-1BC27 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+1BBE0 Compression Method    0008 (8) 'Deflated'\n+1BBE2 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+1BBE6 CRC                   042BB565 (69973349)\n+1BBEA Compressed Size       000007C6 (1990)\n+1BBEE Uncompressed Size     00001364 (4964)\n+1BBF2 Filename Length       008C (140)\n+1BBF4 Extra Length          0000 (0)\n+1BBF6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXXXX'\n #\n-# WARNING: Offset 0x1BC27: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1BBF6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-1BCB3 PAYLOAD\n+1BC82 PAYLOAD\n \n-1C479 LOCAL HEADER #297     04034B50 (67324752)\n-1C47D Extract Zip Spec      14 (20) '2.0'\n-1C47E Extract OS            00 (0) 'MS-DOS'\n-1C47F General Purpose Flag  0800 (2048)\n+1C448 LOCAL HEADER #297     04034B50 (67324752)\n+1C44C Extract Zip Spec      14 (20) '2.0'\n+1C44D Extract OS            00 (0) 'MS-DOS'\n+1C44E General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1C481 Compression Method    0008 (8) 'Deflated'\n-1C483 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-1C487 CRC                   7A63232B (2053317419)\n-1C48B Compressed Size       0000084C (2124)\n-1C48F Uncompressed Size     000013C0 (5056)\n-1C493 Filename Length       008D (141)\n-1C495 Extra Length          0000 (0)\n-1C497 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+1C450 Compression Method    0008 (8) 'Deflated'\n+1C452 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+1C456 CRC                   7A63232B (2053317419)\n+1C45A Compressed Size       0000084C (2124)\n+1C45E Uncompressed Size     000013C0 (5056)\n+1C462 Filename Length       008D (141)\n+1C464 Extra Length          0000 (0)\n+1C466 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXXXXX'\n #\n-# WARNING: Offset 0x1C497: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1C466: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-1C524 PAYLOAD\n+1C4F3 PAYLOAD\n \n-1CD70 LOCAL HEADER #298     04034B50 (67324752)\n-1CD74 Extract Zip Spec      14 (20) '2.0'\n-1CD75 Extract OS            00 (0) 'MS-DOS'\n-1CD76 General Purpose Flag  0800 (2048)\n+1CD3F LOCAL HEADER #298     04034B50 (67324752)\n+1CD43 Extract Zip Spec      14 (20) '2.0'\n+1CD44 Extract OS            00 (0) 'MS-DOS'\n+1CD45 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1CD78 Compression Method    0008 (8) 'Deflated'\n-1CD7A Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-1CD7E CRC                   19888393 (428376979)\n-1CD82 Compressed Size       000004B8 (1208)\n-1CD86 Uncompressed Size     0000092E (2350)\n-1CD8A Filename Length       0076 (118)\n-1CD8C Extra Length          0000 (0)\n-1CD8E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+1CD47 Compression Method    0008 (8) 'Deflated'\n+1CD49 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+1CD4D CRC                   19888393 (428376979)\n+1CD51 Compressed Size       000004B8 (1208)\n+1CD55 Uncompressed Size     0000092E (2350)\n+1CD59 Filename Length       0076 (118)\n+1CD5B Extra Length          0000 (0)\n+1CD5D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1CD8E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1CD5D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-1CE04 PAYLOAD\n+1CDD3 PAYLOAD\n \n-1D2BC LOCAL HEADER #299     04034B50 (67324752)\n-1D2C0 Extract Zip Spec      14 (20) '2.0'\n-1D2C1 Extract OS            00 (0) 'MS-DOS'\n-1D2C2 General Purpose Flag  0800 (2048)\n+1D28B LOCAL HEADER #299     04034B50 (67324752)\n+1D28F Extract Zip Spec      14 (20) '2.0'\n+1D290 Extract OS            00 (0) 'MS-DOS'\n+1D291 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1D2C4 Compression Method    0008 (8) 'Deflated'\n-1D2C6 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-1D2CA CRC                   8B1E3BB7 (2334014391)\n-1D2CE Compressed Size       00000B79 (2937)\n-1D2D2 Uncompressed Size     00002091 (8337)\n-1D2D6 Filename Length       007C (124)\n-1D2D8 Extra Length          0000 (0)\n-1D2DA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+1D293 Compression Method    0008 (8) 'Deflated'\n+1D295 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+1D299 CRC                   8B1E3BB7 (2334014391)\n+1D29D Compressed Size       00000B79 (2937)\n+1D2A1 Uncompressed Size     00002091 (8337)\n+1D2A5 Filename Length       007C (124)\n+1D2A7 Extra Length          0000 (0)\n+1D2A9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1D2DA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1D2A9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-1D356 PAYLOAD\n+1D325 PAYLOAD\n \n-1DECF LOCAL HEADER #300     04034B50 (67324752)\n-1DED3 Extract Zip Spec      14 (20) '2.0'\n-1DED4 Extract OS            00 (0) 'MS-DOS'\n-1DED5 General Purpose Flag  0800 (2048)\n+1DE9E LOCAL HEADER #300     04034B50 (67324752)\n+1DEA2 Extract Zip Spec      14 (20) '2.0'\n+1DEA3 Extract OS            00 (0) 'MS-DOS'\n+1DEA4 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1DED7 Compression Method    0008 (8) 'Deflated'\n-1DED9 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-1DEDD CRC                   0D142FFC (219426812)\n-1DEE1 Compressed Size       000009EA (2538)\n-1DEE5 Uncompressed Size     00001A7B (6779)\n-1DEE9 Filename Length       0091 (145)\n-1DEEB Extra Length          0000 (0)\n-1DEED Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+1DEA6 Compression Method    0008 (8) 'Deflated'\n+1DEA8 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+1DEAC CRC                   0D142FFC (219426812)\n+1DEB0 Compressed Size       000009EA (2538)\n+1DEB4 Uncompressed Size     00001A7B (6779)\n+1DEB8 Filename Length       0091 (145)\n+1DEBA Extra Length          0000 (0)\n+1DEBC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1DEED: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1DEBC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-1DF7E PAYLOAD\n+1DF4D PAYLOAD\n \n-1E968 LOCAL HEADER #301     04034B50 (67324752)\n-1E96C Extract Zip Spec      14 (20) '2.0'\n-1E96D Extract OS            00 (0) 'MS-DOS'\n-1E96E General Purpose Flag  0800 (2048)\n+1E937 LOCAL HEADER #301     04034B50 (67324752)\n+1E93B Extract Zip Spec      14 (20) '2.0'\n+1E93C Extract OS            00 (0) 'MS-DOS'\n+1E93D General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1E970 Compression Method    0008 (8) 'Deflated'\n-1E972 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-1E976 CRC                   726CFBF2 (1919745010)\n-1E97A Compressed Size       00000434 (1076)\n-1E97E Uncompressed Size     00000886 (2182)\n-1E982 Filename Length       0097 (151)\n-1E984 Extra Length          0000 (0)\n-1E986 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+1E93F Compression Method    0008 (8) 'Deflated'\n+1E941 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+1E945 CRC                   726CFBF2 (1919745010)\n+1E949 Compressed Size       00000434 (1076)\n+1E94D Uncompressed Size     00000886 (2182)\n+1E951 Filename Length       0097 (151)\n+1E953 Extra Length          0000 (0)\n+1E955 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1E986: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1E955: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-1EA1D PAYLOAD\n+1E9EC PAYLOAD\n \n-1EE51 LOCAL HEADER #302     04034B50 (67324752)\n-1EE55 Extract Zip Spec      14 (20) '2.0'\n-1EE56 Extract OS            00 (0) 'MS-DOS'\n-1EE57 General Purpose Flag  0800 (2048)\n+1EE20 LOCAL HEADER #302     04034B50 (67324752)\n+1EE24 Extract Zip Spec      14 (20) '2.0'\n+1EE25 Extract OS            00 (0) 'MS-DOS'\n+1EE26 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1EE59 Compression Method    0008 (8) 'Deflated'\n-1EE5B Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-1EE5F CRC                   0124A640 (19179072)\n-1EE63 Compressed Size       0000070A (1802)\n-1EE67 Uncompressed Size     00001071 (4209)\n-1EE6B Filename Length       009E (158)\n-1EE6D Extra Length          0000 (0)\n-1EE6F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+1EE28 Compression Method    0008 (8) 'Deflated'\n+1EE2A Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+1EE2E CRC                   0124A640 (19179072)\n+1EE32 Compressed Size       0000070A (1802)\n+1EE36 Uncompressed Size     00001071 (4209)\n+1EE3A Filename Length       009E (158)\n+1EE3C Extra Length          0000 (0)\n+1EE3E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1EE6F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1EE3E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-1EF0D PAYLOAD\n+1EEDC PAYLOAD\n \n-1F617 LOCAL HEADER #303     04034B50 (67324752)\n-1F61B Extract Zip Spec      14 (20) '2.0'\n-1F61C Extract OS            00 (0) 'MS-DOS'\n-1F61D General Purpose Flag  0800 (2048)\n+1F5E6 LOCAL HEADER #303     04034B50 (67324752)\n+1F5EA Extract Zip Spec      14 (20) '2.0'\n+1F5EB Extract OS            00 (0) 'MS-DOS'\n+1F5EC General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1F61F Compression Method    0008 (8) 'Deflated'\n-1F621 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-1F625 CRC                   7E793C9C (2121874588)\n-1F629 Compressed Size       00000459 (1113)\n-1F62D Uncompressed Size     000008CC (2252)\n-1F631 Filename Length       009E (158)\n-1F633 Extra Length          0000 (0)\n-1F635 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+1F5EE Compression Method    0008 (8) 'Deflated'\n+1F5F0 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+1F5F4 CRC                   7E793C9C (2121874588)\n+1F5F8 Compressed Size       00000459 (1113)\n+1F5FC Uncompressed Size     000008CC (2252)\n+1F600 Filename Length       009E (158)\n+1F602 Extra Length          0000 (0)\n+1F604 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1F635: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1F604: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-1F6D3 PAYLOAD\n+1F6A2 PAYLOAD\n \n-1FB2C LOCAL HEADER #304     04034B50 (67324752)\n-1FB30 Extract Zip Spec      14 (20) '2.0'\n-1FB31 Extract OS            00 (0) 'MS-DOS'\n-1FB32 General Purpose Flag  0800 (2048)\n+1FAFB LOCAL HEADER #304     04034B50 (67324752)\n+1FAFF Extract Zip Spec      14 (20) '2.0'\n+1FB00 Extract OS            00 (0) 'MS-DOS'\n+1FB01 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1FB34 Compression Method    0008 (8) 'Deflated'\n-1FB36 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-1FB3A CRC                   4C048087 (1275363463)\n-1FB3E Compressed Size       00000445 (1093)\n-1FB42 Uncompressed Size     00000861 (2145)\n-1FB46 Filename Length       0073 (115)\n-1FB48 Extra Length          0000 (0)\n-1FB4A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+1FB03 Compression Method    0008 (8) 'Deflated'\n+1FB05 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+1FB09 CRC                   4C048087 (1275363463)\n+1FB0D Compressed Size       00000445 (1093)\n+1FB11 Uncompressed Size     00000861 (2145)\n+1FB15 Filename Length       0073 (115)\n+1FB17 Extra Length          0000 (0)\n+1FB19 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1FB4A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1FB19: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-1FBBD PAYLOAD\n+1FB8C PAYLOAD\n \n-20002 LOCAL HEADER #305     04034B50 (67324752)\n-20006 Extract Zip Spec      14 (20) '2.0'\n-20007 Extract OS            00 (0) 'MS-DOS'\n-20008 General Purpose Flag  0800 (2048)\n+1FFD1 LOCAL HEADER #305     04034B50 (67324752)\n+1FFD5 Extract Zip Spec      14 (20) '2.0'\n+1FFD6 Extract OS            00 (0) 'MS-DOS'\n+1FFD7 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-2000A Compression Method    0008 (8) 'Deflated'\n-2000C Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-20010 CRC                   877B2EE8 (2272997096)\n-20014 Compressed Size       00000AAF (2735)\n-20018 Uncompressed Size     0000215E (8542)\n-2001C Filename Length       0080 (128)\n-2001E Extra Length          0000 (0)\n-20020 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+1FFD9 Compression Method    0008 (8) 'Deflated'\n+1FFDB Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+1FFDF CRC                   877B2EE8 (2272997096)\n+1FFE3 Compressed Size       00000AAF (2735)\n+1FFE7 Uncompressed Size     0000215E (8542)\n+1FFEB Filename Length       0080 (128)\n+1FFED Extra Length          0000 (0)\n+1FFEF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x20020: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1FFEF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-200A0 PAYLOAD\n+2006F PAYLOAD\n \n-20B4F LOCAL HEADER #306     04034B50 (67324752)\n-20B53 Extract Zip Spec      14 (20) '2.0'\n-20B54 Extract OS            00 (0) 'MS-DOS'\n-20B55 General Purpose Flag  0800 (2048)\n+20B1E LOCAL HEADER #306     04034B50 (67324752)\n+20B22 Extract Zip Spec      14 (20) '2.0'\n+20B23 Extract OS            00 (0) 'MS-DOS'\n+20B24 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-20B57 Compression Method    0008 (8) 'Deflated'\n-20B59 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-20B5D CRC                   E43D22D5 (3829211861)\n-20B61 Compressed Size       00000806 (2054)\n-20B65 Uncompressed Size     0000147F (5247)\n-20B69 Filename Length       0084 (132)\n-20B6B Extra Length          0000 (0)\n-20B6D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+20B26 Compression Method    0008 (8) 'Deflated'\n+20B28 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+20B2C CRC                   E43D22D5 (3829211861)\n+20B30 Compressed Size       00000806 (2054)\n+20B34 Uncompressed Size     0000147F (5247)\n+20B38 Filename Length       0084 (132)\n+20B3A Extra Length          0000 (0)\n+20B3C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             '\n #\n-# WARNING: Offset 0x20B6D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x20B3C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-20BF1 PAYLOAD\n+20BC0 PAYLOAD\n \n-213F7 LOCAL HEADER #307     04034B50 (67324752)\n-213FB Extract Zip Spec      14 (20) '2.0'\n-213FC Extract OS            00 (0) 'MS-DOS'\n-213FD General Purpose Flag  0800 (2048)\n+213C6 LOCAL HEADER #307     04034B50 (67324752)\n+213CA Extract Zip Spec      14 (20) '2.0'\n+213CB Extract OS            00 (0) 'MS-DOS'\n+213CC General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-213FF Compression Method    0008 (8) 'Deflated'\n-21401 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-21405 CRC                   D765846F (3613754479)\n-21409 Compressed Size       0000069E (1694)\n-2140D Uncompressed Size     00001060 (4192)\n-21411 Filename Length       0076 (118)\n-21413 Extra Length          0000 (0)\n-21415 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+213CE Compression Method    0008 (8) 'Deflated'\n+213D0 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+213D4 CRC                   D765846F (3613754479)\n+213D8 Compressed Size       0000069E (1694)\n+213DC Uncompressed Size     00001060 (4192)\n+213E0 Filename Length       0076 (118)\n+213E2 Extra Length          0000 (0)\n+213E4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x21415: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x213E4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-2148B PAYLOAD\n+2145A PAYLOAD\n \n-21B29 LOCAL HEADER #308     04034B50 (67324752)\n-21B2D Extract Zip Spec      14 (20) '2.0'\n-21B2E Extract OS            00 (0) 'MS-DOS'\n-21B2F General Purpose Flag  0800 (2048)\n+21AF8 LOCAL HEADER #308     04034B50 (67324752)\n+21AFC Extract Zip Spec      14 (20) '2.0'\n+21AFD Extract OS            00 (0) 'MS-DOS'\n+21AFE General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-21B31 Compression Method    0008 (8) 'Deflated'\n-21B33 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-21B37 CRC                   57E394F3 (1474532595)\n-21B3B Compressed Size       000006F4 (1780)\n-21B3F Uncompressed Size     0000115C (4444)\n-21B43 Filename Length       0076 (118)\n-21B45 Extra Length          0000 (0)\n-21B47 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+21B00 Compression Method    0008 (8) 'Deflated'\n+21B02 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+21B06 CRC                   57E394F3 (1474532595)\n+21B0A Compressed Size       000006F4 (1780)\n+21B0E Uncompressed Size     0000115C (4444)\n+21B12 Filename Length       0076 (118)\n+21B14 Extra Length          0000 (0)\n+21B16 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x21B47: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x21B16: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-21BBD PAYLOAD\n+21B8C PAYLOAD\n \n-222B1 LOCAL HEADER #309     04034B50 (67324752)\n-222B5 Extract Zip Spec      14 (20) '2.0'\n-222B6 Extract OS            00 (0) 'MS-DOS'\n-222B7 General Purpose Flag  0800 (2048)\n+22280 LOCAL HEADER #309     04034B50 (67324752)\n+22284 Extract Zip Spec      14 (20) '2.0'\n+22285 Extract OS            00 (0) 'MS-DOS'\n+22286 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-222B9 Compression Method    0008 (8) 'Deflated'\n-222BB Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-222BF CRC                   990AFEE4 (2567634660)\n-222C3 Compressed Size       0000042B (1067)\n-222C7 Uncompressed Size     00000807 (2055)\n-222CB Filename Length       0074 (116)\n-222CD Extra Length          0000 (0)\n-222CF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+22288 Compression Method    0008 (8) 'Deflated'\n+2228A Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+2228E CRC                   990AFEE4 (2567634660)\n+22292 Compressed Size       0000042B (1067)\n+22296 Uncompressed Size     00000807 (2055)\n+2229A Filename Length       0074 (116)\n+2229C Extra Length          0000 (0)\n+2229E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x222CF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x2229E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-22343 PAYLOAD\n+22312 PAYLOAD\n \n-2276E LOCAL HEADER #310     04034B50 (67324752)\n-22772 Extract Zip Spec      14 (20) '2.0'\n-22773 Extract OS            00 (0) 'MS-DOS'\n-22774 General Purpose Flag  0800 (2048)\n+2273D LOCAL HEADER #310     04034B50 (67324752)\n+22741 Extract Zip Spec      14 (20) '2.0'\n+22742 Extract OS            00 (0) 'MS-DOS'\n+22743 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-22776 Compression Method    0008 (8) 'Deflated'\n-22778 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-2277C CRC                   F6367964 (4130765156)\n-22780 Compressed Size       0000164C (5708)\n-22784 Uncompressed Size     00005103 (20739)\n-22788 Filename Length       0086 (134)\n-2278A Extra Length          0000 (0)\n-2278C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+22745 Compression Method    0008 (8) 'Deflated'\n+22747 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+2274B CRC                   F6367964 (4130765156)\n+2274F Compressed Size       0000164C (5708)\n+22753 Uncompressed Size     00005103 (20739)\n+22757 Filename Length       0086 (134)\n+22759 Extra Length          0000 (0)\n+2275B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XX'\n #\n-# WARNING: Offset 0x2278C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x2275B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-22812 PAYLOAD\n+227E1 PAYLOAD\n \n-23E5E LOCAL HEADER #311     04034B50 (67324752)\n-23E62 Extract Zip Spec      14 (20) '2.0'\n-23E63 Extract OS            00 (0) 'MS-DOS'\n-23E64 General Purpose Flag  0800 (2048)\n+23E2D LOCAL HEADER #311     04034B50 (67324752)\n+23E31 Extract Zip Spec      14 (20) '2.0'\n+23E32 Extract OS            00 (0) 'MS-DOS'\n+23E33 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-23E66 Compression Method    0008 (8) 'Deflated'\n-23E68 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-23E6C CRC                   9EC902FD (2663973629)\n-23E70 Compressed Size       000010B5 (4277)\n-23E74 Uncompressed Size     00003DB9 (15801)\n-23E78 Filename Length       0080 (128)\n-23E7A Extra Length          0000 (0)\n-23E7C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+23E35 Compression Method    0008 (8) 'Deflated'\n+23E37 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+23E3B CRC                   9EC902FD (2663973629)\n+23E3F Compressed Size       000010B5 (4277)\n+23E43 Uncompressed Size     00003DB9 (15801)\n+23E47 Filename Length       0080 (128)\n+23E49 Extra Length          0000 (0)\n+23E4B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x23E7C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x23E4B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-23EFC PAYLOAD\n+23ECB PAYLOAD\n \n-24FB1 LOCAL HEADER #312     04034B50 (67324752)\n-24FB5 Extract Zip Spec      14 (20) '2.0'\n-24FB6 Extract OS            00 (0) 'MS-DOS'\n-24FB7 General Purpose Flag  0800 (2048)\n+24F80 LOCAL HEADER #312     04034B50 (67324752)\n+24F84 Extract Zip Spec      14 (20) '2.0'\n+24F85 Extract OS            00 (0) 'MS-DOS'\n+24F86 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-24FB9 Compression Method    0008 (8) 'Deflated'\n-24FBB Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-24FBF CRC                   AD150348 (2903835464)\n-24FC3 Compressed Size       0000189A (6298)\n-24FC7 Uncompressed Size     00009C3D (39997)\n-24FCB Filename Length       0086 (134)\n-24FCD Extra Length          0000 (0)\n-24FCF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+24F88 Compression Method    0008 (8) 'Deflated'\n+24F8A Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+24F8E CRC                   AD150348 (2903835464)\n+24F92 Compressed Size       0000189A (6298)\n+24F96 Uncompressed Size     00009C3D (39997)\n+24F9A Filename Length       0086 (134)\n+24F9C Extra Length          0000 (0)\n+24F9E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XX'\n #\n-# WARNING: Offset 0x24FCF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x24F9E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-25055 PAYLOAD\n+25024 PAYLOAD\n \n-268EF LOCAL HEADER #313     04034B50 (67324752)\n-268F3 Extract Zip Spec      14 (20) '2.0'\n-268F4 Extract OS            00 (0) 'MS-DOS'\n-268F5 General Purpose Flag  0800 (2048)\n+268BE LOCAL HEADER #313     04034B50 (67324752)\n+268C2 Extract Zip Spec      14 (20) '2.0'\n+268C3 Extract OS            00 (0) 'MS-DOS'\n+268C4 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-268F7 Compression Method    0008 (8) 'Deflated'\n-268F9 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-268FD CRC                   8BF94713 (2348369683)\n-26901 Compressed Size       00000C16 (3094)\n-26905 Uncompressed Size     00002C4C (11340)\n-26909 Filename Length       0080 (128)\n-2690B Extra Length          0000 (0)\n-2690D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+268C6 Compression Method    0008 (8) 'Deflated'\n+268C8 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+268CC CRC                   8BF94713 (2348369683)\n+268D0 Compressed Size       00000C16 (3094)\n+268D4 Uncompressed Size     00002C4C (11340)\n+268D8 Filename Length       0080 (128)\n+268DA Extra Length          0000 (0)\n+268DC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x2690D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x268DC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-2698D PAYLOAD\n+2695C PAYLOAD\n \n-275A3 LOCAL HEADER #314     04034B50 (67324752)\n-275A7 Extract Zip Spec      14 (20) '2.0'\n-275A8 Extract OS            00 (0) 'MS-DOS'\n-275A9 General Purpose Flag  0800 (2048)\n+27572 LOCAL HEADER #314     04034B50 (67324752)\n+27576 Extract Zip Spec      14 (20) '2.0'\n+27577 Extract OS            00 (0) 'MS-DOS'\n+27578 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-275AB Compression Method    0008 (8) 'Deflated'\n-275AD Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-275B1 CRC                   42E654D4 (1122391252)\n-275B5 Compressed Size       00000650 (1616)\n-275B9 Uncompressed Size     00000EFA (3834)\n-275BD Filename Length       0076 (118)\n-275BF Extra Length          0000 (0)\n-275C1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+2757A Compression Method    0008 (8) 'Deflated'\n+2757C Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+27580 CRC                   42E654D4 (1122391252)\n+27584 Compressed Size       00000650 (1616)\n+27588 Uncompressed Size     00000EFA (3834)\n+2758C Filename Length       0076 (118)\n+2758E Extra Length          0000 (0)\n+27590 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x275C1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x27590: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-27637 PAYLOAD\n+27606 PAYLOAD\n \n-27C87 LOCAL HEADER #315     04034B50 (67324752)\n-27C8B Extract Zip Spec      14 (20) '2.0'\n-27C8C Extract OS            00 (0) 'MS-DOS'\n-27C8D General Purpose Flag  0800 (2048)\n+27C56 LOCAL HEADER #315     04034B50 (67324752)\n+27C5A Extract Zip Spec      14 (20) '2.0'\n+27C5B Extract OS            00 (0) 'MS-DOS'\n+27C5C General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-27C8F Compression Method    0008 (8) 'Deflated'\n-27C91 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-27C95 CRC                   51B4F745 (1370814277)\n-27C99 Compressed Size       0000075A (1882)\n-27C9D Uncompressed Size     000016D7 (5847)\n-27CA1 Filename Length       007C (124)\n-27CA3 Extra Length          0000 (0)\n-27CA5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+27C5E Compression Method    0008 (8) 'Deflated'\n+27C60 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+27C64 CRC                   51B4F745 (1370814277)\n+27C68 Compressed Size       0000075A (1882)\n+27C6C Uncompressed Size     000016D7 (5847)\n+27C70 Filename Length       007C (124)\n+27C72 Extra Length          0000 (0)\n+27C74 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x27CA5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x27C74: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-27D21 PAYLOAD\n+27CF0 PAYLOAD\n \n-2847B LOCAL HEADER #316     04034B50 (67324752)\n-2847F Extract Zip Spec      14 (20) '2.0'\n-28480 Extract OS            00 (0) 'MS-DOS'\n-28481 General Purpose Flag  0800 (2048)\n+2844A LOCAL HEADER #316     04034B50 (67324752)\n+2844E Extract Zip Spec      14 (20) '2.0'\n+2844F Extract OS            00 (0) 'MS-DOS'\n+28450 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-28483 Compression Method    0008 (8) 'Deflated'\n-28485 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-28489 CRC                   357DA477 (897426551)\n-2848D Compressed Size       0000039F (927)\n-28491 Uncompressed Size     000006C6 (1734)\n-28495 Filename Length       0074 (116)\n-28497 Extra Length          0000 (0)\n-28499 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+28452 Compression Method    0008 (8) 'Deflated'\n+28454 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+28458 CRC                   357DA477 (897426551)\n+2845C Compressed Size       0000039F (927)\n+28460 Uncompressed Size     000006C6 (1734)\n+28464 Filename Length       0074 (116)\n+28466 Extra Length          0000 (0)\n+28468 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x28499: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x28468: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-2850D PAYLOAD\n+284DC PAYLOAD\n \n-288AC LOCAL HEADER #317     04034B50 (67324752)\n-288B0 Extract Zip Spec      14 (20) '2.0'\n-288B1 Extract OS            00 (0) 'MS-DOS'\n-288B2 General Purpose Flag  0800 (2048)\n+2887B LOCAL HEADER #317     04034B50 (67324752)\n+2887F Extract Zip Spec      14 (20) '2.0'\n+28880 Extract OS            00 (0) 'MS-DOS'\n+28881 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-288B4 Compression Method    0008 (8) 'Deflated'\n-288B6 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-288BA CRC                   F9CAC97B (4190816635)\n-288BE Compressed Size       000004CB (1227)\n-288C2 Uncompressed Size     000009BC (2492)\n-288C6 Filename Length       0071 (113)\n-288C8 Extra Length          0000 (0)\n-288CA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+28883 Compression Method    0008 (8) 'Deflated'\n+28885 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+28889 CRC                   F9CAC97B (4190816635)\n+2888D Compressed Size       000004CB (1227)\n+28891 Uncompressed Size     000009BC (2492)\n+28895 Filename Length       0071 (113)\n+28897 Extra Length          0000 (0)\n+28899 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x288CA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x28899: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-2893B PAYLOAD\n+2890A PAYLOAD\n \n-28E06 LOCAL HEADER #318     04034B50 (67324752)\n-28E0A Extract Zip Spec      14 (20) '2.0'\n-28E0B Extract OS            00 (0) 'MS-DOS'\n-28E0C General Purpose Flag  0800 (2048)\n+28DD5 LOCAL HEADER #318     04034B50 (67324752)\n+28DD9 Extract Zip Spec      14 (20) '2.0'\n+28DDA Extract OS            00 (0) 'MS-DOS'\n+28DDB General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-28E0E Compression Method    0008 (8) 'Deflated'\n-28E10 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-28E14 CRC                   9DEB8C8B (2649459851)\n-28E18 Compressed Size       000004E7 (1255)\n-28E1C Uncompressed Size     00000A07 (2567)\n-28E20 Filename Length       0077 (119)\n-28E22 Extra Length          0000 (0)\n-28E24 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+28DDD Compression Method    0008 (8) 'Deflated'\n+28DDF Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+28DE3 CRC                   9DEB8C8B (2649459851)\n+28DE7 Compressed Size       000004E7 (1255)\n+28DEB Uncompressed Size     00000A07 (2567)\n+28DEF Filename Length       0077 (119)\n+28DF1 Extra Length          0000 (0)\n+28DF3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x28E24: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x28DF3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-28E9B PAYLOAD\n+28E6A PAYLOAD\n \n-29382 LOCAL HEADER #319     04034B50 (67324752)\n-29386 Extract Zip Spec      14 (20) '2.0'\n-29387 Extract OS            00 (0) 'MS-DOS'\n-29388 General Purpose Flag  0800 (2048)\n+29351 LOCAL HEADER #319     04034B50 (67324752)\n+29355 Extract Zip Spec      14 (20) '2.0'\n+29356 Extract OS            00 (0) 'MS-DOS'\n+29357 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-2938A Compression Method    0008 (8) 'Deflated'\n-2938C Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-29390 CRC                   85B17459 (2242999385)\n-29394 Compressed Size       0000060E (1550)\n-29398 Uncompressed Size     00000DDE (3550)\n-2939C Filename Length       0071 (113)\n-2939E Extra Length          0000 (0)\n-293A0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+29359 Compression Method    0008 (8) 'Deflated'\n+2935B Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+2935F CRC                   85B17459 (2242999385)\n+29363 Compressed Size       0000060E (1550)\n+29367 Uncompressed Size     00000DDE (3550)\n+2936B Filename Length       0071 (113)\n+2936D Extra Length          0000 (0)\n+2936F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x293A0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x2936F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-29411 PAYLOAD\n+293E0 PAYLOAD\n \n-29A1F LOCAL HEADER #320     04034B50 (67324752)\n-29A23 Extract Zip Spec      14 (20) '2.0'\n-29A24 Extract OS            00 (0) 'MS-DOS'\n-29A25 General Purpose Flag  0800 (2048)\n+299EE LOCAL HEADER #320     04034B50 (67324752)\n+299F2 Extract Zip Spec      14 (20) '2.0'\n+299F3 Extract OS            00 (0) 'MS-DOS'\n+299F4 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-29A27 Compression Method    0008 (8) 'Deflated'\n-29A29 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-29A2D CRC                   9C229073 (2619510899)\n-29A31 Compressed Size       00000330 (816)\n-29A35 Uncompressed Size     000005CF (1487)\n-29A39 Filename Length       007C (124)\n-29A3B Extra Length          0000 (0)\n-29A3D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+299F6 Compression Method    0008 (8) 'Deflated'\n+299F8 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+299FC CRC                   9C229073 (2619510899)\n+29A00 Compressed Size       00000330 (816)\n+29A04 Uncompressed Size     000005CF (1487)\n+29A08 Filename Length       007C (124)\n+29A0A Extra Length          0000 (0)\n+29A0C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x29A3D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x29A0C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-29AB9 PAYLOAD\n+29A88 PAYLOAD\n \n-29DE9 LOCAL HEADER #321     04034B50 (67324752)\n-29DED Extract Zip Spec      14 (20) '2.0'\n-29DEE Extract OS            00 (0) 'MS-DOS'\n-29DEF General Purpose Flag  0800 (2048)\n+29DB8 LOCAL HEADER #321     04034B50 (67324752)\n+29DBC Extract Zip Spec      14 (20) '2.0'\n+29DBD Extract OS            00 (0) 'MS-DOS'\n+29DBE General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-29DF1 Compression Method    0008 (8) 'Deflated'\n-29DF3 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-29DF7 CRC                   A57691CD (2776011213)\n-29DFB Compressed Size       00000316 (790)\n-29DFF Uncompressed Size     000005C2 (1474)\n-29E03 Filename Length       007C (124)\n-29E05 Extra Length          0000 (0)\n-29E07 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+29DC0 Compression Method    0008 (8) 'Deflated'\n+29DC2 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+29DC6 CRC                   A57691CD (2776011213)\n+29DCA Compressed Size       00000316 (790)\n+29DCE Uncompressed Size     000005C2 (1474)\n+29DD2 Filename Length       007C (124)\n+29DD4 Extra Length          0000 (0)\n+29DD6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x29E07: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x29DD6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-29E83 PAYLOAD\n+29E52 PAYLOAD\n \n-2A199 LOCAL HEADER #322     04034B50 (67324752)\n-2A19D Extract Zip Spec      14 (20) '2.0'\n-2A19E Extract OS            00 (0) 'MS-DOS'\n-2A19F General Purpose Flag  0800 (2048)\n+2A168 LOCAL HEADER #322     04034B50 (67324752)\n+2A16C Extract Zip Spec      14 (20) '2.0'\n+2A16D Extract OS            00 (0) 'MS-DOS'\n+2A16E General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-2A1A1 Compression Method    0008 (8) 'Deflated'\n-2A1A3 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-2A1A7 CRC                   6CD31445 (1825772613)\n-2A1AB Compressed Size       000003CA (970)\n-2A1AF Uncompressed Size     0000073A (1850)\n-2A1B3 Filename Length       007B (123)\n-2A1B5 Extra Length          0000 (0)\n-2A1B7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+2A170 Compression Method    0008 (8) 'Deflated'\n+2A172 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+2A176 CRC                   6CD31445 (1825772613)\n+2A17A Compressed Size       000003CA (970)\n+2A17E Uncompressed Size     0000073A (1850)\n+2A182 Filename Length       007B (123)\n+2A184 Extra Length          0000 (0)\n+2A186 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x2A1B7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x2A186: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-2A232 PAYLOAD\n+2A201 PAYLOAD\n \n-2A5FC LOCAL HEADER #323     04034B50 (67324752)\n-2A600 Extract Zip Spec      14 (20) '2.0'\n-2A601 Extract OS            00 (0) 'MS-DOS'\n-2A602 General Purpose Flag  0800 (2048)\n+2A5CB LOCAL HEADER #323     04034B50 (67324752)\n+2A5CF Extract Zip Spec      14 (20) '2.0'\n+2A5D0 Extract OS            00 (0) 'MS-DOS'\n+2A5D1 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-2A604 Compression Method    0008 (8) 'Deflated'\n-2A606 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-2A60A CRC                   C97DF8D6 (3380476118)\n-2A60E Compressed Size       00000522 (1314)\n-2A612 Uncompressed Size     00000A92 (2706)\n-2A616 Filename Length       0079 (121)\n-2A618 Extra Length          0000 (0)\n-2A61A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+2A5D3 Compression Method    0008 (8) 'Deflated'\n+2A5D5 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+2A5D9 CRC                   C97DF8D6 (3380476118)\n+2A5DD Compressed Size       00000522 (1314)\n+2A5E1 Uncompressed Size     00000A92 (2706)\n+2A5E5 Filename Length       0079 (121)\n+2A5E7 Extra Length          0000 (0)\n+2A5E9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x2A61A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x2A5E9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-2A693 PAYLOAD\n+2A662 PAYLOAD\n \n-2ABB5 LOCAL HEADER #324     04034B50 (67324752)\n-2ABB9 Extract Zip Spec      14 (20) '2.0'\n-2ABBA Extract OS            00 (0) 'MS-DOS'\n-2ABBB General Purpose Flag  0800 (2048)\n+2AB84 LOCAL HEADER #324     04034B50 (67324752)\n+2AB88 Extract Zip Spec      14 (20) '2.0'\n+2AB89 Extract OS            00 (0) 'MS-DOS'\n+2AB8A General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-2ABBD Compression Method    0008 (8) 'Deflated'\n-2ABBF Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-2ABC3 CRC                   0B04A112 (184852754)\n-2ABC7 Compressed Size       000003C7 (967)\n-2ABCB Uncompressed Size     00000795 (1941)\n-2ABCF Filename Length       006E (110)\n-2ABD1 Extra Length          0000 (0)\n-2ABD3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+2AB8C Compression Method    0008 (8) 'Deflated'\n+2AB8E Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+2AB92 CRC                   0B04A112 (184852754)\n+2AB96 Compressed Size       000003C7 (967)\n+2AB9A Uncompressed Size     00000795 (1941)\n+2AB9E Filename Length       006E (110)\n+2ABA0 Extra Length          0000 (0)\n+2ABA2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x2ABD3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x2ABA2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-2AC41 PAYLOAD\n+2AC10 PAYLOAD\n \n-2B008 LOCAL HEADER #325     04034B50 (67324752)\n-2B00C Extract Zip Spec      14 (20) '2.0'\n-2B00D Extract OS            00 (0) 'MS-DOS'\n-2B00E General Purpose Flag  0800 (2048)\n+2AFD7 LOCAL HEADER #325     04034B50 (67324752)\n+2AFDB Extract Zip Spec      14 (20) '2.0'\n+2AFDC Extract OS            00 (0) 'MS-DOS'\n+2AFDD General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-2B010 Compression Method    0008 (8) 'Deflated'\n-2B012 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-2B016 CRC                   9A51A289 (2589041289)\n-2B01A Compressed Size       00000425 (1061)\n-2B01E Uncompressed Size     000008AB (2219)\n-2B022 Filename Length       0082 (130)\n-2B024 Extra Length          0000 (0)\n-2B026 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+2AFDF Compression Method    0008 (8) 'Deflated'\n+2AFE1 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+2AFE5 CRC                   9A51A289 (2589041289)\n+2AFE9 Compressed Size       00000425 (1061)\n+2AFED Uncompressed Size     000008AB (2219)\n+2AFF1 Filename Length       0082 (130)\n+2AFF3 Extra Length          0000 (0)\n+2AFF5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x2B026: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x2AFF5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-2B0A8 PAYLOAD\n+2B077 PAYLOAD\n \n-2B4CD LOCAL HEADER #326     04034B50 (67324752)\n-2B4D1 Extract Zip Spec      14 (20) '2.0'\n-2B4D2 Extract OS            00 (0) 'MS-DOS'\n-2B4D3 General Purpose Flag  0800 (2048)\n+2B49C LOCAL HEADER #326     04034B50 (67324752)\n+2B4A0 Extract Zip Spec      14 (20) '2.0'\n+2B4A1 Extract OS            00 (0) 'MS-DOS'\n+2B4A2 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-2B4D5 Compression Method    0008 (8) 'Deflated'\n-2B4D7 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-2B4DB CRC                   BEAE3D9C (3199090076)\n-2B4DF Compressed Size       0000127D (4733)\n-2B4E3 Uncompressed Size     0000396F (14703)\n-2B4E7 Filename Length       0063 (99)\n-2B4E9 Extra Length          0000 (0)\n-2B4EB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+2B4A4 Compression Method    0008 (8) 'Deflated'\n+2B4A6 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+2B4AA CRC                   BEAE3D9C (3199090076)\n+2B4AE Compressed Size       0000127D (4733)\n+2B4B2 Uncompressed Size     0000396F (14703)\n+2B4B6 Filename Length       0063 (99)\n+2B4B8 Extra Length          0000 (0)\n+2B4BA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x2B4EB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x2B4BA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-2B54E PAYLOAD\n+2B51D PAYLOAD\n \n-2C7CB LOCAL HEADER #327     04034B50 (67324752)\n-2C7CF Extract Zip Spec      14 (20) '2.0'\n-2C7D0 Extract OS            00 (0) 'MS-DOS'\n-2C7D1 General Purpose Flag  0800 (2048)\n+2C79A LOCAL HEADER #327     04034B50 (67324752)\n+2C79E Extract Zip Spec      14 (20) '2.0'\n+2C79F Extract OS            00 (0) 'MS-DOS'\n+2C7A0 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-2C7D3 Compression Method    0008 (8) 'Deflated'\n-2C7D5 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-2C7D9 CRC                   29D620BA (701898938)\n-2C7DD Compressed Size       00000BC2 (3010)\n-2C7E1 Uncompressed Size     00002421 (9249)\n-2C7E5 Filename Length       0080 (128)\n-2C7E7 Extra Length          0000 (0)\n-2C7E9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+2C7A2 Compression Method    0008 (8) 'Deflated'\n+2C7A4 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+2C7A8 CRC                   29D620BA (701898938)\n+2C7AC Compressed Size       00000BC2 (3010)\n+2C7B0 Uncompressed Size     00002421 (9249)\n+2C7B4 Filename Length       0080 (128)\n+2C7B6 Extra Length          0000 (0)\n+2C7B8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x2C7E9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x2C7B8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-2C869 PAYLOAD\n+2C838 PAYLOAD\n \n-2D42B LOCAL HEADER #328     04034B50 (67324752)\n-2D42F Extract Zip Spec      14 (20) '2.0'\n-2D430 Extract OS            00 (0) 'MS-DOS'\n-2D431 General Purpose Flag  0800 (2048)\n+2D3FA LOCAL HEADER #328     04034B50 (67324752)\n+2D3FE Extract Zip Spec      14 (20) '2.0'\n+2D3FF Extract OS            00 (0) 'MS-DOS'\n+2D400 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-2D433 Compression Method    0008 (8) 'Deflated'\n-2D435 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-2D439 CRC                   9ED7BE90 (2664939152)\n-2D43D Compressed Size       00001217 (4631)\n-2D441 Uncompressed Size     000036E7 (14055)\n-2D445 Filename Length       0079 (121)\n-2D447 Extra Length          0000 (0)\n-2D449 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+2D402 Compression Method    0008 (8) 'Deflated'\n+2D404 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+2D408 CRC                   9ED7BE90 (2664939152)\n+2D40C Compressed Size       00001217 (4631)\n+2D410 Uncompressed Size     000036E7 (14055)\n+2D414 Filename Length       0079 (121)\n+2D416 Extra Length          0000 (0)\n+2D418 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x2D449: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x2D418: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-2D4C2 PAYLOAD\n+2D491 PAYLOAD\n \n-2E6D9 LOCAL HEADER #329     04034B50 (67324752)\n-2E6DD Extract Zip Spec      14 (20) '2.0'\n-2E6DE Extract OS            00 (0) 'MS-DOS'\n-2E6DF General Purpose Flag  0800 (2048)\n+2E6A8 LOCAL HEADER #329     04034B50 (67324752)\n+2E6AC Extract Zip Spec      14 (20) '2.0'\n+2E6AD Extract OS            00 (0) 'MS-DOS'\n+2E6AE General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-2E6E1 Compression Method    0008 (8) 'Deflated'\n-2E6E3 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-2E6E7 CRC                   B51FDD91 (3038764433)\n-2E6EB Compressed Size       0000156C (5484)\n-2E6EF Uncompressed Size     00004792 (18322)\n-2E6F3 Filename Length       0079 (121)\n-2E6F5 Extra Length          0000 (0)\n-2E6F7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+2E6B0 Compression Method    0008 (8) 'Deflated'\n+2E6B2 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+2E6B6 CRC                   B51FDD91 (3038764433)\n+2E6BA Compressed Size       0000156C (5484)\n+2E6BE Uncompressed Size     00004792 (18322)\n+2E6C2 Filename Length       0079 (121)\n+2E6C4 Extra Length          0000 (0)\n+2E6C6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x2E6F7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x2E6C6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-2E770 PAYLOAD\n+2E73F PAYLOAD\n \n-2FCDC LOCAL HEADER #330     04034B50 (67324752)\n-2FCE0 Extract Zip Spec      14 (20) '2.0'\n-2FCE1 Extract OS            00 (0) 'MS-DOS'\n-2FCE2 General Purpose Flag  0800 (2048)\n+2FCAB LOCAL HEADER #330     04034B50 (67324752)\n+2FCAF Extract Zip Spec      14 (20) '2.0'\n+2FCB0 Extract OS            00 (0) 'MS-DOS'\n+2FCB1 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-2FCE4 Compression Method    0008 (8) 'Deflated'\n-2FCE6 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-2FCEA CRC                   27CFA48B (667919499)\n-2FCEE Compressed Size       000018CC (6348)\n-2FCF2 Uncompressed Size     00005DDC (24028)\n-2FCF6 Filename Length       007B (123)\n-2FCF8 Extra Length          0000 (0)\n-2FCFA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+2FCB3 Compression Method    0008 (8) 'Deflated'\n+2FCB5 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+2FCB9 CRC                   27CFA48B (667919499)\n+2FCBD Compressed Size       000018CC (6348)\n+2FCC1 Uncompressed Size     00005DDC (24028)\n+2FCC5 Filename Length       007B (123)\n+2FCC7 Extra Length          0000 (0)\n+2FCC9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x2FCFA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x2FCC9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-2FD75 PAYLOAD\n+2FD44 PAYLOAD\n \n-31641 LOCAL HEADER #331     04034B50 (67324752)\n-31645 Extract Zip Spec      14 (20) '2.0'\n-31646 Extract OS            00 (0) 'MS-DOS'\n-31647 General Purpose Flag  0800 (2048)\n+31610 LOCAL HEADER #331     04034B50 (67324752)\n+31614 Extract Zip Spec      14 (20) '2.0'\n+31615 Extract OS            00 (0) 'MS-DOS'\n+31616 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-31649 Compression Method    0008 (8) 'Deflated'\n-3164B Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-3164F CRC                   620AB78F (1644869519)\n-31653 Compressed Size       000012CF (4815)\n-31657 Uncompressed Size     00003B3A (15162)\n-3165B Filename Length       007F (127)\n-3165D Extra Length          0000 (0)\n-3165F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+31618 Compression Method    0008 (8) 'Deflated'\n+3161A Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+3161E CRC                   620AB78F (1644869519)\n+31622 Compressed Size       000012CF (4815)\n+31626 Uncompressed Size     00003B3A (15162)\n+3162A Filename Length       007F (127)\n+3162C Extra Length          0000 (0)\n+3162E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x3165F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x3162E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-316DE PAYLOAD\n+316AD PAYLOAD\n \n-329AD LOCAL HEADER #332     04034B50 (67324752)\n-329B1 Extract Zip Spec      14 (20) '2.0'\n-329B2 Extract OS            00 (0) 'MS-DOS'\n-329B3 General Purpose Flag  0800 (2048)\n+3297C LOCAL HEADER #332     04034B50 (67324752)\n+32980 Extract Zip Spec      14 (20) '2.0'\n+32981 Extract OS            00 (0) 'MS-DOS'\n+32982 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-329B5 Compression Method    0008 (8) 'Deflated'\n-329B7 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-329BB CRC                   937A07E6 (2474248166)\n-329BF Compressed Size       000013A9 (5033)\n-329C3 Uncompressed Size     00004869 (18537)\n-329C7 Filename Length       007F (127)\n-329C9 Extra Length          0000 (0)\n-329CB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+32984 Compression Method    0008 (8) 'Deflated'\n+32986 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+3298A CRC                   937A07E6 (2474248166)\n+3298E Compressed Size       000013A9 (5033)\n+32992 Uncompressed Size     00004869 (18537)\n+32996 Filename Length       007F (127)\n+32998 Extra Length          0000 (0)\n+3299A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x329CB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x3299A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-32A4A PAYLOAD\n+32A19 PAYLOAD\n \n-33DF3 LOCAL HEADER #333     04034B50 (67324752)\n-33DF7 Extract Zip Spec      14 (20) '2.0'\n-33DF8 Extract OS            00 (0) 'MS-DOS'\n-33DF9 General Purpose Flag  0800 (2048)\n+33DC2 LOCAL HEADER #333     04034B50 (67324752)\n+33DC6 Extract Zip Spec      14 (20) '2.0'\n+33DC7 Extract OS            00 (0) 'MS-DOS'\n+33DC8 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-33DFB Compression Method    0008 (8) 'Deflated'\n-33DFD Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-33E01 CRC                   53DFF1D7 (1407185367)\n-33E05 Compressed Size       00000442 (1090)\n-33E09 Uncompressed Size     00000ADF (2783)\n-33E0D Filename Length       0083 (131)\n-33E0F Extra Length          0000 (0)\n-33E11 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+33DCA Compression Method    0008 (8) 'Deflated'\n+33DCC Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+33DD0 CRC                   53DFF1D7 (1407185367)\n+33DD4 Compressed Size       00000442 (1090)\n+33DD8 Uncompressed Size     00000ADF (2783)\n+33DDC Filename Length       0083 (131)\n+33DDE Extra Length          0000 (0)\n+33DE0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x33E11: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x33DE0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-33E94 PAYLOAD\n+33E63 PAYLOAD\n \n-342D6 LOCAL HEADER #334     04034B50 (67324752)\n-342DA Extract Zip Spec      14 (20) '2.0'\n-342DB Extract OS            00 (0) 'MS-DOS'\n-342DC General Purpose Flag  0800 (2048)\n+342A5 LOCAL HEADER #334     04034B50 (67324752)\n+342A9 Extract Zip Spec      14 (20) '2.0'\n+342AA Extract OS            00 (0) 'MS-DOS'\n+342AB General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-342DE Compression Method    0008 (8) 'Deflated'\n-342E0 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-342E4 CRC                   6D3A5445 (1832539205)\n-342E8 Compressed Size       000003FF (1023)\n-342EC Uncompressed Size     00000939 (2361)\n-342F0 Filename Length       007F (127)\n-342F2 Extra Length          0000 (0)\n-342F4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+342AD Compression Method    0008 (8) 'Deflated'\n+342AF Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+342B3 CRC                   6D3A5445 (1832539205)\n+342B7 Compressed Size       000003FF (1023)\n+342BB Uncompressed Size     00000939 (2361)\n+342BF Filename Length       007F (127)\n+342C1 Extra Length          0000 (0)\n+342C3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x342F4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x342C3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-34373 PAYLOAD\n+34342 PAYLOAD\n \n-34772 LOCAL HEADER #335     04034B50 (67324752)\n-34776 Extract Zip Spec      14 (20) '2.0'\n-34777 Extract OS            00 (0) 'MS-DOS'\n-34778 General Purpose Flag  0800 (2048)\n+34741 LOCAL HEADER #335     04034B50 (67324752)\n+34745 Extract Zip Spec      14 (20) '2.0'\n+34746 Extract OS            00 (0) 'MS-DOS'\n+34747 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-3477A Compression Method    0008 (8) 'Deflated'\n-3477C Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-34780 CRC                   5C6B1924 (1550522660)\n-34784 Compressed Size       000005D8 (1496)\n-34788 Uncompressed Size     00000DDD (3549)\n-3478C Filename Length       008E (142)\n-3478E Extra Length          0000 (0)\n-34790 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+34749 Compression Method    0008 (8) 'Deflated'\n+3474B Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+3474F CRC                   5C6B1924 (1550522660)\n+34753 Compressed Size       000005D8 (1496)\n+34757 Uncompressed Size     00000DDD (3549)\n+3475B Filename Length       008E (142)\n+3475D Extra Length          0000 (0)\n+3475F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXXXXXX'\n #\n-# WARNING: Offset 0x34790: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x3475F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-3481E PAYLOAD\n+347ED PAYLOAD\n \n-34DF6 LOCAL HEADER #336     04034B50 (67324752)\n-34DFA Extract Zip Spec      14 (20) '2.0'\n-34DFB Extract OS            00 (0) 'MS-DOS'\n-34DFC General Purpose Flag  0800 (2048)\n+34DC5 LOCAL HEADER #336     04034B50 (67324752)\n+34DC9 Extract Zip Spec      14 (20) '2.0'\n+34DCA Extract OS            00 (0) 'MS-DOS'\n+34DCB General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-34DFE Compression Method    0008 (8) 'Deflated'\n-34E00 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-34E04 CRC                   C7DF88BB (3353315515)\n-34E08 Compressed Size       00001C38 (7224)\n-34E0C Uncompressed Size     00009335 (37685)\n-34E10 Filename Length       0079 (121)\n-34E12 Extra Length          0000 (0)\n-34E14 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+34DCD Compression Method    0008 (8) 'Deflated'\n+34DCF Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+34DD3 CRC                   C7DF88BB (3353315515)\n+34DD7 Compressed Size       00001C38 (7224)\n+34DDB Uncompressed Size     00009335 (37685)\n+34DDF Filename Length       0079 (121)\n+34DE1 Extra Length          0000 (0)\n+34DE3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x34E14: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x34DE3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-34E8D PAYLOAD\n+34E5C PAYLOAD\n \n-36AC5 LOCAL HEADER #337     04034B50 (67324752)\n-36AC9 Extract Zip Spec      14 (20) '2.0'\n-36ACA Extract OS            00 (0) 'MS-DOS'\n-36ACB General Purpose Flag  0800 (2048)\n+36A94 LOCAL HEADER #337     04034B50 (67324752)\n+36A98 Extract Zip Spec      14 (20) '2.0'\n+36A99 Extract OS            00 (0) 'MS-DOS'\n+36A9A General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-36ACD Compression Method    0008 (8) 'Deflated'\n-36ACF Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-36AD3 CRC                   217BBE0B (561757707)\n-36AD7 Compressed Size       00000651 (1617)\n-36ADB Uncompressed Size     00001BB1 (7089)\n-36ADF Filename Length       0082 (130)\n-36AE1 Extra Length          0000 (0)\n-36AE3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+36A9C Compression Method    0008 (8) 'Deflated'\n+36A9E Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+36AA2 CRC                   217BBE0B (561757707)\n+36AA6 Compressed Size       00000651 (1617)\n+36AAA Uncompressed Size     00001BB1 (7089)\n+36AAE Filename Length       0082 (130)\n+36AB0 Extra Length          0000 (0)\n+36AB2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x36AE3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x36AB2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-36B65 PAYLOAD\n+36B34 PAYLOAD\n \n-371B6 LOCAL HEADER #338     04034B50 (67324752)\n-371BA Extract Zip Spec      14 (20) '2.0'\n-371BB Extract OS            00 (0) 'MS-DOS'\n-371BC General Purpose Flag  0800 (2048)\n+37185 LOCAL HEADER #338     04034B50 (67324752)\n+37189 Extract Zip Spec      14 (20) '2.0'\n+3718A Extract OS            00 (0) 'MS-DOS'\n+3718B General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-371BE Compression Method    0008 (8) 'Deflated'\n-371C0 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-371C4 CRC                   CF72F6D0 (3480418000)\n-371C8 Compressed Size       00001400 (5120)\n-371CC Uncompressed Size     00004A6A (19050)\n-371D0 Filename Length       007F (127)\n-371D2 Extra Length          0000 (0)\n-371D4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+3718D Compression Method    0008 (8) 'Deflated'\n+3718F Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+37193 CRC                   CF72F6D0 (3480418000)\n+37197 Compressed Size       00001400 (5120)\n+3719B Uncompressed Size     00004A6A (19050)\n+3719F Filename Length       007F (127)\n+371A1 Extra Length          0000 (0)\n+371A3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x371D4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x371A3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-37253 PAYLOAD\n+37222 PAYLOAD\n \n-38653 LOCAL HEADER #339     04034B50 (67324752)\n-38657 Extract Zip Spec      14 (20) '2.0'\n-38658 Extract OS            00 (0) 'MS-DOS'\n-38659 General Purpose Flag  0800 (2048)\n+38622 LOCAL HEADER #339     04034B50 (67324752)\n+38626 Extract Zip Spec      14 (20) '2.0'\n+38627 Extract OS            00 (0) 'MS-DOS'\n+38628 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-3865B Compression Method    0008 (8) 'Deflated'\n-3865D Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-38661 CRC                   DCEFA272 (3706692210)\n-38665 Compressed Size       0000049C (1180)\n-38669 Uncompressed Size     000009D3 (2515)\n-3866D Filename Length       0082 (130)\n-3866F Extra Length          0000 (0)\n-38671 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+3862A Compression Method    0008 (8) 'Deflated'\n+3862C Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+38630 CRC                   DCEFA272 (3706692210)\n+38634 Compressed Size       0000049C (1180)\n+38638 Uncompressed Size     000009D3 (2515)\n+3863C Filename Length       0082 (130)\n+3863E Extra Length          0000 (0)\n+38640 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x38671: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x38640: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-386F3 PAYLOAD\n+386C2 PAYLOAD\n \n-38B8F LOCAL HEADER #340     04034B50 (67324752)\n-38B93 Extract Zip Spec      14 (20) '2.0'\n-38B94 Extract OS            00 (0) 'MS-DOS'\n-38B95 General Purpose Flag  0800 (2048)\n+38B5E LOCAL HEADER #340     04034B50 (67324752)\n+38B62 Extract Zip Spec      14 (20) '2.0'\n+38B63 Extract OS            00 (0) 'MS-DOS'\n+38B64 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-38B97 Compression Method    0008 (8) 'Deflated'\n-38B99 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-38B9D CRC                   26E963FE (652829694)\n-38BA1 Compressed Size       0000080C (2060)\n-38BA5 Uncompressed Size     00001276 (4726)\n-38BA9 Filename Length       0084 (132)\n-38BAB Extra Length          0000 (0)\n-38BAD Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+38B66 Compression Method    0008 (8) 'Deflated'\n+38B68 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+38B6C CRC                   26E963FE (652829694)\n+38B70 Compressed Size       0000080C (2060)\n+38B74 Uncompressed Size     00001276 (4726)\n+38B78 Filename Length       0084 (132)\n+38B7A Extra Length          0000 (0)\n+38B7C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             '\n #\n-# WARNING: Offset 0x38BAD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x38B7C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-38C31 PAYLOAD\n+38C00 PAYLOAD\n \n-3943D LOCAL HEADER #341     04034B50 (67324752)\n-39441 Extract Zip Spec      14 (20) '2.0'\n-39442 Extract OS            00 (0) 'MS-DOS'\n-39443 General Purpose Flag  0800 (2048)\n+3940C LOCAL HEADER #341     04034B50 (67324752)\n+39410 Extract Zip Spec      14 (20) '2.0'\n+39411 Extract OS            00 (0) 'MS-DOS'\n+39412 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-39445 Compression Method    0008 (8) 'Deflated'\n-39447 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-3944B CRC                   9B32EF54 (2603806548)\n-3944F Compressed Size       0000175B (5979)\n-39453 Uncompressed Size     000054C4 (21700)\n-39457 Filename Length       0077 (119)\n-39459 Extra Length          0000 (0)\n-3945B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+39414 Compression Method    0008 (8) 'Deflated'\n+39416 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+3941A CRC                   9B32EF54 (2603806548)\n+3941E Compressed Size       0000175B (5979)\n+39422 Uncompressed Size     000054C4 (21700)\n+39426 Filename Length       0077 (119)\n+39428 Extra Length          0000 (0)\n+3942A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x3945B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x3942A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-394D2 PAYLOAD\n+394A1 PAYLOAD\n \n-3AC2D LOCAL HEADER #342     04034B50 (67324752)\n-3AC31 Extract Zip Spec      14 (20) '2.0'\n-3AC32 Extract OS            00 (0) 'MS-DOS'\n-3AC33 General Purpose Flag  0800 (2048)\n+3ABFC LOCAL HEADER #342     04034B50 (67324752)\n+3AC00 Extract Zip Spec      14 (20) '2.0'\n+3AC01 Extract OS            00 (0) 'MS-DOS'\n+3AC02 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-3AC35 Compression Method    0008 (8) 'Deflated'\n-3AC37 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-3AC3B CRC                   4975042F (1232405551)\n-3AC3F Compressed Size       000009BF (2495)\n-3AC43 Uncompressed Size     00001B21 (6945)\n-3AC47 Filename Length       007E (126)\n-3AC49 Extra Length          0000 (0)\n-3AC4B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+3AC04 Compression Method    0008 (8) 'Deflated'\n+3AC06 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+3AC0A CRC                   4975042F (1232405551)\n+3AC0E Compressed Size       000009BF (2495)\n+3AC12 Uncompressed Size     00001B21 (6945)\n+3AC16 Filename Length       007E (126)\n+3AC18 Extra Length          0000 (0)\n+3AC1A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x3AC4B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x3AC1A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-3ACC9 PAYLOAD\n+3AC98 PAYLOAD\n \n-3B688 LOCAL HEADER #343     04034B50 (67324752)\n-3B68C Extract Zip Spec      14 (20) '2.0'\n-3B68D Extract OS            00 (0) 'MS-DOS'\n-3B68E General Purpose Flag  0800 (2048)\n+3B657 LOCAL HEADER #343     04034B50 (67324752)\n+3B65B Extract Zip Spec      14 (20) '2.0'\n+3B65C Extract OS            00 (0) 'MS-DOS'\n+3B65D General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-3B690 Compression Method    0008 (8) 'Deflated'\n-3B692 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-3B696 CRC                   27E12F4C (669069132)\n-3B69A Compressed Size       0000086D (2157)\n-3B69E Uncompressed Size     000014EA (5354)\n-3B6A2 Filename Length       0081 (129)\n-3B6A4 Extra Length          0000 (0)\n-3B6A6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+3B65F Compression Method    0008 (8) 'Deflated'\n+3B661 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+3B665 CRC                   27E12F4C (669069132)\n+3B669 Compressed Size       0000086D (2157)\n+3B66D Uncompressed Size     000014EA (5354)\n+3B671 Filename Length       0081 (129)\n+3B673 Extra Length          0000 (0)\n+3B675 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x3B6A6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x3B675: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-3B727 PAYLOAD\n+3B6F6 PAYLOAD\n \n-3BF94 LOCAL HEADER #344     04034B50 (67324752)\n-3BF98 Extract Zip Spec      14 (20) '2.0'\n-3BF99 Extract OS            00 (0) 'MS-DOS'\n-3BF9A General Purpose Flag  0800 (2048)\n+3BF63 LOCAL HEADER #344     04034B50 (67324752)\n+3BF67 Extract Zip Spec      14 (20) '2.0'\n+3BF68 Extract OS            00 (0) 'MS-DOS'\n+3BF69 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-3BF9C Compression Method    0008 (8) 'Deflated'\n-3BF9E Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-3BFA2 CRC                   3E8950DE (1049186526)\n-3BFA6 Compressed Size       0000120A (4618)\n-3BFAA Uncompressed Size     000036E0 (14048)\n-3BFAE Filename Length       0081 (129)\n-3BFB0 Extra Length          0000 (0)\n-3BFB2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+3BF6B Compression Method    0008 (8) 'Deflated'\n+3BF6D Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+3BF71 CRC                   3E8950DE (1049186526)\n+3BF75 Compressed Size       0000120A (4618)\n+3BF79 Uncompressed Size     000036E0 (14048)\n+3BF7D Filename Length       0081 (129)\n+3BF7F Extra Length          0000 (0)\n+3BF81 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x3BFB2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x3BF81: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-3C033 PAYLOAD\n+3C002 PAYLOAD\n \n-3D23D LOCAL HEADER #345     04034B50 (67324752)\n-3D241 Extract Zip Spec      14 (20) '2.0'\n-3D242 Extract OS            00 (0) 'MS-DOS'\n-3D243 General Purpose Flag  0800 (2048)\n+3D20C LOCAL HEADER #345     04034B50 (67324752)\n+3D210 Extract Zip Spec      14 (20) '2.0'\n+3D211 Extract OS            00 (0) 'MS-DOS'\n+3D212 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-3D245 Compression Method    0008 (8) 'Deflated'\n-3D247 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-3D24B CRC                   A9B3A4D7 (2847122647)\n-3D24F Compressed Size       00000A9A (2714)\n-3D253 Uncompressed Size     00002051 (8273)\n-3D257 Filename Length       0080 (128)\n-3D259 Extra Length          0000 (0)\n-3D25B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+3D214 Compression Method    0008 (8) 'Deflated'\n+3D216 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+3D21A CRC                   A9B3A4D7 (2847122647)\n+3D21E Compressed Size       00000A9A (2714)\n+3D222 Uncompressed Size     00002051 (8273)\n+3D226 Filename Length       0080 (128)\n+3D228 Extra Length          0000 (0)\n+3D22A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x3D25B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x3D22A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-3D2DB PAYLOAD\n+3D2AA PAYLOAD\n \n-3DD75 LOCAL HEADER #346     04034B50 (67324752)\n-3DD79 Extract Zip Spec      14 (20) '2.0'\n-3DD7A Extract OS            00 (0) 'MS-DOS'\n-3DD7B General Purpose Flag  0800 (2048)\n+3DD44 LOCAL HEADER #346     04034B50 (67324752)\n+3DD48 Extract Zip Spec      14 (20) '2.0'\n+3DD49 Extract OS            00 (0) 'MS-DOS'\n+3DD4A General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-3DD7D Compression Method    0008 (8) 'Deflated'\n-3DD7F Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-3DD83 CRC                   B12610E6 (2972061926)\n-3DD87 Compressed Size       00000441 (1089)\n-3DD8B Uncompressed Size     00000A5B (2651)\n-3DD8F Filename Length       0073 (115)\n-3DD91 Extra Length          0000 (0)\n-3DD93 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+3DD4C Compression Method    0008 (8) 'Deflated'\n+3DD4E Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+3DD52 CRC                   B12610E6 (2972061926)\n+3DD56 Compressed Size       00000441 (1089)\n+3DD5A Uncompressed Size     00000A5B (2651)\n+3DD5E Filename Length       0073 (115)\n+3DD60 Extra Length          0000 (0)\n+3DD62 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x3DD93: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x3DD62: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-3DE06 PAYLOAD\n+3DDD5 PAYLOAD\n \n-3E247 LOCAL HEADER #347     04034B50 (67324752)\n-3E24B Extract Zip Spec      14 (20) '2.0'\n-3E24C Extract OS            00 (0) 'MS-DOS'\n-3E24D General Purpose Flag  0800 (2048)\n+3E216 LOCAL HEADER #347     04034B50 (67324752)\n+3E21A Extract Zip Spec      14 (20) '2.0'\n+3E21B Extract OS            00 (0) 'MS-DOS'\n+3E21C General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-3E24F Compression Method    0008 (8) 'Deflated'\n-3E251 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-3E255 CRC                   041CE92B (69003563)\n-3E259 Compressed Size       0000046E (1134)\n-3E25D Uncompressed Size     00000B22 (2850)\n-3E261 Filename Length       008E (142)\n-3E263 Extra Length          0000 (0)\n-3E265 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+3E21E Compression Method    0008 (8) 'Deflated'\n+3E220 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+3E224 CRC                   041CE92B (69003563)\n+3E228 Compressed Size       0000046E (1134)\n+3E22C Uncompressed Size     00000B22 (2850)\n+3E230 Filename Length       008E (142)\n+3E232 Extra Length          0000 (0)\n+3E234 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXXXXXX'\n #\n-# WARNING: Offset 0x3E265: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x3E234: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-3E2F3 PAYLOAD\n+3E2C2 PAYLOAD\n \n-3E761 LOCAL HEADER #348     04034B50 (67324752)\n-3E765 Extract Zip Spec      14 (20) '2.0'\n-3E766 Extract OS            00 (0) 'MS-DOS'\n-3E767 General Purpose Flag  0800 (2048)\n+3E730 LOCAL HEADER #348     04034B50 (67324752)\n+3E734 Extract Zip Spec      14 (20) '2.0'\n+3E735 Extract OS            00 (0) 'MS-DOS'\n+3E736 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-3E769 Compression Method    0008 (8) 'Deflated'\n-3E76B Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-3E76F CRC                   16A4BA93 (379894419)\n-3E773 Compressed Size       000006D2 (1746)\n-3E777 Uncompressed Size     000016E4 (5860)\n-3E77B Filename Length       008D (141)\n-3E77D Extra Length          0000 (0)\n-3E77F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+3E738 Compression Method    0008 (8) 'Deflated'\n+3E73A Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+3E73E CRC                   16A4BA93 (379894419)\n+3E742 Compressed Size       000006D2 (1746)\n+3E746 Uncompressed Size     000016E4 (5860)\n+3E74A Filename Length       008D (141)\n+3E74C Extra Length          0000 (0)\n+3E74E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXXXXX'\n #\n-# WARNING: Offset 0x3E77F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x3E74E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-3E80C PAYLOAD\n+3E7DB PAYLOAD\n \n-3EEDE LOCAL HEADER #349     04034B50 (67324752)\n-3EEE2 Extract Zip Spec      14 (20) '2.0'\n-3EEE3 Extract OS            00 (0) 'MS-DOS'\n-3EEE4 General Purpose Flag  0800 (2048)\n+3EEAD LOCAL HEADER #349     04034B50 (67324752)\n+3EEB1 Extract Zip Spec      14 (20) '2.0'\n+3EEB2 Extract OS            00 (0) 'MS-DOS'\n+3EEB3 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-3EEE6 Compression Method    0008 (8) 'Deflated'\n-3EEE8 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-3EEEC CRC                   390AB403 (957002755)\n-3EEF0 Compressed Size       000005D3 (1491)\n-3EEF4 Uncompressed Size     00001068 (4200)\n-3EEF8 Filename Length       0090 (144)\n-3EEFA Extra Length          0000 (0)\n-3EEFC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+3EEB5 Compression Method    0008 (8) 'Deflated'\n+3EEB7 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+3EEBB CRC                   390AB403 (957002755)\n+3EEBF Compressed Size       000005D3 (1491)\n+3EEC3 Uncompressed Size     00001068 (4200)\n+3EEC7 Filename Length       0090 (144)\n+3EEC9 Extra Length          0000 (0)\n+3EECB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x3EEFC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x3EECB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-3EF8C PAYLOAD\n+3EF5B PAYLOAD\n \n-3F55F LOCAL HEADER #350     04034B50 (67324752)\n-3F563 Extract Zip Spec      14 (20) '2.0'\n-3F564 Extract OS            00 (0) 'MS-DOS'\n-3F565 General Purpose Flag  0800 (2048)\n+3F52E LOCAL HEADER #350     04034B50 (67324752)\n+3F532 Extract Zip Spec      14 (20) '2.0'\n+3F533 Extract OS            00 (0) 'MS-DOS'\n+3F534 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-3F567 Compression Method    0008 (8) 'Deflated'\n-3F569 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-3F56D CRC                   3DE98548 (1038714184)\n-3F571 Compressed Size       0000064F (1615)\n-3F575 Uncompressed Size     000016AA (5802)\n-3F579 Filename Length       008C (140)\n-3F57B Extra Length          0000 (0)\n-3F57D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+3F536 Compression Method    0008 (8) 'Deflated'\n+3F538 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+3F53C CRC                   3DE98548 (1038714184)\n+3F540 Compressed Size       0000064F (1615)\n+3F544 Uncompressed Size     000016AA (5802)\n+3F548 Filename Length       008C (140)\n+3F54A Extra Length          0000 (0)\n+3F54C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXXXX'\n #\n-# WARNING: Offset 0x3F57D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x3F54C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-3F609 PAYLOAD\n+3F5D8 PAYLOAD\n \n-3FC58 LOCAL HEADER #351     04034B50 (67324752)\n-3FC5C Extract Zip Spec      14 (20) '2.0'\n-3FC5D Extract OS            00 (0) 'MS-DOS'\n-3FC5E General Purpose Flag  0800 (2048)\n+3FC27 LOCAL HEADER #351     04034B50 (67324752)\n+3FC2B Extract Zip Spec      14 (20) '2.0'\n+3FC2C Extract OS            00 (0) 'MS-DOS'\n+3FC2D General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-3FC60 Compression Method    0008 (8) 'Deflated'\n-3FC62 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-3FC66 CRC                   561A3BB2 (1444559794)\n-3FC6A Compressed Size       000009BA (2490)\n-3FC6E Uncompressed Size     000018A8 (6312)\n-3FC72 Filename Length       0071 (113)\n-3FC74 Extra Length          0000 (0)\n-3FC76 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+3FC2F Compression Method    0008 (8) 'Deflated'\n+3FC31 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+3FC35 CRC                   561A3BB2 (1444559794)\n+3FC39 Compressed Size       000009BA (2490)\n+3FC3D Uncompressed Size     000018A8 (6312)\n+3FC41 Filename Length       0071 (113)\n+3FC43 Extra Length          0000 (0)\n+3FC45 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x3FC76: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x3FC45: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-3FCE7 PAYLOAD\n+3FCB6 PAYLOAD\n \n-406A1 LOCAL HEADER #352     04034B50 (67324752)\n-406A5 Extract Zip Spec      14 (20) '2.0'\n-406A6 Extract OS            00 (0) 'MS-DOS'\n-406A7 General Purpose Flag  0800 (2048)\n+40670 LOCAL HEADER #352     04034B50 (67324752)\n+40674 Extract Zip Spec      14 (20) '2.0'\n+40675 Extract OS            00 (0) 'MS-DOS'\n+40676 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-406A9 Compression Method    0008 (8) 'Deflated'\n-406AB Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-406AF CRC                   A1D18B9C (2714864540)\n-406B3 Compressed Size       00000A70 (2672)\n-406B7 Uncompressed Size     00001AC2 (6850)\n-406BB Filename Length       0070 (112)\n-406BD Extra Length          0000 (0)\n-406BF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+40678 Compression Method    0008 (8) 'Deflated'\n+4067A Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+4067E CRC                   A1D18B9C (2714864540)\n+40682 Compressed Size       00000A70 (2672)\n+40686 Uncompressed Size     00001AC2 (6850)\n+4068A Filename Length       0070 (112)\n+4068C Extra Length          0000 (0)\n+4068E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x406BF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x4068E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-4072F PAYLOAD\n+406FE PAYLOAD\n \n-4119F LOCAL HEADER #353     04034B50 (67324752)\n-411A3 Extract Zip Spec      14 (20) '2.0'\n-411A4 Extract OS            00 (0) 'MS-DOS'\n-411A5 General Purpose Flag  0800 (2048)\n+4116E LOCAL HEADER #353     04034B50 (67324752)\n+41172 Extract Zip Spec      14 (20) '2.0'\n+41173 Extract OS            00 (0) 'MS-DOS'\n+41174 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-411A7 Compression Method    0008 (8) 'Deflated'\n-411A9 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-411AD CRC                   33231FD5 (857939925)\n-411B1 Compressed Size       0000082D (2093)\n-411B5 Uncompressed Size     00001399 (5017)\n-411B9 Filename Length       0071 (113)\n-411BB Extra Length          0000 (0)\n-411BD Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+41176 Compression Method    0008 (8) 'Deflated'\n+41178 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+4117C CRC                   33231FD5 (857939925)\n+41180 Compressed Size       0000082D (2093)\n+41184 Uncompressed Size     00001399 (5017)\n+41188 Filename Length       0071 (113)\n+4118A Extra Length          0000 (0)\n+4118C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x411BD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x4118C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-4122E PAYLOAD\n+411FD PAYLOAD\n \n-41A5B LOCAL HEADER #354     04034B50 (67324752)\n-41A5F Extract Zip Spec      14 (20) '2.0'\n-41A60 Extract OS            00 (0) 'MS-DOS'\n-41A61 General Purpose Flag  0800 (2048)\n+41A2A LOCAL HEADER #354     04034B50 (67324752)\n+41A2E Extract Zip Spec      14 (20) '2.0'\n+41A2F Extract OS            00 (0) 'MS-DOS'\n+41A30 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-41A63 Compression Method    0008 (8) 'Deflated'\n-41A65 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-41A69 CRC                   63C353AF (1673745327)\n-41A6D Compressed Size       000005DA (1498)\n-41A71 Uncompressed Size     00000CF8 (3320)\n-41A75 Filename Length       006A (106)\n-41A77 Extra Length          0000 (0)\n-41A79 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+41A32 Compression Method    0008 (8) 'Deflated'\n+41A34 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+41A38 CRC                   63C353AF (1673745327)\n+41A3C Compressed Size       000005DA (1498)\n+41A40 Uncompressed Size     00000CF8 (3320)\n+41A44 Filename Length       006A (106)\n+41A46 Extra Length          0000 (0)\n+41A48 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x41A79: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x41A48: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-41AE3 PAYLOAD\n+41AB2 PAYLOAD\n \n-420BD LOCAL HEADER #355     04034B50 (67324752)\n-420C1 Extract Zip Spec      14 (20) '2.0'\n-420C2 Extract OS            00 (0) 'MS-DOS'\n-420C3 General Purpose Flag  0800 (2048)\n+4208C LOCAL HEADER #355     04034B50 (67324752)\n+42090 Extract Zip Spec      14 (20) '2.0'\n+42091 Extract OS            00 (0) 'MS-DOS'\n+42092 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-420C5 Compression Method    0008 (8) 'Deflated'\n-420C7 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-420CB CRC                   C64481A5 (3326378405)\n-420CF Compressed Size       000003AA (938)\n-420D3 Uncompressed Size     00000723 (1827)\n-420D7 Filename Length       0071 (113)\n-420D9 Extra Length          0000 (0)\n-420DB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+42094 Compression Method    0008 (8) 'Deflated'\n+42096 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+4209A CRC                   C64481A5 (3326378405)\n+4209E Compressed Size       000003AA (938)\n+420A2 Uncompressed Size     00000723 (1827)\n+420A6 Filename Length       0071 (113)\n+420A8 Extra Length          0000 (0)\n+420AA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x420DB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x420AA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-4214C PAYLOAD\n+4211B PAYLOAD\n \n-424F6 LOCAL HEADER #356     04034B50 (67324752)\n-424FA Extract Zip Spec      14 (20) '2.0'\n-424FB Extract OS            00 (0) 'MS-DOS'\n-424FC General Purpose Flag  0800 (2048)\n+424C5 LOCAL HEADER #356     04034B50 (67324752)\n+424C9 Extract Zip Spec      14 (20) '2.0'\n+424CA Extract OS            00 (0) 'MS-DOS'\n+424CB General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-424FE Compression Method    0008 (8) 'Deflated'\n-42500 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-42504 CRC                   39649106 (962892038)\n-42508 Compressed Size       0000039E (926)\n-4250C Uncompressed Size     000006E2 (1762)\n-42510 Filename Length       006F (111)\n-42512 Extra Length          0000 (0)\n-42514 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+424CD Compression Method    0008 (8) 'Deflated'\n+424CF Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+424D3 CRC                   39649106 (962892038)\n+424D7 Compressed Size       0000039E (926)\n+424DB Uncompressed Size     000006E2 (1762)\n+424DF Filename Length       006F (111)\n+424E1 Extra Length          0000 (0)\n+424E3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x42514: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x424E3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-42583 PAYLOAD\n+42552 PAYLOAD\n \n-42921 LOCAL HEADER #357     04034B50 (67324752)\n-42925 Extract Zip Spec      14 (20) '2.0'\n-42926 Extract OS            00 (0) 'MS-DOS'\n-42927 General Purpose Flag  0800 (2048)\n+428F0 LOCAL HEADER #357     04034B50 (67324752)\n+428F4 Extract Zip Spec      14 (20) '2.0'\n+428F5 Extract OS            00 (0) 'MS-DOS'\n+428F6 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-42929 Compression Method    0008 (8) 'Deflated'\n-4292B Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-4292F CRC                   8DC8B44C (2378740812)\n-42933 Compressed Size       000003E3 (995)\n-42937 Uncompressed Size     00000782 (1922)\n-4293B Filename Length       006A (106)\n-4293D Extra Length          0000 (0)\n-4293F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+428F8 Compression Method    0008 (8) 'Deflated'\n+428FA Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+428FE CRC                   8DC8B44C (2378740812)\n+42902 Compressed Size       000003E3 (995)\n+42906 Uncompressed Size     00000782 (1922)\n+4290A Filename Length       006A (106)\n+4290C Extra Length          0000 (0)\n+4290E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x4293F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x4290E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-429A9 PAYLOAD\n+42978 PAYLOAD\n \n-42D8C LOCAL HEADER #358     04034B50 (67324752)\n-42D90 Extract Zip Spec      14 (20) '2.0'\n-42D91 Extract OS            00 (0) 'MS-DOS'\n-42D92 General Purpose Flag  0800 (2048)\n+42D5B LOCAL HEADER #358     04034B50 (67324752)\n+42D5F Extract Zip Spec      14 (20) '2.0'\n+42D60 Extract OS            00 (0) 'MS-DOS'\n+42D61 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-42D94 Compression Method    0008 (8) 'Deflated'\n-42D96 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-42D9A CRC                   335CA1CD (861708749)\n-42D9E Compressed Size       0000068B (1675)\n-42DA2 Uncompressed Size     00000E9A (3738)\n-42DA6 Filename Length       0074 (116)\n-42DA8 Extra Length          0000 (0)\n-42DAA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+42D63 Compression Method    0008 (8) 'Deflated'\n+42D65 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+42D69 CRC                   335CA1CD (861708749)\n+42D6D Compressed Size       0000068B (1675)\n+42D71 Uncompressed Size     00000E9A (3738)\n+42D75 Filename Length       0074 (116)\n+42D77 Extra Length          0000 (0)\n+42D79 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x42DAA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x42D79: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-42E1E PAYLOAD\n+42DED PAYLOAD\n \n-434A9 LOCAL HEADER #359     04034B50 (67324752)\n-434AD Extract Zip Spec      14 (20) '2.0'\n-434AE Extract OS            00 (0) 'MS-DOS'\n-434AF General Purpose Flag  0800 (2048)\n+43478 LOCAL HEADER #359     04034B50 (67324752)\n+4347C Extract Zip Spec      14 (20) '2.0'\n+4347D Extract OS            00 (0) 'MS-DOS'\n+4347E General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-434B1 Compression Method    0008 (8) 'Deflated'\n-434B3 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-434B7 CRC                   3EE7FDDD (1055391197)\n-434BB Compressed Size       00000723 (1827)\n-434BF Uncompressed Size     00001059 (4185)\n-434C3 Filename Length       0080 (128)\n-434C5 Extra Length          0000 (0)\n-434C7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+43480 Compression Method    0008 (8) 'Deflated'\n+43482 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+43486 CRC                   3EE7FDDD (1055391197)\n+4348A Compressed Size       00000723 (1827)\n+4348E Uncompressed Size     00001059 (4185)\n+43492 Filename Length       0080 (128)\n+43494 Extra Length          0000 (0)\n+43496 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x434C7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x43496: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-43547 PAYLOAD\n+43516 PAYLOAD\n \n-43C6A LOCAL HEADER #360     04034B50 (67324752)\n-43C6E Extract Zip Spec      14 (20) '2.0'\n-43C6F Extract OS            00 (0) 'MS-DOS'\n-43C70 General Purpose Flag  0800 (2048)\n+43C39 LOCAL HEADER #360     04034B50 (67324752)\n+43C3D Extract Zip Spec      14 (20) '2.0'\n+43C3E Extract OS            00 (0) 'MS-DOS'\n+43C3F General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-43C72 Compression Method    0008 (8) 'Deflated'\n-43C74 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-43C78 CRC                   67FA3A91 (1744452241)\n-43C7C Compressed Size       000004A5 (1189)\n-43C80 Uncompressed Size     00000C5B (3163)\n-43C84 Filename Length       007F (127)\n-43C86 Extra Length          0000 (0)\n-43C88 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+43C41 Compression Method    0008 (8) 'Deflated'\n+43C43 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+43C47 CRC                   67FA3A91 (1744452241)\n+43C4B Compressed Size       000004A5 (1189)\n+43C4F Uncompressed Size     00000C5B (3163)\n+43C53 Filename Length       007F (127)\n+43C55 Extra Length          0000 (0)\n+43C57 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x43C88: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x43C57: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-43D07 PAYLOAD\n+43CD6 PAYLOAD\n \n-441AC LOCAL HEADER #361     04034B50 (67324752)\n-441B0 Extract Zip Spec      14 (20) '2.0'\n-441B1 Extract OS            00 (0) 'MS-DOS'\n-441B2 General Purpose Flag  0800 (2048)\n+4417B LOCAL HEADER #361     04034B50 (67324752)\n+4417F Extract Zip Spec      14 (20) '2.0'\n+44180 Extract OS            00 (0) 'MS-DOS'\n+44181 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-441B4 Compression Method    0008 (8) 'Deflated'\n-441B6 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-441BA CRC                   63513D5C (1666268508)\n-441BE Compressed Size       000003E5 (997)\n-441C2 Uncompressed Size     000007C0 (1984)\n-441C6 Filename Length       007F (127)\n-441C8 Extra Length          0000 (0)\n-441CA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+44183 Compression Method    0008 (8) 'Deflated'\n+44185 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+44189 CRC                   63513D5C (1666268508)\n+4418D Compressed Size       000003E5 (997)\n+44191 Uncompressed Size     000007C0 (1984)\n+44195 Filename Length       007F (127)\n+44197 Extra Length          0000 (0)\n+44199 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x441CA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x44199: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-44249 PAYLOAD\n+44218 PAYLOAD\n \n-4462E LOCAL HEADER #362     04034B50 (67324752)\n-44632 Extract Zip Spec      14 (20) '2.0'\n-44633 Extract OS            00 (0) 'MS-DOS'\n-44634 General Purpose Flag  0800 (2048)\n+445FD LOCAL HEADER #362     04034B50 (67324752)\n+44601 Extract Zip Spec      14 (20) '2.0'\n+44602 Extract OS            00 (0) 'MS-DOS'\n+44603 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-44636 Compression Method    0008 (8) 'Deflated'\n-44638 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-4463C CRC                   99929518 (2576520472)\n-44640 Compressed Size       00000586 (1414)\n-44644 Uncompressed Size     00000EDA (3802)\n-44648 Filename Length       0076 (118)\n-4464A Extra Length          0000 (0)\n-4464C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+44605 Compression Method    0008 (8) 'Deflated'\n+44607 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+4460B CRC                   99929518 (2576520472)\n+4460F Compressed Size       00000586 (1414)\n+44613 Uncompressed Size     00000EDA (3802)\n+44617 Filename Length       0076 (118)\n+44619 Extra Length          0000 (0)\n+4461B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x4464C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x4461B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-446C2 PAYLOAD\n+44691 PAYLOAD\n \n-44C48 LOCAL HEADER #363     04034B50 (67324752)\n-44C4C Extract Zip Spec      14 (20) '2.0'\n-44C4D Extract OS            00 (0) 'MS-DOS'\n-44C4E General Purpose Flag  0800 (2048)\n+44C17 LOCAL HEADER #363     04034B50 (67324752)\n+44C1B Extract Zip Spec      14 (20) '2.0'\n+44C1C Extract OS            00 (0) 'MS-DOS'\n+44C1D General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-44C50 Compression Method    0008 (8) 'Deflated'\n-44C52 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-44C56 CRC                   E6BF62E0 (3871302368)\n-44C5A Compressed Size       000003A3 (931)\n-44C5E Uncompressed Size     000008F8 (2296)\n-44C62 Filename Length       0074 (116)\n-44C64 Extra Length          0000 (0)\n-44C66 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+44C1F Compression Method    0008 (8) 'Deflated'\n+44C21 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+44C25 CRC                   E6BF62E0 (3871302368)\n+44C29 Compressed Size       000003A3 (931)\n+44C2D Uncompressed Size     000008F8 (2296)\n+44C31 Filename Length       0074 (116)\n+44C33 Extra Length          0000 (0)\n+44C35 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x44C66: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x44C35: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-44CDA PAYLOAD\n+44CA9 PAYLOAD\n \n-4507D LOCAL HEADER #364     04034B50 (67324752)\n-45081 Extract Zip Spec      14 (20) '2.0'\n-45082 Extract OS            00 (0) 'MS-DOS'\n-45083 General Purpose Flag  0800 (2048)\n+4504C LOCAL HEADER #364     04034B50 (67324752)\n+45050 Extract Zip Spec      14 (20) '2.0'\n+45051 Extract OS            00 (0) 'MS-DOS'\n+45052 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-45085 Compression Method    0008 (8) 'Deflated'\n-45087 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-4508B CRC                   F05E2331 (4032701233)\n-4508F Compressed Size       00000408 (1032)\n-45093 Uncompressed Size     00000831 (2097)\n-45097 Filename Length       007B (123)\n-45099 Extra Length          0000 (0)\n-4509B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+45054 Compression Method    0008 (8) 'Deflated'\n+45056 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+4505A CRC                   F05E2331 (4032701233)\n+4505E Compressed Size       00000408 (1032)\n+45062 Uncompressed Size     00000831 (2097)\n+45066 Filename Length       007B (123)\n+45068 Extra Length          0000 (0)\n+4506A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x4509B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x4506A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-45116 PAYLOAD\n+450E5 PAYLOAD\n \n-4551E LOCAL HEADER #365     04034B50 (67324752)\n-45522 Extract Zip Spec      14 (20) '2.0'\n-45523 Extract OS            00 (0) 'MS-DOS'\n-45524 General Purpose Flag  0800 (2048)\n+454ED LOCAL HEADER #365     04034B50 (67324752)\n+454F1 Extract Zip Spec      14 (20) '2.0'\n+454F2 Extract OS            00 (0) 'MS-DOS'\n+454F3 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-45526 Compression Method    0008 (8) 'Deflated'\n-45528 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-4552C CRC                   80ED3BA4 (2163030948)\n-45530 Compressed Size       0000055C (1372)\n-45534 Uncompressed Size     000015D0 (5584)\n-45538 Filename Length       0079 (121)\n-4553A Extra Length          0000 (0)\n-4553C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+454F5 Compression Method    0008 (8) 'Deflated'\n+454F7 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+454FB CRC                   80ED3BA4 (2163030948)\n+454FF Compressed Size       0000055C (1372)\n+45503 Uncompressed Size     000015D0 (5584)\n+45507 Filename Length       0079 (121)\n+45509 Extra Length          0000 (0)\n+4550B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x4553C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x4550B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-455B5 PAYLOAD\n+45584 PAYLOAD\n \n-45B11 LOCAL HEADER #366     04034B50 (67324752)\n-45B15 Extract Zip Spec      14 (20) '2.0'\n-45B16 Extract OS            00 (0) 'MS-DOS'\n-45B17 General Purpose Flag  0800 (2048)\n+45AE0 LOCAL HEADER #366     04034B50 (67324752)\n+45AE4 Extract Zip Spec      14 (20) '2.0'\n+45AE5 Extract OS            00 (0) 'MS-DOS'\n+45AE6 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-45B19 Compression Method    0008 (8) 'Deflated'\n-45B1B Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-45B1F CRC                   7018E446 (1880679494)\n-45B23 Compressed Size       000009A0 (2464)\n-45B27 Uncompressed Size     00001FAE (8110)\n-45B2B Filename Length       007F (127)\n-45B2D Extra Length          0000 (0)\n-45B2F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+45AE8 Compression Method    0008 (8) 'Deflated'\n+45AEA Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+45AEE CRC                   7018E446 (1880679494)\n+45AF2 Compressed Size       000009A0 (2464)\n+45AF6 Uncompressed Size     00001FAE (8110)\n+45AFA Filename Length       007F (127)\n+45AFC Extra Length          0000 (0)\n+45AFE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x45B2F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x45AFE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-45BAE PAYLOAD\n+45B7D PAYLOAD\n \n-4654E LOCAL HEADER #367     04034B50 (67324752)\n-46552 Extract Zip Spec      14 (20) '2.0'\n-46553 Extract OS            00 (0) 'MS-DOS'\n-46554 General Purpose Flag  0800 (2048)\n+4651D LOCAL HEADER #367     04034B50 (67324752)\n+46521 Extract Zip Spec      14 (20) '2.0'\n+46522 Extract OS            00 (0) 'MS-DOS'\n+46523 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-46556 Compression Method    0008 (8) 'Deflated'\n-46558 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-4655C CRC                   61A0CE5A (1637928538)\n-46560 Compressed Size       0000049F (1183)\n-46564 Uncompressed Size     000012FA (4858)\n-46568 Filename Length       0076 (118)\n-4656A Extra Length          0000 (0)\n-4656C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+46525 Compression Method    0008 (8) 'Deflated'\n+46527 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+4652B CRC                   61A0CE5A (1637928538)\n+4652F Compressed Size       0000049F (1183)\n+46533 Uncompressed Size     000012FA (4858)\n+46537 Filename Length       0076 (118)\n+46539 Extra Length          0000 (0)\n+4653B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x4656C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x4653B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-465E2 PAYLOAD\n+465B1 PAYLOAD\n \n-46A81 LOCAL HEADER #368     04034B50 (67324752)\n-46A85 Extract Zip Spec      14 (20) '2.0'\n-46A86 Extract OS            00 (0) 'MS-DOS'\n-46A87 General Purpose Flag  0800 (2048)\n+46A50 LOCAL HEADER #368     04034B50 (67324752)\n+46A54 Extract Zip Spec      14 (20) '2.0'\n+46A55 Extract OS            00 (0) 'MS-DOS'\n+46A56 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-46A89 Compression Method    0008 (8) 'Deflated'\n-46A8B Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-46A8F CRC                   5A804AEF (1518357231)\n-46A93 Compressed Size       00000762 (1890)\n-46A97 Uncompressed Size     00001311 (4881)\n-46A9B Filename Length       0079 (121)\n-46A9D Extra Length          0000 (0)\n-46A9F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+46A58 Compression Method    0008 (8) 'Deflated'\n+46A5A Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+46A5E CRC                   5A804AEF (1518357231)\n+46A62 Compressed Size       00000762 (1890)\n+46A66 Uncompressed Size     00001311 (4881)\n+46A6A Filename Length       0079 (121)\n+46A6C Extra Length          0000 (0)\n+46A6E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x46A9F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x46A6E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-46B18 PAYLOAD\n+46AE7 PAYLOAD\n \n-4727A LOCAL HEADER #369     04034B50 (67324752)\n-4727E Extract Zip Spec      14 (20) '2.0'\n-4727F Extract OS            00 (0) 'MS-DOS'\n-47280 General Purpose Flag  0800 (2048)\n+47249 LOCAL HEADER #369     04034B50 (67324752)\n+4724D Extract Zip Spec      14 (20) '2.0'\n+4724E Extract OS            00 (0) 'MS-DOS'\n+4724F General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-47282 Compression Method    0008 (8) 'Deflated'\n-47284 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-47288 CRC                   F4A07CA3 (4104158371)\n-4728C Compressed Size       00000978 (2424)\n-47290 Uncompressed Size     000027E4 (10212)\n-47294 Filename Length       0075 (117)\n-47296 Extra Length          0000 (0)\n-47298 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+47251 Compression Method    0008 (8) 'Deflated'\n+47253 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+47257 CRC                   F4A07CA3 (4104158371)\n+4725B Compressed Size       00000978 (2424)\n+4725F Uncompressed Size     000027E4 (10212)\n+47263 Filename Length       0075 (117)\n+47265 Extra Length          0000 (0)\n+47267 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x47298: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x47267: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-4730D PAYLOAD\n+472DC PAYLOAD\n \n-47C85 LOCAL HEADER #370     04034B50 (67324752)\n-47C89 Extract Zip Spec      14 (20) '2.0'\n-47C8A Extract OS            00 (0) 'MS-DOS'\n-47C8B General Purpose Flag  0800 (2048)\n+47C54 LOCAL HEADER #370     04034B50 (67324752)\n+47C58 Extract Zip Spec      14 (20) '2.0'\n+47C59 Extract OS            00 (0) 'MS-DOS'\n+47C5A General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-47C8D Compression Method    0008 (8) 'Deflated'\n-47C8F Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-47C93 CRC                   6E031E40 (1845698112)\n-47C97 Compressed Size       0000075F (1887)\n-47C9B Uncompressed Size     00001276 (4726)\n-47C9F Filename Length       007D (125)\n-47CA1 Extra Length          0000 (0)\n-47CA3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+47C5C Compression Method    0008 (8) 'Deflated'\n+47C5E Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+47C62 CRC                   6E031E40 (1845698112)\n+47C66 Compressed Size       0000075F (1887)\n+47C6A Uncompressed Size     00001276 (4726)\n+47C6E Filename Length       007D (125)\n+47C70 Extra Length          0000 (0)\n+47C72 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x47CA3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x47C72: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-47D20 PAYLOAD\n+47CEF PAYLOAD\n \n-4847F LOCAL HEADER #371     04034B50 (67324752)\n-48483 Extract Zip Spec      14 (20) '2.0'\n-48484 Extract OS            00 (0) 'MS-DOS'\n-48485 General Purpose Flag  0800 (2048)\n+4844E LOCAL HEADER #371     04034B50 (67324752)\n+48452 Extract Zip Spec      14 (20) '2.0'\n+48453 Extract OS            00 (0) 'MS-DOS'\n+48454 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-48487 Compression Method    0008 (8) 'Deflated'\n-48489 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-4848D CRC                   5987930A (1502057226)\n-48491 Compressed Size       00000501 (1281)\n-48495 Uncompressed Size     00000BDE (3038)\n-48499 Filename Length       007C (124)\n-4849B Extra Length          0000 (0)\n-4849D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+48456 Compression Method    0008 (8) 'Deflated'\n+48458 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+4845C CRC                   5987930A (1502057226)\n+48460 Compressed Size       00000501 (1281)\n+48464 Uncompressed Size     00000BDE (3038)\n+48468 Filename Length       007C (124)\n+4846A Extra Length          0000 (0)\n+4846C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x4849D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x4846C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-48519 PAYLOAD\n+484E8 PAYLOAD\n \n-48A1A LOCAL HEADER #372     04034B50 (67324752)\n-48A1E Extract Zip Spec      14 (20) '2.0'\n-48A1F Extract OS            00 (0) 'MS-DOS'\n-48A20 General Purpose Flag  0800 (2048)\n+489E9 LOCAL HEADER #372     04034B50 (67324752)\n+489ED Extract Zip Spec      14 (20) '2.0'\n+489EE Extract OS            00 (0) 'MS-DOS'\n+489EF General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-48A22 Compression Method    0008 (8) 'Deflated'\n-48A24 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-48A28 CRC                   CA93F7B9 (3398694841)\n-48A2C Compressed Size       000003F5 (1013)\n-48A30 Uncompressed Size     000008CF (2255)\n-48A34 Filename Length       007D (125)\n-48A36 Extra Length          0000 (0)\n-48A38 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+489F1 Compression Method    0008 (8) 'Deflated'\n+489F3 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+489F7 CRC                   CA93F7B9 (3398694841)\n+489FB Compressed Size       000003F5 (1013)\n+489FF Uncompressed Size     000008CF (2255)\n+48A03 Filename Length       007D (125)\n+48A05 Extra Length          0000 (0)\n+48A07 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x48A38: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x48A07: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-48AB5 PAYLOAD\n+48A84 PAYLOAD\n \n-48EAA LOCAL HEADER #373     04034B50 (67324752)\n-48EAE Extract Zip Spec      14 (20) '2.0'\n-48EAF Extract OS            00 (0) 'MS-DOS'\n-48EB0 General Purpose Flag  0800 (2048)\n+48E79 LOCAL HEADER #373     04034B50 (67324752)\n+48E7D Extract Zip Spec      14 (20) '2.0'\n+48E7E Extract OS            00 (0) 'MS-DOS'\n+48E7F General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-48EB2 Compression Method    0008 (8) 'Deflated'\n-48EB4 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-48EB8 CRC                   673E5975 (1732139381)\n-48EBC Compressed Size       00000507 (1287)\n-48EC0 Uncompressed Size     00000CA9 (3241)\n-48EC4 Filename Length       007B (123)\n-48EC6 Extra Length          0000 (0)\n-48EC8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+48E81 Compression Method    0008 (8) 'Deflated'\n+48E83 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+48E87 CRC                   673E5975 (1732139381)\n+48E8B Compressed Size       00000507 (1287)\n+48E8F Uncompressed Size     00000CA9 (3241)\n+48E93 Filename Length       007B (123)\n+48E95 Extra Length          0000 (0)\n+48E97 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x48EC8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x48E97: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-48F43 PAYLOAD\n+48F12 PAYLOAD\n \n-4944A LOCAL HEADER #374     04034B50 (67324752)\n-4944E Extract Zip Spec      14 (20) '2.0'\n-4944F Extract OS            00 (0) 'MS-DOS'\n-49450 General Purpose Flag  0800 (2048)\n+49419 LOCAL HEADER #374     04034B50 (67324752)\n+4941D Extract Zip Spec      14 (20) '2.0'\n+4941E Extract OS            00 (0) 'MS-DOS'\n+4941F General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-49452 Compression Method    0008 (8) 'Deflated'\n-49454 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-49458 CRC                   2D1E752C (756970796)\n-4945C Compressed Size       0000177A (6010)\n-49460 Uncompressed Size     00005038 (20536)\n-49464 Filename Length       0079 (121)\n-49466 Extra Length          0000 (0)\n-49468 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+49421 Compression Method    0008 (8) 'Deflated'\n+49423 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+49427 CRC                   2D1E752C (756970796)\n+4942B Compressed Size       0000177A (6010)\n+4942F Uncompressed Size     00005038 (20536)\n+49433 Filename Length       0079 (121)\n+49435 Extra Length          0000 (0)\n+49437 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x49468: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x49437: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-494E1 PAYLOAD\n+494B0 PAYLOAD\n \n-4AC5B LOCAL HEADER #375     04034B50 (67324752)\n-4AC5F Extract Zip Spec      14 (20) '2.0'\n-4AC60 Extract OS            00 (0) 'MS-DOS'\n-4AC61 General Purpose Flag  0800 (2048)\n+4AC2A LOCAL HEADER #375     04034B50 (67324752)\n+4AC2E Extract Zip Spec      14 (20) '2.0'\n+4AC2F Extract OS            00 (0) 'MS-DOS'\n+4AC30 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-4AC63 Compression Method    0008 (8) 'Deflated'\n-4AC65 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-4AC69 CRC                   DB187B38 (3675814712)\n-4AC6D Compressed Size       00000A58 (2648)\n-4AC71 Uncompressed Size     00001A85 (6789)\n-4AC75 Filename Length       0072 (114)\n-4AC77 Extra Length          0000 (0)\n-4AC79 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+4AC32 Compression Method    0008 (8) 'Deflated'\n+4AC34 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+4AC38 CRC                   DB187B38 (3675814712)\n+4AC3C Compressed Size       00000A58 (2648)\n+4AC40 Uncompressed Size     00001A85 (6789)\n+4AC44 Filename Length       0072 (114)\n+4AC46 Extra Length          0000 (0)\n+4AC48 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x4AC79: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x4AC48: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-4ACEB PAYLOAD\n+4ACBA PAYLOAD\n \n-4B743 LOCAL HEADER #376     04034B50 (67324752)\n-4B747 Extract Zip Spec      14 (20) '2.0'\n-4B748 Extract OS            00 (0) 'MS-DOS'\n-4B749 General Purpose Flag  0800 (2048)\n+4B712 LOCAL HEADER #376     04034B50 (67324752)\n+4B716 Extract Zip Spec      14 (20) '2.0'\n+4B717 Extract OS            00 (0) 'MS-DOS'\n+4B718 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-4B74B Compression Method    0008 (8) 'Deflated'\n-4B74D Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-4B751 CRC                   CD183667 (3440916071)\n-4B755 Compressed Size       00000A45 (2629)\n-4B759 Uncompressed Size     00001A6E (6766)\n-4B75D Filename Length       0073 (115)\n-4B75F Extra Length          0000 (0)\n-4B761 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+4B71A Compression Method    0008 (8) 'Deflated'\n+4B71C Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+4B720 CRC                   CD183667 (3440916071)\n+4B724 Compressed Size       00000A45 (2629)\n+4B728 Uncompressed Size     00001A6E (6766)\n+4B72C Filename Length       0073 (115)\n+4B72E Extra Length          0000 (0)\n+4B730 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x4B761: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x4B730: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-4B7D4 PAYLOAD\n+4B7A3 PAYLOAD\n \n-4C219 LOCAL HEADER #377     04034B50 (67324752)\n-4C21D Extract Zip Spec      14 (20) '2.0'\n-4C21E Extract OS            00 (0) 'MS-DOS'\n-4C21F General Purpose Flag  0800 (2048)\n+4C1E8 LOCAL HEADER #377     04034B50 (67324752)\n+4C1EC Extract Zip Spec      14 (20) '2.0'\n+4C1ED Extract OS            00 (0) 'MS-DOS'\n+4C1EE General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-4C221 Compression Method    0008 (8) 'Deflated'\n-4C223 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-4C227 CRC                   0C7DD276 (209572470)\n-4C22B Compressed Size       00000A5A (2650)\n-4C22F Uncompressed Size     00001A92 (6802)\n-4C233 Filename Length       0073 (115)\n-4C235 Extra Length          0000 (0)\n-4C237 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+4C1F0 Compression Method    0008 (8) 'Deflated'\n+4C1F2 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+4C1F6 CRC                   0C7DD276 (209572470)\n+4C1FA Compressed Size       00000A5A (2650)\n+4C1FE Uncompressed Size     00001A92 (6802)\n+4C202 Filename Length       0073 (115)\n+4C204 Extra Length          0000 (0)\n+4C206 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x4C237: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x4C206: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-4C2AA PAYLOAD\n+4C279 PAYLOAD\n \n-4CD04 LOCAL HEADER #378     04034B50 (67324752)\n-4CD08 Extract Zip Spec      14 (20) '2.0'\n-4CD09 Extract OS            00 (0) 'MS-DOS'\n-4CD0A General Purpose Flag  0800 (2048)\n+4CCD3 LOCAL HEADER #378     04034B50 (67324752)\n+4CCD7 Extract Zip Spec      14 (20) '2.0'\n+4CCD8 Extract OS            00 (0) 'MS-DOS'\n+4CCD9 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-4CD0C Compression Method    0008 (8) 'Deflated'\n-4CD0E Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-4CD12 CRC                   60EA12C2 (1625952962)\n-4CD16 Compressed Size       000008AB (2219)\n-4CD1A Uncompressed Size     00001733 (5939)\n-4CD1E Filename Length       0074 (116)\n-4CD20 Extra Length          0000 (0)\n-4CD22 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+4CCDB Compression Method    0008 (8) 'Deflated'\n+4CCDD Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+4CCE1 CRC                   60EA12C2 (1625952962)\n+4CCE5 Compressed Size       000008AB (2219)\n+4CCE9 Uncompressed Size     00001733 (5939)\n+4CCED Filename Length       0074 (116)\n+4CCEF Extra Length          0000 (0)\n+4CCF1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x4CD22: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x4CCF1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-4CD96 PAYLOAD\n+4CD65 PAYLOAD\n \n-4D641 LOCAL HEADER #379     04034B50 (67324752)\n-4D645 Extract Zip Spec      14 (20) '2.0'\n-4D646 Extract OS            00 (0) 'MS-DOS'\n-4D647 General Purpose Flag  0800 (2048)\n+4D610 LOCAL HEADER #379     04034B50 (67324752)\n+4D614 Extract Zip Spec      14 (20) '2.0'\n+4D615 Extract OS            00 (0) 'MS-DOS'\n+4D616 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-4D649 Compression Method    0008 (8) 'Deflated'\n-4D64B Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-4D64F CRC                   4BB1EABD (1269951165)\n-4D653 Compressed Size       00000764 (1892)\n-4D657 Uncompressed Size     0000167D (5757)\n-4D65B Filename Length       0077 (119)\n-4D65D Extra Length          0000 (0)\n-4D65F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+4D618 Compression Method    0008 (8) 'Deflated'\n+4D61A Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+4D61E CRC                   4BB1EABD (1269951165)\n+4D622 Compressed Size       00000764 (1892)\n+4D626 Uncompressed Size     0000167D (5757)\n+4D62A Filename Length       0077 (119)\n+4D62C Extra Length          0000 (0)\n+4D62E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x4D65F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x4D62E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-4D6D6 PAYLOAD\n+4D6A5 PAYLOAD\n \n-4DE3A LOCAL HEADER #380     04034B50 (67324752)\n-4DE3E Extract Zip Spec      14 (20) '2.0'\n-4DE3F Extract OS            00 (0) 'MS-DOS'\n-4DE40 General Purpose Flag  0800 (2048)\n+4DE09 LOCAL HEADER #380     04034B50 (67324752)\n+4DE0D Extract Zip Spec      14 (20) '2.0'\n+4DE0E Extract OS            00 (0) 'MS-DOS'\n+4DE0F General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-4DE42 Compression Method    0008 (8) 'Deflated'\n-4DE44 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-4DE48 CRC                   A18A8EB9 (2710212281)\n-4DE4C Compressed Size       000011B4 (4532)\n-4DE50 Uncompressed Size     0000328A (12938)\n-4DE54 Filename Length       0077 (119)\n-4DE56 Extra Length          0000 (0)\n-4DE58 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+4DE11 Compression Method    0008 (8) 'Deflated'\n+4DE13 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+4DE17 CRC                   A18A8EB9 (2710212281)\n+4DE1B Compressed Size       000011B4 (4532)\n+4DE1F Uncompressed Size     0000328A (12938)\n+4DE23 Filename Length       0077 (119)\n+4DE25 Extra Length          0000 (0)\n+4DE27 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x4DE58: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x4DE27: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-4DECF PAYLOAD\n+4DE9E PAYLOAD\n \n-4F083 LOCAL HEADER #381     04034B50 (67324752)\n-4F087 Extract Zip Spec      14 (20) '2.0'\n-4F088 Extract OS            00 (0) 'MS-DOS'\n-4F089 General Purpose Flag  0800 (2048)\n+4F052 LOCAL HEADER #381     04034B50 (67324752)\n+4F056 Extract Zip Spec      14 (20) '2.0'\n+4F057 Extract OS            00 (0) 'MS-DOS'\n+4F058 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-4F08B Compression Method    0008 (8) 'Deflated'\n-4F08D Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-4F091 CRC                   B7B762D6 (3082248918)\n-4F095 Compressed Size       0000132C (4908)\n-4F099 Uncompressed Size     00003879 (14457)\n-4F09D Filename Length       0076 (118)\n-4F09F Extra Length          0000 (0)\n-4F0A1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+4F05A Compression Method    0008 (8) 'Deflated'\n+4F05C Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+4F060 CRC                   B7B762D6 (3082248918)\n+4F064 Compressed Size       0000132C (4908)\n+4F068 Uncompressed Size     00003879 (14457)\n+4F06C Filename Length       0076 (118)\n+4F06E Extra Length          0000 (0)\n+4F070 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x4F0A1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x4F070: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-4F117 PAYLOAD\n+4F0E6 PAYLOAD\n \n-50443 LOCAL HEADER #382     04034B50 (67324752)\n-50447 Extract Zip Spec      14 (20) '2.0'\n-50448 Extract OS            00 (0) 'MS-DOS'\n-50449 General Purpose Flag  0800 (2048)\n+50412 LOCAL HEADER #382     04034B50 (67324752)\n+50416 Extract Zip Spec      14 (20) '2.0'\n+50417 Extract OS            00 (0) 'MS-DOS'\n+50418 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-5044B Compression Method    0008 (8) 'Deflated'\n-5044D Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-50451 CRC                   A2B9D29A (2730087066)\n-50455 Compressed Size       00000B19 (2841)\n-50459 Uncompressed Size     00002150 (8528)\n-5045D Filename Length       007A (122)\n-5045F Extra Length          0000 (0)\n-50461 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+5041A Compression Method    0008 (8) 'Deflated'\n+5041C Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+50420 CRC                   A2B9D29A (2730087066)\n+50424 Compressed Size       00000B19 (2841)\n+50428 Uncompressed Size     00002150 (8528)\n+5042C Filename Length       007A (122)\n+5042E Extra Length          0000 (0)\n+50430 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x50461: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x50430: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-504DB PAYLOAD\n+504AA PAYLOAD\n \n-50FF4 LOCAL HEADER #383     04034B50 (67324752)\n-50FF8 Extract Zip Spec      14 (20) '2.0'\n-50FF9 Extract OS            00 (0) 'MS-DOS'\n-50FFA General Purpose Flag  0800 (2048)\n+50FC3 LOCAL HEADER #383     04034B50 (67324752)\n+50FC7 Extract Zip Spec      14 (20) '2.0'\n+50FC8 Extract OS            00 (0) 'MS-DOS'\n+50FC9 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-50FFC Compression Method    0008 (8) 'Deflated'\n-50FFE Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-51002 CRC                   C4FC7EA2 (3304881826)\n-51006 Compressed Size       00000790 (1936)\n-5100A Uncompressed Size     000011DC (4572)\n-5100E Filename Length       0073 (115)\n-51010 Extra Length          0000 (0)\n-51012 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+50FCB Compression Method    0008 (8) 'Deflated'\n+50FCD Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+50FD1 CRC                   C4FC7EA2 (3304881826)\n+50FD5 Compressed Size       00000790 (1936)\n+50FD9 Uncompressed Size     000011DC (4572)\n+50FDD Filename Length       0073 (115)\n+50FDF Extra Length          0000 (0)\n+50FE1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x51012: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x50FE1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-51085 PAYLOAD\n+51054 PAYLOAD\n \n-51815 LOCAL HEADER #384     04034B50 (67324752)\n-51819 Extract Zip Spec      14 (20) '2.0'\n-5181A Extract OS            00 (0) 'MS-DOS'\n-5181B General Purpose Flag  0800 (2048)\n+517E4 LOCAL HEADER #384     04034B50 (67324752)\n+517E8 Extract Zip Spec      14 (20) '2.0'\n+517E9 Extract OS            00 (0) 'MS-DOS'\n+517EA General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-5181D Compression Method    0008 (8) 'Deflated'\n-5181F Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-51823 CRC                   EE30A8D8 (3996166360)\n-51827 Compressed Size       00001911 (6417)\n-5182B Uncompressed Size     000072FB (29435)\n-5182F Filename Length       0076 (118)\n-51831 Extra Length          0000 (0)\n-51833 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+517EC Compression Method    0008 (8) 'Deflated'\n+517EE Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+517F2 CRC                   EE30A8D8 (3996166360)\n+517F6 Compressed Size       00001911 (6417)\n+517FA Uncompressed Size     000072FB (29435)\n+517FE Filename Length       0076 (118)\n+51800 Extra Length          0000 (0)\n+51802 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x51833: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x51802: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-518A9 PAYLOAD\n+51878 PAYLOAD\n \n-531BA LOCAL HEADER #385     04034B50 (67324752)\n-531BE Extract Zip Spec      14 (20) '2.0'\n-531BF Extract OS            00 (0) 'MS-DOS'\n-531C0 General Purpose Flag  0800 (2048)\n+53189 LOCAL HEADER #385     04034B50 (67324752)\n+5318D Extract Zip Spec      14 (20) '2.0'\n+5318E Extract OS            00 (0) 'MS-DOS'\n+5318F General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-531C2 Compression Method    0008 (8) 'Deflated'\n-531C4 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-531C8 CRC                   EA36353C (3929421116)\n-531CC Compressed Size       0000104B (4171)\n-531D0 Uncompressed Size     0000480E (18446)\n-531D4 Filename Length       007C (124)\n-531D6 Extra Length          0000 (0)\n-531D8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+53191 Compression Method    0008 (8) 'Deflated'\n+53193 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+53197 CRC                   EA36353C (3929421116)\n+5319B Compressed Size       0000104B (4171)\n+5319F Uncompressed Size     0000480E (18446)\n+531A3 Filename Length       007C (124)\n+531A5 Extra Length          0000 (0)\n+531A7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x531D8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x531A7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-53254 PAYLOAD\n+53223 PAYLOAD\n \n-5429F LOCAL HEADER #386     04034B50 (67324752)\n-542A3 Extract Zip Spec      14 (20) '2.0'\n-542A4 Extract OS            00 (0) 'MS-DOS'\n-542A5 General Purpose Flag  0800 (2048)\n+5426E LOCAL HEADER #386     04034B50 (67324752)\n+54272 Extract Zip Spec      14 (20) '2.0'\n+54273 Extract OS            00 (0) 'MS-DOS'\n+54274 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-542A7 Compression Method    0008 (8) 'Deflated'\n-542A9 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-542AD CRC                   CA474DE0 (3393670624)\n-542B1 Compressed Size       0000039D (925)\n-542B5 Uncompressed Size     000007B6 (1974)\n-542B9 Filename Length       007B (123)\n-542BB Extra Length          0000 (0)\n-542BD Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+54276 Compression Method    0008 (8) 'Deflated'\n+54278 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+5427C CRC                   CA474DE0 (3393670624)\n+54280 Compressed Size       0000039D (925)\n+54284 Uncompressed Size     000007B6 (1974)\n+54288 Filename Length       007B (123)\n+5428A Extra Length          0000 (0)\n+5428C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x542BD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x5428C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-54338 PAYLOAD\n+54307 PAYLOAD\n \n-546D5 LOCAL HEADER #387     04034B50 (67324752)\n-546D9 Extract Zip Spec      14 (20) '2.0'\n-546DA Extract OS            00 (0) 'MS-DOS'\n-546DB General Purpose Flag  0800 (2048)\n+546A4 LOCAL HEADER #387     04034B50 (67324752)\n+546A8 Extract Zip Spec      14 (20) '2.0'\n+546A9 Extract OS            00 (0) 'MS-DOS'\n+546AA General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-546DD Compression Method    0008 (8) 'Deflated'\n-546DF Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-546E3 CRC                   A19F99D4 (2711591380)\n-546E7 Compressed Size       0000065E (1630)\n-546EB Uncompressed Size     000011CB (4555)\n-546EF Filename Length       0077 (119)\n-546F1 Extra Length          0000 (0)\n-546F3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+546AC Compression Method    0008 (8) 'Deflated'\n+546AE Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+546B2 CRC                   A19F99D4 (2711591380)\n+546B6 Compressed Size       0000065E (1630)\n+546BA Uncompressed Size     000011CB (4555)\n+546BE Filename Length       0077 (119)\n+546C0 Extra Length          0000 (0)\n+546C2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x546F3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x546C2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-5476A PAYLOAD\n+54739 PAYLOAD\n \n-54DC8 LOCAL HEADER #388     04034B50 (67324752)\n-54DCC Extract Zip Spec      14 (20) '2.0'\n-54DCD Extract OS            00 (0) 'MS-DOS'\n-54DCE General Purpose Flag  0800 (2048)\n+54D97 LOCAL HEADER #388     04034B50 (67324752)\n+54D9B Extract Zip Spec      14 (20) '2.0'\n+54D9C Extract OS            00 (0) 'MS-DOS'\n+54D9D General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-54DD0 Compression Method    0008 (8) 'Deflated'\n-54DD2 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-54DD6 CRC                   7573E84B (1970530379)\n-54DDA Compressed Size       00000ED9 (3801)\n-54DDE Uncompressed Size     0000284F (10319)\n-54DE2 Filename Length       0073 (115)\n-54DE4 Extra Length          0000 (0)\n-54DE6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+54D9F Compression Method    0008 (8) 'Deflated'\n+54DA1 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+54DA5 CRC                   7573E84B (1970530379)\n+54DA9 Compressed Size       00000ED9 (3801)\n+54DAD Uncompressed Size     0000284F (10319)\n+54DB1 Filename Length       0073 (115)\n+54DB3 Extra Length          0000 (0)\n+54DB5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x54DE6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x54DB5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-54E59 PAYLOAD\n+54E28 PAYLOAD\n \n-55D32 LOCAL HEADER #389     04034B50 (67324752)\n-55D36 Extract Zip Spec      14 (20) '2.0'\n-55D37 Extract OS            00 (0) 'MS-DOS'\n-55D38 General Purpose Flag  0800 (2048)\n+55D01 LOCAL HEADER #389     04034B50 (67324752)\n+55D05 Extract Zip Spec      14 (20) '2.0'\n+55D06 Extract OS            00 (0) 'MS-DOS'\n+55D07 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-55D3A Compression Method    0008 (8) 'Deflated'\n-55D3C Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-55D40 CRC                   131CB9D8 (320649688)\n-55D44 Compressed Size       00000B4D (2893)\n-55D48 Uncompressed Size     00002777 (10103)\n-55D4C Filename Length       0077 (119)\n-55D4E Extra Length          0000 (0)\n-55D50 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+55D09 Compression Method    0008 (8) 'Deflated'\n+55D0B Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+55D0F CRC                   131CB9D8 (320649688)\n+55D13 Compressed Size       00000B4D (2893)\n+55D17 Uncompressed Size     00002777 (10103)\n+55D1B Filename Length       0077 (119)\n+55D1D Extra Length          0000 (0)\n+55D1F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x55D50: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x55D1F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-55DC7 PAYLOAD\n+55D96 PAYLOAD\n \n-56914 LOCAL HEADER #390     04034B50 (67324752)\n-56918 Extract Zip Spec      14 (20) '2.0'\n-56919 Extract OS            00 (0) 'MS-DOS'\n-5691A General Purpose Flag  0800 (2048)\n+568E3 LOCAL HEADER #390     04034B50 (67324752)\n+568E7 Extract Zip Spec      14 (20) '2.0'\n+568E8 Extract OS            00 (0) 'MS-DOS'\n+568E9 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-5691C Compression Method    0008 (8) 'Deflated'\n-5691E Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-56922 CRC                   95FAB1DA (2516234714)\n-56926 Compressed Size       00000678 (1656)\n-5692A Uncompressed Size     0000110D (4365)\n-5692E Filename Length       0076 (118)\n-56930 Extra Length          0000 (0)\n-56932 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+568EB Compression Method    0008 (8) 'Deflated'\n+568ED Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+568F1 CRC                   95FAB1DA (2516234714)\n+568F5 Compressed Size       00000678 (1656)\n+568F9 Uncompressed Size     0000110D (4365)\n+568FD Filename Length       0076 (118)\n+568FF Extra Length          0000 (0)\n+56901 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x56932: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x56901: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-569A8 PAYLOAD\n+56977 PAYLOAD\n \n-57020 LOCAL HEADER #391     04034B50 (67324752)\n-57024 Extract Zip Spec      14 (20) '2.0'\n-57025 Extract OS            00 (0) 'MS-DOS'\n-57026 General Purpose Flag  0800 (2048)\n+56FEF LOCAL HEADER #391     04034B50 (67324752)\n+56FF3 Extract Zip Spec      14 (20) '2.0'\n+56FF4 Extract OS            00 (0) 'MS-DOS'\n+56FF5 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-57028 Compression Method    0008 (8) 'Deflated'\n-5702A Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-5702E CRC                   B1E82858 (2984781912)\n-57032 Compressed Size       000007DE (2014)\n-57036 Uncompressed Size     000019D6 (6614)\n-5703A Filename Length       0079 (121)\n-5703C Extra Length          0000 (0)\n-5703E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+56FF7 Compression Method    0008 (8) 'Deflated'\n+56FF9 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+56FFD CRC                   B1E82858 (2984781912)\n+57001 Compressed Size       000007DE (2014)\n+57005 Uncompressed Size     000019D6 (6614)\n+57009 Filename Length       0079 (121)\n+5700B Extra Length          0000 (0)\n+5700D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x5703E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x5700D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-570B7 PAYLOAD\n+57086 PAYLOAD\n \n-57895 LOCAL HEADER #392     04034B50 (67324752)\n-57899 Extract Zip Spec      14 (20) '2.0'\n-5789A Extract OS            00 (0) 'MS-DOS'\n-5789B General Purpose Flag  0800 (2048)\n+57864 LOCAL HEADER #392     04034B50 (67324752)\n+57868 Extract Zip Spec      14 (20) '2.0'\n+57869 Extract OS            00 (0) 'MS-DOS'\n+5786A General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-5789D Compression Method    0008 (8) 'Deflated'\n-5789F Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-578A3 CRC                   EA13965E (3927152222)\n-578A7 Compressed Size       00000529 (1321)\n-578AB Uncompressed Size     00000F7E (3966)\n-578AF Filename Length       0076 (118)\n-578B1 Extra Length          0000 (0)\n-578B3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+5786C Compression Method    0008 (8) 'Deflated'\n+5786E Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+57872 CRC                   EA13965E (3927152222)\n+57876 Compressed Size       00000529 (1321)\n+5787A Uncompressed Size     00000F7E (3966)\n+5787E Filename Length       0076 (118)\n+57880 Extra Length          0000 (0)\n+57882 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x578B3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x57882: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-57929 PAYLOAD\n+578F8 PAYLOAD\n \n-57E52 LOCAL HEADER #393     04034B50 (67324752)\n-57E56 Extract Zip Spec      14 (20) '2.0'\n-57E57 Extract OS            00 (0) 'MS-DOS'\n-57E58 General Purpose Flag  0800 (2048)\n+57E21 LOCAL HEADER #393     04034B50 (67324752)\n+57E25 Extract Zip Spec      14 (20) '2.0'\n+57E26 Extract OS            00 (0) 'MS-DOS'\n+57E27 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-57E5A Compression Method    0008 (8) 'Deflated'\n-57E5C Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-57E60 CRC                   C8903588 (3364894088)\n-57E64 Compressed Size       00000D5E (3422)\n-57E68 Uncompressed Size     00002CD6 (11478)\n-57E6C Filename Length       006F (111)\n-57E6E Extra Length          0000 (0)\n-57E70 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+57E29 Compression Method    0008 (8) 'Deflated'\n+57E2B Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+57E2F CRC                   C8903588 (3364894088)\n+57E33 Compressed Size       00000D5E (3422)\n+57E37 Uncompressed Size     00002CD6 (11478)\n+57E3B Filename Length       006F (111)\n+57E3D Extra Length          0000 (0)\n+57E3F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x57E70: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x57E3F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-57EDF PAYLOAD\n+57EAE PAYLOAD\n \n-58C3D LOCAL HEADER #394     04034B50 (67324752)\n-58C41 Extract Zip Spec      14 (20) '2.0'\n-58C42 Extract OS            00 (0) 'MS-DOS'\n-58C43 General Purpose Flag  0800 (2048)\n+58C0C LOCAL HEADER #394     04034B50 (67324752)\n+58C10 Extract Zip Spec      14 (20) '2.0'\n+58C11 Extract OS            00 (0) 'MS-DOS'\n+58C12 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-58C45 Compression Method    0008 (8) 'Deflated'\n-58C47 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-58C4B CRC                   D19560D0 (3516227792)\n-58C4F Compressed Size       000003BB (955)\n-58C53 Uncompressed Size     00000A2F (2607)\n-58C57 Filename Length       0080 (128)\n-58C59 Extra Length          0000 (0)\n-58C5B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+58C14 Compression Method    0008 (8) 'Deflated'\n+58C16 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+58C1A CRC                   D19560D0 (3516227792)\n+58C1E Compressed Size       000003BB (955)\n+58C22 Uncompressed Size     00000A2F (2607)\n+58C26 Filename Length       0080 (128)\n+58C28 Extra Length          0000 (0)\n+58C2A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x58C5B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x58C2A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-58CDB PAYLOAD\n+58CAA PAYLOAD\n \n-59096 LOCAL HEADER #395     04034B50 (67324752)\n-5909A Extract Zip Spec      14 (20) '2.0'\n-5909B Extract OS            00 (0) 'MS-DOS'\n-5909C General Purpose Flag  0800 (2048)\n+59065 LOCAL HEADER #395     04034B50 (67324752)\n+59069 Extract Zip Spec      14 (20) '2.0'\n+5906A Extract OS            00 (0) 'MS-DOS'\n+5906B General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-5909E Compression Method    0008 (8) 'Deflated'\n-590A0 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-590A4 CRC                   CB05D09B (3406155931)\n-590A8 Compressed Size       000017FC (6140)\n-590AC Uncompressed Size     00005230 (21040)\n-590B0 Filename Length       0084 (132)\n-590B2 Extra Length          0000 (0)\n-590B4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+5906D Compression Method    0008 (8) 'Deflated'\n+5906F Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+59073 CRC                   CB05D09B (3406155931)\n+59077 Compressed Size       000017FC (6140)\n+5907B Uncompressed Size     00005230 (21040)\n+5907F Filename Length       0084 (132)\n+59081 Extra Length          0000 (0)\n+59083 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             '\n #\n-# WARNING: Offset 0x590B4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x59083: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-59138 PAYLOAD\n+59107 PAYLOAD\n \n-5A934 LOCAL HEADER #396     04034B50 (67324752)\n-5A938 Extract Zip Spec      14 (20) '2.0'\n-5A939 Extract OS            00 (0) 'MS-DOS'\n-5A93A General Purpose Flag  0800 (2048)\n+5A903 LOCAL HEADER #396     04034B50 (67324752)\n+5A907 Extract Zip Spec      14 (20) '2.0'\n+5A908 Extract OS            00 (0) 'MS-DOS'\n+5A909 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-5A93C Compression Method    0008 (8) 'Deflated'\n-5A93E Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-5A942 CRC                   17E2323C (400699964)\n-5A946 Compressed Size       00000487 (1159)\n-5A94A Uncompressed Size     00000904 (2308)\n-5A94E Filename Length       0088 (136)\n-5A950 Extra Length          0000 (0)\n-5A952 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+5A90B Compression Method    0008 (8) 'Deflated'\n+5A90D Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+5A911 CRC                   17E2323C (400699964)\n+5A915 Compressed Size       00000487 (1159)\n+5A919 Uncompressed Size     00000904 (2308)\n+5A91D Filename Length       0088 (136)\n+5A91F Extra Length          0000 (0)\n+5A921 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXX'\n #\n-# WARNING: Offset 0x5A952: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x5A921: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-5A9DA PAYLOAD\n+5A9A9 PAYLOAD\n \n-5AE61 LOCAL HEADER #397     04034B50 (67324752)\n-5AE65 Extract Zip Spec      14 (20) '2.0'\n-5AE66 Extract OS            00 (0) 'MS-DOS'\n-5AE67 General Purpose Flag  0800 (2048)\n+5AE30 LOCAL HEADER #397     04034B50 (67324752)\n+5AE34 Extract Zip Spec      14 (20) '2.0'\n+5AE35 Extract OS            00 (0) 'MS-DOS'\n+5AE36 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-5AE69 Compression Method    0008 (8) 'Deflated'\n-5AE6B Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-5AE6F CRC                   CC28EBBC (3425233852)\n-5AE73 Compressed Size       00000776 (1910)\n-5AE77 Uncompressed Size     00001036 (4150)\n-5AE7B Filename Length       0093 (147)\n-5AE7D Extra Length          0000 (0)\n-5AE7F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+5AE38 Compression Method    0008 (8) 'Deflated'\n+5AE3A Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+5AE3E CRC                   CC28EBBC (3425233852)\n+5AE42 Compressed Size       00000776 (1910)\n+5AE46 Uncompressed Size     00001036 (4150)\n+5AE4A Filename Length       0093 (147)\n+5AE4C Extra Length          0000 (0)\n+5AE4E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x5AE7F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x5AE4E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-5AF12 PAYLOAD\n+5AEE1 PAYLOAD\n \n-5B688 LOCAL HEADER #398     04034B50 (67324752)\n-5B68C Extract Zip Spec      14 (20) '2.0'\n-5B68D Extract OS            00 (0) 'MS-DOS'\n-5B68E General Purpose Flag  0800 (2048)\n+5B657 LOCAL HEADER #398     04034B50 (67324752)\n+5B65B Extract Zip Spec      14 (20) '2.0'\n+5B65C Extract OS            00 (0) 'MS-DOS'\n+5B65D General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-5B690 Compression Method    0008 (8) 'Deflated'\n-5B692 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-5B696 CRC                   3FC95820 (1070159904)\n-5B69A Compressed Size       000004B8 (1208)\n-5B69E Uncompressed Size     00000AD4 (2772)\n-5B6A2 Filename Length       0084 (132)\n-5B6A4 Extra Length          0000 (0)\n-5B6A6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+5B65F Compression Method    0008 (8) 'Deflated'\n+5B661 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+5B665 CRC                   3FC95820 (1070159904)\n+5B669 Compressed Size       000004B8 (1208)\n+5B66D Uncompressed Size     00000AD4 (2772)\n+5B671 Filename Length       0084 (132)\n+5B673 Extra Length          0000 (0)\n+5B675 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             '\n #\n-# WARNING: Offset 0x5B6A6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x5B675: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-5B72A PAYLOAD\n+5B6F9 PAYLOAD\n \n-5BBE2 LOCAL HEADER #399     04034B50 (67324752)\n-5BBE6 Extract Zip Spec      14 (20) '2.0'\n-5BBE7 Extract OS            00 (0) 'MS-DOS'\n-5BBE8 General Purpose Flag  0800 (2048)\n+5BBB1 LOCAL HEADER #399     04034B50 (67324752)\n+5BBB5 Extract Zip Spec      14 (20) '2.0'\n+5BBB6 Extract OS            00 (0) 'MS-DOS'\n+5BBB7 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-5BBEA Compression Method    0008 (8) 'Deflated'\n-5BBEC Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-5BBF0 CRC                   41CBDE11 (1103879697)\n-5BBF4 Compressed Size       000005EA (1514)\n-5BBF8 Uncompressed Size     00000D2F (3375)\n-5BBFC Filename Length       0073 (115)\n-5BBFE Extra Length          0000 (0)\n-5BC00 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+5BBB9 Compression Method    0008 (8) 'Deflated'\n+5BBBB Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+5BBBF CRC                   41CBDE11 (1103879697)\n+5BBC3 Compressed Size       000005EA (1514)\n+5BBC7 Uncompressed Size     00000D2F (3375)\n+5BBCB Filename Length       0073 (115)\n+5BBCD Extra Length          0000 (0)\n+5BBCF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x5BC00: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x5BBCF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-5BC73 PAYLOAD\n+5BC42 PAYLOAD\n \n-5C25D LOCAL HEADER #400     04034B50 (67324752)\n-5C261 Extract Zip Spec      14 (20) '2.0'\n-5C262 Extract OS            00 (0) 'MS-DOS'\n-5C263 General Purpose Flag  0800 (2048)\n+5C22C LOCAL HEADER #400     04034B50 (67324752)\n+5C230 Extract Zip Spec      14 (20) '2.0'\n+5C231 Extract OS            00 (0) 'MS-DOS'\n+5C232 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-5C265 Compression Method    0008 (8) 'Deflated'\n-5C267 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-5C26B CRC                   1D768ED5 (494309077)\n-5C26F Compressed Size       00000834 (2100)\n-5C273 Uncompressed Size     00001C79 (7289)\n-5C277 Filename Length       0079 (121)\n-5C279 Extra Length          0000 (0)\n-5C27B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+5C234 Compression Method    0008 (8) 'Deflated'\n+5C236 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+5C23A CRC                   1D768ED5 (494309077)\n+5C23E Compressed Size       00000834 (2100)\n+5C242 Uncompressed Size     00001C79 (7289)\n+5C246 Filename Length       0079 (121)\n+5C248 Extra Length          0000 (0)\n+5C24A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x5C27B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x5C24A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-5C2F4 PAYLOAD\n+5C2C3 PAYLOAD\n \n-5CB28 LOCAL HEADER #401     04034B50 (67324752)\n-5CB2C Extract Zip Spec      14 (20) '2.0'\n-5CB2D Extract OS            00 (0) 'MS-DOS'\n-5CB2E General Purpose Flag  0800 (2048)\n+5CAF7 LOCAL HEADER #401     04034B50 (67324752)\n+5CAFB Extract Zip Spec      14 (20) '2.0'\n+5CAFC Extract OS            00 (0) 'MS-DOS'\n+5CAFD General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-5CB30 Compression Method    0008 (8) 'Deflated'\n-5CB32 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-5CB36 CRC                   7A85C658 (2055587416)\n-5CB3A Compressed Size       0000085F (2143)\n-5CB3E Uncompressed Size     00001D19 (7449)\n-5CB42 Filename Length       0081 (129)\n-5CB44 Extra Length          0000 (0)\n-5CB46 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+5CAFF Compression Method    0008 (8) 'Deflated'\n+5CB01 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+5CB05 CRC                   7A85C658 (2055587416)\n+5CB09 Compressed Size       0000085F (2143)\n+5CB0D Uncompressed Size     00001D19 (7449)\n+5CB11 Filename Length       0081 (129)\n+5CB13 Extra Length          0000 (0)\n+5CB15 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x5CB46: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x5CB15: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-5CBC7 PAYLOAD\n+5CB96 PAYLOAD\n \n-5D426 LOCAL HEADER #402     04034B50 (67324752)\n-5D42A Extract Zip Spec      14 (20) '2.0'\n-5D42B Extract OS            00 (0) 'MS-DOS'\n-5D42C General Purpose Flag  0800 (2048)\n+5D3F5 LOCAL HEADER #402     04034B50 (67324752)\n+5D3F9 Extract Zip Spec      14 (20) '2.0'\n+5D3FA Extract OS            00 (0) 'MS-DOS'\n+5D3FB General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-5D42E Compression Method    0008 (8) 'Deflated'\n-5D430 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-5D434 CRC                   C398FE25 (3281583653)\n-5D438 Compressed Size       0006744D (422989)\n-5D43C Uncompressed Size     00403BAB (4209579)\n-5D440 Filename Length       001A (26)\n-5D442 Extra Length          0000 (0)\n-5D444 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXX'\n+5D3FD Compression Method    0008 (8) 'Deflated'\n+5D3FF Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+5D403 CRC                   3FE1AA84 (1071753860)\n+5D407 Compressed Size       00067A8B (424587)\n+5D40B Uncompressed Size     00403B93 (4209555)\n+5D40F Filename Length       001A (26)\n+5D411 Extra Length          0000 (0)\n+5D413 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x5D444: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x5D413: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-5D45E PAYLOAD\n+5D42D PAYLOAD\n \n-C48AB LOCAL HEADER #403     04034B50 (67324752)\n-C48AF Extract Zip Spec      14 (20) '2.0'\n-C48B0 Extract OS            00 (0) 'MS-DOS'\n-C48B1 General Purpose Flag  0800 (2048)\n+C4EB8 LOCAL HEADER #403     04034B50 (67324752)\n+C4EBC Extract Zip Spec      14 (20) '2.0'\n+C4EBD Extract OS            00 (0) 'MS-DOS'\n+C4EBE General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-C48B3 Compression Method    0008 (8) 'Deflated'\n-C48B5 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C48B9 CRC                   1814D611 (404018705)\n-C48BD Compressed Size       000007BF (1983)\n-C48C1 Uncompressed Size     00001EAA (7850)\n-C48C5 Filename Length       003C (60)\n-C48C7 Extra Length          0000 (0)\n-C48C9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C4EC0 Compression Method    0008 (8) 'Deflated'\n+C4EC2 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C4EC6 CRC                   1814D611 (404018705)\n+C4ECA Compressed Size       000007BF (1983)\n+C4ECE Uncompressed Size     00001EAA (7850)\n+C4ED2 Filename Length       003C (60)\n+C4ED4 Extra Length          0000 (0)\n+C4ED6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC48C9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC4ED6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-C4905 PAYLOAD\n+C4F12 PAYLOAD\n \n-C50C4 LOCAL HEADER #404     04034B50 (67324752)\n-C50C8 Extract Zip Spec      14 (20) '2.0'\n-C50C9 Extract OS            00 (0) 'MS-DOS'\n-C50CA General Purpose Flag  0800 (2048)\n+C56D1 LOCAL HEADER #404     04034B50 (67324752)\n+C56D5 Extract Zip Spec      14 (20) '2.0'\n+C56D6 Extract OS            00 (0) 'MS-DOS'\n+C56D7 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-C50CC Compression Method    0008 (8) 'Deflated'\n-C50CE Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C50D2 CRC                   AE8A225E (2928288350)\n-C50D6 Compressed Size       00000047 (71)\n-C50DA Uncompressed Size     0000004A (74)\n-C50DE Filename Length       0043 (67)\n-C50E0 Extra Length          0000 (0)\n-C50E2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C56D9 Compression Method    0008 (8) 'Deflated'\n+C56DB Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C56DF CRC                   AE8A225E (2928288350)\n+C56E3 Compressed Size       00000047 (71)\n+C56E7 Uncompressed Size     0000004A (74)\n+C56EB Filename Length       0043 (67)\n+C56ED Extra Length          0000 (0)\n+C56EF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC50E2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC56EF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-C5125 PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+C5732 PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n \n-C516C CENTRAL HEADER #1     02014B50 (33639248)\n-C5170 Created Zip Spec      14 (20) '2.0'\n-C5171 Created OS            03 (3) 'Unix'\n-C5172 Extract Zip Spec      0A (10) '1.0'\n-C5173 Extract OS            00 (0) 'MS-DOS'\n-C5174 General Purpose Flag  0800 (2048)\n+C5779 CENTRAL HEADER #1     02014B50 (33639248)\n+C577D Created Zip Spec      14 (20) '2.0'\n+C577E Created OS            03 (3) 'Unix'\n+C577F Extract Zip Spec      0A (10) '1.0'\n+C5780 Extract OS            00 (0) 'MS-DOS'\n+C5781 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C5176 Compression Method    0000 (0) 'Stored'\n-C5178 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C517C CRC                   00000000 (0)\n-C5180 Compressed Size       00000000 (0)\n-C5184 Uncompressed Size     00000000 (0)\n-C5188 Filename Length       0009 (9)\n-C518A Extra Length          0000 (0)\n-C518C Comment Length        0000 (0)\n-C518E Disk Start            0000 (0)\n-C5190 Int File Attributes   0000 (0)\n+C5783 Compression Method    0000 (0) 'Stored'\n+C5785 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C5789 CRC                   00000000 (0)\n+C578D Compressed Size       00000000 (0)\n+C5791 Uncompressed Size     00000000 (0)\n+C5795 Filename Length       0009 (9)\n+C5797 Extra Length          0000 (0)\n+C5799 Comment Length        0000 (0)\n+C579B Disk Start            0000 (0)\n+C579D Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C5192 Ext File Attributes   41ED0010 (1106051088)\n+C579F Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C5196 Local Header Offset   00000000 (0)\n-C519A Filename              'XXXXXXXXX'\n+C57A3 Local Header Offset   00000000 (0)\n+C57A7 Filename              'XXXXXXXXX'\n #\n-# WARNING: Offset 0xC519A: Filename 'XXXXXXXXX'\n+# WARNING: Offset 0xC57A7: Filename 'XXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC519A: Directory 'XXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC57A7: Directory 'XXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC5172: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXX'\n+# WARNING: Offset 0xC577F: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXX'\n #\n \n-C51A3 CENTRAL HEADER #2     02014B50 (33639248)\n-C51A7 Created Zip Spec      14 (20) '2.0'\n-C51A8 Created OS            03 (3) 'Unix'\n-C51A9 Extract Zip Spec      14 (20) '2.0'\n-C51AA Extract OS            00 (0) 'MS-DOS'\n-C51AB General Purpose Flag  0800 (2048)\n+C57B0 CENTRAL HEADER #2     02014B50 (33639248)\n+C57B4 Created Zip Spec      14 (20) '2.0'\n+C57B5 Created OS            03 (3) 'Unix'\n+C57B6 Extract Zip Spec      14 (20) '2.0'\n+C57B7 Extract OS            00 (0) 'MS-DOS'\n+C57B8 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-C51AD Compression Method    0008 (8) 'Deflated'\n-C51AF Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C51B3 CRC                   42E85196 (1122521494)\n-C51B7 Compressed Size       000000A6 (166)\n-C51BB Uncompressed Size     0000013F (319)\n-C51BF Filename Length       0014 (20)\n-C51C1 Extra Length          0000 (0)\n-C51C3 Comment Length        0000 (0)\n-C51C5 Disk Start            0000 (0)\n-C51C7 Int File Attributes   0000 (0)\n+C57BA Compression Method    0008 (8) 'Deflated'\n+C57BC Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C57C0 CRC                   42E85196 (1122521494)\n+C57C4 Compressed Size       000000A6 (166)\n+C57C8 Uncompressed Size     0000013F (319)\n+C57CC Filename Length       0014 (20)\n+C57CE Extra Length          0000 (0)\n+C57D0 Comment Length        0000 (0)\n+C57D2 Disk Start            0000 (0)\n+C57D4 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C51C9 Ext File Attributes   81A40000 (2175008768)\n+C57D6 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-C51CD Local Header Offset   00000027 (39)\n-C51D1 Filename              'XXXXXXXXXXXXXXXXXXXX'\n+C57DA Local Header Offset   00000027 (39)\n+C57DE Filename              'XXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC51D1: Filename 'XXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC57DE: Filename 'XXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-C51E5 CENTRAL HEADER #3     02014B50 (33639248)\n-C51E9 Created Zip Spec      14 (20) '2.0'\n-C51EA Created OS            03 (3) 'Unix'\n-C51EB Extract Zip Spec      0A (10) '1.0'\n-C51EC Extract OS            00 (0) 'MS-DOS'\n-C51ED General Purpose Flag  0800 (2048)\n+C57F2 CENTRAL HEADER #3     02014B50 (33639248)\n+C57F6 Created Zip Spec      14 (20) '2.0'\n+C57F7 Created OS            03 (3) 'Unix'\n+C57F8 Extract Zip Spec      0A (10) '1.0'\n+C57F9 Extract OS            00 (0) 'MS-DOS'\n+C57FA General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C51EF Compression Method    0000 (0) 'Stored'\n-C51F1 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C51F5 CRC                   00000000 (0)\n-C51F9 Compressed Size       00000000 (0)\n-C51FD Uncompressed Size     00000000 (0)\n-C5201 Filename Length       0005 (5)\n-C5203 Extra Length          0000 (0)\n-C5205 Comment Length        0000 (0)\n-C5207 Disk Start            0000 (0)\n-C5209 Int File Attributes   0000 (0)\n+C57FC Compression Method    0000 (0) 'Stored'\n+C57FE Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C5802 CRC                   00000000 (0)\n+C5806 Compressed Size       00000000 (0)\n+C580A Uncompressed Size     00000000 (0)\n+C580E Filename Length       0005 (5)\n+C5810 Extra Length          0000 (0)\n+C5812 Comment Length        0000 (0)\n+C5814 Disk Start            0000 (0)\n+C5816 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C520B Ext File Attributes   41ED0010 (1106051088)\n+C5818 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C520F Local Header Offset   000000FF (255)\n-C5213 Filename              'XXXXX'\n+C581C Local Header Offset   000000FF (255)\n+C5820 Filename              'XXXXX'\n #\n-# WARNING: Offset 0xC5213: Filename 'XXXXX'\n+# WARNING: Offset 0xC5820: Filename 'XXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC5213: Directory 'XXXXX' must end in a '/'\n+# ERROR: Offset 0xC5820: Directory 'XXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC51EB: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXX'\n+# WARNING: Offset 0xC57F8: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXX'\n #\n \n-C5218 CENTRAL HEADER #4     02014B50 (33639248)\n-C521C Created Zip Spec      14 (20) '2.0'\n-C521D Created OS            03 (3) 'Unix'\n-C521E Extract Zip Spec      0A (10) '1.0'\n-C521F Extract OS            00 (0) 'MS-DOS'\n-C5220 General Purpose Flag  0800 (2048)\n+C5825 CENTRAL HEADER #4     02014B50 (33639248)\n+C5829 Created Zip Spec      14 (20) '2.0'\n+C582A Created OS            03 (3) 'Unix'\n+C582B Extract Zip Spec      0A (10) '1.0'\n+C582C Extract OS            00 (0) 'MS-DOS'\n+C582D General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C5222 Compression Method    0000 (0) 'Stored'\n-C5224 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C5228 CRC                   00000000 (0)\n-C522C Compressed Size       00000000 (0)\n-C5230 Uncompressed Size     00000000 (0)\n-C5234 Filename Length       0015 (21)\n-C5236 Extra Length          0000 (0)\n-C5238 Comment Length        0000 (0)\n-C523A Disk Start            0000 (0)\n-C523C Int File Attributes   0000 (0)\n+C582F Compression Method    0000 (0) 'Stored'\n+C5831 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C5835 CRC                   00000000 (0)\n+C5839 Compressed Size       00000000 (0)\n+C583D Uncompressed Size     00000000 (0)\n+C5841 Filename Length       0015 (21)\n+C5843 Extra Length          0000 (0)\n+C5845 Comment Length        0000 (0)\n+C5847 Disk Start            0000 (0)\n+C5849 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C523E Ext File Attributes   41ED0010 (1106051088)\n+C584B Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C5242 Local Header Offset   00000122 (290)\n-C5246 Filename              'XXXXXXXXXXXXXXXXXXXXX'\n+C584F Local Header Offset   00000122 (290)\n+C5853 Filename              'XXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC5246: Filename 'XXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC5853: Filename 'XXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC5246: Directory 'XXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC5853: Directory 'XXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC521E: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC582B: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C525B CENTRAL HEADER #5     02014B50 (33639248)\n-C525F Created Zip Spec      14 (20) '2.0'\n-C5260 Created OS            03 (3) 'Unix'\n-C5261 Extract Zip Spec      0A (10) '1.0'\n-C5262 Extract OS            00 (0) 'MS-DOS'\n-C5263 General Purpose Flag  0800 (2048)\n+C5868 CENTRAL HEADER #5     02014B50 (33639248)\n+C586C Created Zip Spec      14 (20) '2.0'\n+C586D Created OS            03 (3) 'Unix'\n+C586E Extract Zip Spec      0A (10) '1.0'\n+C586F Extract OS            00 (0) 'MS-DOS'\n+C5870 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C5265 Compression Method    0000 (0) 'Stored'\n-C5267 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C526B CRC                   00000000 (0)\n-C526F Compressed Size       00000000 (0)\n-C5273 Uncompressed Size     00000000 (0)\n-C5277 Filename Length       0027 (39)\n-C5279 Extra Length          0000 (0)\n-C527B Comment Length        0000 (0)\n-C527D Disk Start            0000 (0)\n-C527F Int File Attributes   0000 (0)\n+C5872 Compression Method    0000 (0) 'Stored'\n+C5874 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C5878 CRC                   00000000 (0)\n+C587C Compressed Size       00000000 (0)\n+C5880 Uncompressed Size     00000000 (0)\n+C5884 Filename Length       0027 (39)\n+C5886 Extra Length          0000 (0)\n+C5888 Comment Length        0000 (0)\n+C588A Disk Start            0000 (0)\n+C588C Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C5281 Ext File Attributes   41ED0010 (1106051088)\n+C588E Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C5285 Local Header Offset   00000155 (341)\n-C5289 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C5892 Local Header Offset   00000155 (341)\n+C5896 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC5289: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC5896: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC5289: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC5896: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC5261: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC586E: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C52B0 CENTRAL HEADER #6     02014B50 (33639248)\n-C52B4 Created Zip Spec      14 (20) '2.0'\n-C52B5 Created OS            03 (3) 'Unix'\n-C52B6 Extract Zip Spec      0A (10) '1.0'\n-C52B7 Extract OS            00 (0) 'MS-DOS'\n-C52B8 General Purpose Flag  0800 (2048)\n+C58BD CENTRAL HEADER #6     02014B50 (33639248)\n+C58C1 Created Zip Spec      14 (20) '2.0'\n+C58C2 Created OS            03 (3) 'Unix'\n+C58C3 Extract Zip Spec      0A (10) '1.0'\n+C58C4 Extract OS            00 (0) 'MS-DOS'\n+C58C5 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C52BA Compression Method    0000 (0) 'Stored'\n-C52BC Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C52C0 CRC                   00000000 (0)\n-C52C4 Compressed Size       00000000 (0)\n-C52C8 Uncompressed Size     00000000 (0)\n-C52CC Filename Length       0030 (48)\n-C52CE Extra Length          0000 (0)\n-C52D0 Comment Length        0000 (0)\n-C52D2 Disk Start            0000 (0)\n-C52D4 Int File Attributes   0000 (0)\n+C58C7 Compression Method    0000 (0) 'Stored'\n+C58C9 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C58CD CRC                   00000000 (0)\n+C58D1 Compressed Size       00000000 (0)\n+C58D5 Uncompressed Size     00000000 (0)\n+C58D9 Filename Length       0030 (48)\n+C58DB Extra Length          0000 (0)\n+C58DD Comment Length        0000 (0)\n+C58DF Disk Start            0000 (0)\n+C58E1 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C52D6 Ext File Attributes   41ED0010 (1106051088)\n+C58E3 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C52DA Local Header Offset   0000019A (410)\n-C52DE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C58E7 Local Header Offset   0000019A (410)\n+C58EB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC52DE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC58EB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC52DE: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC58EB: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC52B6: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC58C3: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C530E CENTRAL HEADER #7     02014B50 (33639248)\n-C5312 Created Zip Spec      14 (20) '2.0'\n-C5313 Created OS            03 (3) 'Unix'\n-C5314 Extract Zip Spec      0A (10) '1.0'\n-C5315 Extract OS            00 (0) 'MS-DOS'\n-C5316 General Purpose Flag  0800 (2048)\n+C591B CENTRAL HEADER #7     02014B50 (33639248)\n+C591F Created Zip Spec      14 (20) '2.0'\n+C5920 Created OS            03 (3) 'Unix'\n+C5921 Extract Zip Spec      0A (10) '1.0'\n+C5922 Extract OS            00 (0) 'MS-DOS'\n+C5923 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C5318 Compression Method    0000 (0) 'Stored'\n-C531A Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C531E CRC                   00000000 (0)\n-C5322 Compressed Size       00000000 (0)\n-C5326 Uncompressed Size     00000000 (0)\n-C532A Filename Length       0067 (103)\n-C532C Extra Length          0000 (0)\n-C532E Comment Length        0000 (0)\n-C5330 Disk Start            0000 (0)\n-C5332 Int File Attributes   0000 (0)\n+C5925 Compression Method    0000 (0) 'Stored'\n+C5927 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C592B CRC                   00000000 (0)\n+C592F Compressed Size       00000000 (0)\n+C5933 Uncompressed Size     00000000 (0)\n+C5937 Filename Length       0067 (103)\n+C5939 Extra Length          0000 (0)\n+C593B Comment Length        0000 (0)\n+C593D Disk Start            0000 (0)\n+C593F Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C5334 Ext File Attributes   41ED0010 (1106051088)\n+C5941 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C5338 Local Header Offset   000001E8 (488)\n-C533C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C5945 Local Header Offset   000001E8 (488)\n+C5949 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC533C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC5949: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC533C: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC5949: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC5314: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC5921: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C53A3 CENTRAL HEADER #8     02014B50 (33639248)\n-C53A7 Created Zip Spec      14 (20) '2.0'\n-C53A8 Created OS            03 (3) 'Unix'\n-C53A9 Extract Zip Spec      0A (10) '1.0'\n-C53AA Extract OS            00 (0) 'MS-DOS'\n-C53AB General Purpose Flag  0800 (2048)\n+C59B0 CENTRAL HEADER #8     02014B50 (33639248)\n+C59B4 Created Zip Spec      14 (20) '2.0'\n+C59B5 Created OS            03 (3) 'Unix'\n+C59B6 Extract Zip Spec      0A (10) '1.0'\n+C59B7 Extract OS            00 (0) 'MS-DOS'\n+C59B8 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C53AD Compression Method    0000 (0) 'Stored'\n-C53AF Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C53B3 CRC                   00000000 (0)\n-C53B7 Compressed Size       00000000 (0)\n-C53BB Uncompressed Size     00000000 (0)\n-C53BF Filename Length       0023 (35)\n-C53C1 Extra Length          0000 (0)\n-C53C3 Comment Length        0000 (0)\n-C53C5 Disk Start            0000 (0)\n-C53C7 Int File Attributes   0000 (0)\n+C59BA Compression Method    0000 (0) 'Stored'\n+C59BC Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C59C0 CRC                   00000000 (0)\n+C59C4 Compressed Size       00000000 (0)\n+C59C8 Uncompressed Size     00000000 (0)\n+C59CC Filename Length       0023 (35)\n+C59CE Extra Length          0000 (0)\n+C59D0 Comment Length        0000 (0)\n+C59D2 Disk Start            0000 (0)\n+C59D4 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C53C9 Ext File Attributes   41ED0010 (1106051088)\n+C59D6 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C53CD Local Header Offset   0000026D (621)\n-C53D1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C59DA Local Header Offset   0000026D (621)\n+C59DE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC53D1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC59DE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC53D1: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC59DE: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC53A9: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC59B6: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C53F4 CENTRAL HEADER #9     02014B50 (33639248)\n-C53F8 Created Zip Spec      14 (20) '2.0'\n-C53F9 Created OS            03 (3) 'Unix'\n-C53FA Extract Zip Spec      0A (10) '1.0'\n-C53FB Extract OS            00 (0) 'MS-DOS'\n-C53FC General Purpose Flag  0800 (2048)\n+C5A01 CENTRAL HEADER #9     02014B50 (33639248)\n+C5A05 Created Zip Spec      14 (20) '2.0'\n+C5A06 Created OS            03 (3) 'Unix'\n+C5A07 Extract Zip Spec      0A (10) '1.0'\n+C5A08 Extract OS            00 (0) 'MS-DOS'\n+C5A09 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C53FE Compression Method    0000 (0) 'Stored'\n-C5400 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C5404 CRC                   00000000 (0)\n-C5408 Compressed Size       00000000 (0)\n-C540C Uncompressed Size     00000000 (0)\n-C5410 Filename Length       002C (44)\n-C5412 Extra Length          0000 (0)\n-C5414 Comment Length        0000 (0)\n-C5416 Disk Start            0000 (0)\n-C5418 Int File Attributes   0000 (0)\n+C5A0B Compression Method    0000 (0) 'Stored'\n+C5A0D Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C5A11 CRC                   00000000 (0)\n+C5A15 Compressed Size       00000000 (0)\n+C5A19 Uncompressed Size     00000000 (0)\n+C5A1D Filename Length       002C (44)\n+C5A1F Extra Length          0000 (0)\n+C5A21 Comment Length        0000 (0)\n+C5A23 Disk Start            0000 (0)\n+C5A25 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C541A Ext File Attributes   41ED0010 (1106051088)\n+C5A27 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C541E Local Header Offset   000002AE (686)\n-C5422 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C5A2B Local Header Offset   000002AE (686)\n+C5A2F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC5422: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC5A2F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC5422: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC5A2F: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC53FA: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC5A07: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C544E CENTRAL HEADER #10    02014B50 (33639248)\n-C5452 Created Zip Spec      14 (20) '2.0'\n-C5453 Created OS            03 (3) 'Unix'\n-C5454 Extract Zip Spec      0A (10) '1.0'\n-C5455 Extract OS            00 (0) 'MS-DOS'\n-C5456 General Purpose Flag  0800 (2048)\n+C5A5B CENTRAL HEADER #10    02014B50 (33639248)\n+C5A5F Created Zip Spec      14 (20) '2.0'\n+C5A60 Created OS            03 (3) 'Unix'\n+C5A61 Extract Zip Spec      0A (10) '1.0'\n+C5A62 Extract OS            00 (0) 'MS-DOS'\n+C5A63 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C5458 Compression Method    0000 (0) 'Stored'\n-C545A Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C545E CRC                   00000000 (0)\n-C5462 Compressed Size       00000000 (0)\n-C5466 Uncompressed Size     00000000 (0)\n-C546A Filename Length       0058 (88)\n-C546C Extra Length          0000 (0)\n-C546E Comment Length        0000 (0)\n-C5470 Disk Start            0000 (0)\n-C5472 Int File Attributes   0000 (0)\n+C5A65 Compression Method    0000 (0) 'Stored'\n+C5A67 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C5A6B CRC                   00000000 (0)\n+C5A6F Compressed Size       00000000 (0)\n+C5A73 Uncompressed Size     00000000 (0)\n+C5A77 Filename Length       0058 (88)\n+C5A79 Extra Length          0000 (0)\n+C5A7B Comment Length        0000 (0)\n+C5A7D Disk Start            0000 (0)\n+C5A7F Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C5474 Ext File Attributes   41ED0010 (1106051088)\n+C5A81 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C5478 Local Header Offset   000002F8 (760)\n-C547C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C5A85 Local Header Offset   000002F8 (760)\n+C5A89 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC547C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC5A89: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC547C: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC5A89: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC5454: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC5A61: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C54D4 CENTRAL HEADER #11    02014B50 (33639248)\n-C54D8 Created Zip Spec      14 (20) '2.0'\n-C54D9 Created OS            03 (3) 'Unix'\n-C54DA Extract Zip Spec      0A (10) '1.0'\n-C54DB Extract OS            00 (0) 'MS-DOS'\n-C54DC General Purpose Flag  0800 (2048)\n+C5AE1 CENTRAL HEADER #11    02014B50 (33639248)\n+C5AE5 Created Zip Spec      14 (20) '2.0'\n+C5AE6 Created OS            03 (3) 'Unix'\n+C5AE7 Extract Zip Spec      0A (10) '1.0'\n+C5AE8 Extract OS            00 (0) 'MS-DOS'\n+C5AE9 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C54DE Compression Method    0000 (0) 'Stored'\n-C54E0 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C54E4 CRC                   00000000 (0)\n-C54E8 Compressed Size       00000000 (0)\n-C54EC Uncompressed Size     00000000 (0)\n-C54F0 Filename Length       0058 (88)\n-C54F2 Extra Length          0000 (0)\n-C54F4 Comment Length        0000 (0)\n-C54F6 Disk Start            0000 (0)\n-C54F8 Int File Attributes   0000 (0)\n+C5AEB Compression Method    0000 (0) 'Stored'\n+C5AED Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C5AF1 CRC                   00000000 (0)\n+C5AF5 Compressed Size       00000000 (0)\n+C5AF9 Uncompressed Size     00000000 (0)\n+C5AFD Filename Length       0058 (88)\n+C5AFF Extra Length          0000 (0)\n+C5B01 Comment Length        0000 (0)\n+C5B03 Disk Start            0000 (0)\n+C5B05 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C54FA Ext File Attributes   41ED0010 (1106051088)\n+C5B07 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C54FE Local Header Offset   0000036E (878)\n-C5502 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C5B0B Local Header Offset   0000036E (878)\n+C5B0F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC5502: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC5B0F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC5502: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC5B0F: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC54DA: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC5AE7: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C555A CENTRAL HEADER #12    02014B50 (33639248)\n-C555E Created Zip Spec      14 (20) '2.0'\n-C555F Created OS            03 (3) 'Unix'\n-C5560 Extract Zip Spec      0A (10) '1.0'\n-C5561 Extract OS            00 (0) 'MS-DOS'\n-C5562 General Purpose Flag  0800 (2048)\n+C5B67 CENTRAL HEADER #12    02014B50 (33639248)\n+C5B6B Created Zip Spec      14 (20) '2.0'\n+C5B6C Created OS            03 (3) 'Unix'\n+C5B6D Extract Zip Spec      0A (10) '1.0'\n+C5B6E Extract OS            00 (0) 'MS-DOS'\n+C5B6F General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C5564 Compression Method    0000 (0) 'Stored'\n-C5566 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C556A CRC                   00000000 (0)\n-C556E Compressed Size       00000000 (0)\n-C5572 Uncompressed Size     00000000 (0)\n-C5576 Filename Length       002F (47)\n-C5578 Extra Length          0000 (0)\n-C557A Comment Length        0000 (0)\n-C557C Disk Start            0000 (0)\n-C557E Int File Attributes   0000 (0)\n+C5B71 Compression Method    0000 (0) 'Stored'\n+C5B73 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C5B77 CRC                   00000000 (0)\n+C5B7B Compressed Size       00000000 (0)\n+C5B7F Uncompressed Size     00000000 (0)\n+C5B83 Filename Length       002F (47)\n+C5B85 Extra Length          0000 (0)\n+C5B87 Comment Length        0000 (0)\n+C5B89 Disk Start            0000 (0)\n+C5B8B Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C5580 Ext File Attributes   41ED0010 (1106051088)\n+C5B8D Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C5584 Local Header Offset   000003E4 (996)\n-C5588 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C5B91 Local Header Offset   000003E4 (996)\n+C5B95 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC5588: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC5B95: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC5588: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC5B95: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC5560: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC5B6D: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C55B7 CENTRAL HEADER #13    02014B50 (33639248)\n-C55BB Created Zip Spec      14 (20) '2.0'\n-C55BC Created OS            03 (3) 'Unix'\n-C55BD Extract Zip Spec      0A (10) '1.0'\n-C55BE Extract OS            00 (0) 'MS-DOS'\n-C55BF General Purpose Flag  0800 (2048)\n+C5BC4 CENTRAL HEADER #13    02014B50 (33639248)\n+C5BC8 Created Zip Spec      14 (20) '2.0'\n+C5BC9 Created OS            03 (3) 'Unix'\n+C5BCA Extract Zip Spec      0A (10) '1.0'\n+C5BCB Extract OS            00 (0) 'MS-DOS'\n+C5BCC General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C55C1 Compression Method    0000 (0) 'Stored'\n-C55C3 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C55C7 CRC                   00000000 (0)\n-C55CB Compressed Size       00000000 (0)\n-C55CF Uncompressed Size     00000000 (0)\n-C55D3 Filename Length       0038 (56)\n-C55D5 Extra Length          0000 (0)\n-C55D7 Comment Length        0000 (0)\n-C55D9 Disk Start            0000 (0)\n-C55DB Int File Attributes   0000 (0)\n+C5BCE Compression Method    0000 (0) 'Stored'\n+C5BD0 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C5BD4 CRC                   00000000 (0)\n+C5BD8 Compressed Size       00000000 (0)\n+C5BDC Uncompressed Size     00000000 (0)\n+C5BE0 Filename Length       0038 (56)\n+C5BE2 Extra Length          0000 (0)\n+C5BE4 Comment Length        0000 (0)\n+C5BE6 Disk Start            0000 (0)\n+C5BE8 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C55DD Ext File Attributes   41ED0010 (1106051088)\n+C5BEA Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C55E1 Local Header Offset   00000431 (1073)\n-C55E5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C5BEE Local Header Offset   00000431 (1073)\n+C5BF2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC55E5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC5BF2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC55E5: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC5BF2: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC55BD: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC5BCA: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C561D CENTRAL HEADER #14    02014B50 (33639248)\n-C5621 Created Zip Spec      14 (20) '2.0'\n-C5622 Created OS            03 (3) 'Unix'\n-C5623 Extract Zip Spec      0A (10) '1.0'\n-C5624 Extract OS            00 (0) 'MS-DOS'\n-C5625 General Purpose Flag  0800 (2048)\n+C5C2A CENTRAL HEADER #14    02014B50 (33639248)\n+C5C2E Created Zip Spec      14 (20) '2.0'\n+C5C2F Created OS            03 (3) 'Unix'\n+C5C30 Extract Zip Spec      0A (10) '1.0'\n+C5C31 Extract OS            00 (0) 'MS-DOS'\n+C5C32 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C5627 Compression Method    0000 (0) 'Stored'\n-C5629 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C562D CRC                   00000000 (0)\n-C5631 Compressed Size       00000000 (0)\n-C5635 Uncompressed Size     00000000 (0)\n-C5639 Filename Length       0068 (104)\n-C563B Extra Length          0000 (0)\n-C563D Comment Length        0000 (0)\n-C563F Disk Start            0000 (0)\n-C5641 Int File Attributes   0000 (0)\n+C5C34 Compression Method    0000 (0) 'Stored'\n+C5C36 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C5C3A CRC                   00000000 (0)\n+C5C3E Compressed Size       00000000 (0)\n+C5C42 Uncompressed Size     00000000 (0)\n+C5C46 Filename Length       0068 (104)\n+C5C48 Extra Length          0000 (0)\n+C5C4A Comment Length        0000 (0)\n+C5C4C Disk Start            0000 (0)\n+C5C4E Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C5643 Ext File Attributes   41ED0010 (1106051088)\n+C5C50 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C5647 Local Header Offset   00000487 (1159)\n-C564B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C5C54 Local Header Offset   00000487 (1159)\n+C5C58 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC564B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC5C58: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC564B: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC5C58: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC5623: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC5C30: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C56B3 CENTRAL HEADER #15    02014B50 (33639248)\n-C56B7 Created Zip Spec      14 (20) '2.0'\n-C56B8 Created OS            03 (3) 'Unix'\n-C56B9 Extract Zip Spec      0A (10) '1.0'\n-C56BA Extract OS            00 (0) 'MS-DOS'\n-C56BB General Purpose Flag  0800 (2048)\n+C5CC0 CENTRAL HEADER #15    02014B50 (33639248)\n+C5CC4 Created Zip Spec      14 (20) '2.0'\n+C5CC5 Created OS            03 (3) 'Unix'\n+C5CC6 Extract Zip Spec      0A (10) '1.0'\n+C5CC7 Extract OS            00 (0) 'MS-DOS'\n+C5CC8 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C56BD Compression Method    0000 (0) 'Stored'\n-C56BF Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C56C3 CRC                   00000000 (0)\n-C56C7 Compressed Size       00000000 (0)\n-C56CB Uncompressed Size     00000000 (0)\n-C56CF Filename Length       0022 (34)\n-C56D1 Extra Length          0000 (0)\n-C56D3 Comment Length        0000 (0)\n-C56D5 Disk Start            0000 (0)\n-C56D7 Int File Attributes   0000 (0)\n+C5CCA Compression Method    0000 (0) 'Stored'\n+C5CCC Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C5CD0 CRC                   00000000 (0)\n+C5CD4 Compressed Size       00000000 (0)\n+C5CD8 Uncompressed Size     00000000 (0)\n+C5CDC Filename Length       0022 (34)\n+C5CDE Extra Length          0000 (0)\n+C5CE0 Comment Length        0000 (0)\n+C5CE2 Disk Start            0000 (0)\n+C5CE4 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C56D9 Ext File Attributes   41ED0010 (1106051088)\n+C5CE6 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C56DD Local Header Offset   0000050D (1293)\n-C56E1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C5CEA Local Header Offset   0000050D (1293)\n+C5CEE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC56E1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC5CEE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC56E1: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC5CEE: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC56B9: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC5CC6: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C5703 CENTRAL HEADER #16    02014B50 (33639248)\n-C5707 Created Zip Spec      14 (20) '2.0'\n-C5708 Created OS            03 (3) 'Unix'\n-C5709 Extract Zip Spec      0A (10) '1.0'\n-C570A Extract OS            00 (0) 'MS-DOS'\n-C570B General Purpose Flag  0800 (2048)\n+C5D10 CENTRAL HEADER #16    02014B50 (33639248)\n+C5D14 Created Zip Spec      14 (20) '2.0'\n+C5D15 Created OS            03 (3) 'Unix'\n+C5D16 Extract Zip Spec      0A (10) '1.0'\n+C5D17 Extract OS            00 (0) 'MS-DOS'\n+C5D18 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C570D Compression Method    0000 (0) 'Stored'\n-C570F Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C5713 CRC                   00000000 (0)\n-C5717 Compressed Size       00000000 (0)\n-C571B Uncompressed Size     00000000 (0)\n-C571F Filename Length       002B (43)\n-C5721 Extra Length          0000 (0)\n-C5723 Comment Length        0000 (0)\n-C5725 Disk Start            0000 (0)\n-C5727 Int File Attributes   0000 (0)\n+C5D1A Compression Method    0000 (0) 'Stored'\n+C5D1C Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C5D20 CRC                   00000000 (0)\n+C5D24 Compressed Size       00000000 (0)\n+C5D28 Uncompressed Size     00000000 (0)\n+C5D2C Filename Length       002B (43)\n+C5D2E Extra Length          0000 (0)\n+C5D30 Comment Length        0000 (0)\n+C5D32 Disk Start            0000 (0)\n+C5D34 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C5729 Ext File Attributes   41ED0010 (1106051088)\n+C5D36 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C572D Local Header Offset   0000054D (1357)\n-C5731 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C5D3A Local Header Offset   0000054D (1357)\n+C5D3E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC5731: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC5D3E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC5731: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC5D3E: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC5709: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC5D16: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C575C CENTRAL HEADER #17    02014B50 (33639248)\n-C5760 Created Zip Spec      14 (20) '2.0'\n-C5761 Created OS            03 (3) 'Unix'\n-C5762 Extract Zip Spec      0A (10) '1.0'\n-C5763 Extract OS            00 (0) 'MS-DOS'\n-C5764 General Purpose Flag  0800 (2048)\n+C5D69 CENTRAL HEADER #17    02014B50 (33639248)\n+C5D6D Created Zip Spec      14 (20) '2.0'\n+C5D6E Created OS            03 (3) 'Unix'\n+C5D6F Extract Zip Spec      0A (10) '1.0'\n+C5D70 Extract OS            00 (0) 'MS-DOS'\n+C5D71 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C5766 Compression Method    0000 (0) 'Stored'\n-C5768 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C576C CRC                   00000000 (0)\n-C5770 Compressed Size       00000000 (0)\n-C5774 Uncompressed Size     00000000 (0)\n-C5778 Filename Length       0065 (101)\n-C577A Extra Length          0000 (0)\n-C577C Comment Length        0000 (0)\n-C577E Disk Start            0000 (0)\n-C5780 Int File Attributes   0000 (0)\n+C5D73 Compression Method    0000 (0) 'Stored'\n+C5D75 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C5D79 CRC                   00000000 (0)\n+C5D7D Compressed Size       00000000 (0)\n+C5D81 Uncompressed Size     00000000 (0)\n+C5D85 Filename Length       0065 (101)\n+C5D87 Extra Length          0000 (0)\n+C5D89 Comment Length        0000 (0)\n+C5D8B Disk Start            0000 (0)\n+C5D8D Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C5782 Ext File Attributes   41ED0010 (1106051088)\n+C5D8F Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C5786 Local Header Offset   00000596 (1430)\n-C578A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C5D93 Local Header Offset   00000596 (1430)\n+C5D97 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC578A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC5D97: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC578A: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC5D97: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC5762: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC5D6F: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C57EF CENTRAL HEADER #18    02014B50 (33639248)\n-C57F3 Created Zip Spec      14 (20) '2.0'\n-C57F4 Created OS            03 (3) 'Unix'\n-C57F5 Extract Zip Spec      0A (10) '1.0'\n-C57F6 Extract OS            00 (0) 'MS-DOS'\n-C57F7 General Purpose Flag  0800 (2048)\n+C5DFC CENTRAL HEADER #18    02014B50 (33639248)\n+C5E00 Created Zip Spec      14 (20) '2.0'\n+C5E01 Created OS            03 (3) 'Unix'\n+C5E02 Extract Zip Spec      0A (10) '1.0'\n+C5E03 Extract OS            00 (0) 'MS-DOS'\n+C5E04 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C57F9 Compression Method    0000 (0) 'Stored'\n-C57FB Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C57FF CRC                   00000000 (0)\n-C5803 Compressed Size       00000000 (0)\n-C5807 Uncompressed Size     00000000 (0)\n-C580B Filename Length       006E (110)\n-C580D Extra Length          0000 (0)\n-C580F Comment Length        0000 (0)\n-C5811 Disk Start            0000 (0)\n-C5813 Int File Attributes   0000 (0)\n+C5E06 Compression Method    0000 (0) 'Stored'\n+C5E08 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C5E0C CRC                   00000000 (0)\n+C5E10 Compressed Size       00000000 (0)\n+C5E14 Uncompressed Size     00000000 (0)\n+C5E18 Filename Length       006E (110)\n+C5E1A Extra Length          0000 (0)\n+C5E1C Comment Length        0000 (0)\n+C5E1E Disk Start            0000 (0)\n+C5E20 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C5815 Ext File Attributes   41ED0010 (1106051088)\n+C5E22 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C5819 Local Header Offset   00000619 (1561)\n-C581D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C5E26 Local Header Offset   00000619 (1561)\n+C5E2A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC581D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC5E2A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC581D: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC5E2A: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC57F5: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC5E02: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C588B CENTRAL HEADER #19    02014B50 (33639248)\n-C588F Created Zip Spec      14 (20) '2.0'\n-C5890 Created OS            03 (3) 'Unix'\n-C5891 Extract Zip Spec      0A (10) '1.0'\n-C5892 Extract OS            00 (0) 'MS-DOS'\n-C5893 General Purpose Flag  0800 (2048)\n+C5E98 CENTRAL HEADER #19    02014B50 (33639248)\n+C5E9C Created Zip Spec      14 (20) '2.0'\n+C5E9D Created OS            03 (3) 'Unix'\n+C5E9E Extract Zip Spec      0A (10) '1.0'\n+C5E9F Extract OS            00 (0) 'MS-DOS'\n+C5EA0 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C5895 Compression Method    0000 (0) 'Stored'\n-C5897 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C589B CRC                   00000000 (0)\n-C589F Compressed Size       00000000 (0)\n-C58A3 Uncompressed Size     00000000 (0)\n-C58A7 Filename Length       0068 (104)\n-C58A9 Extra Length          0000 (0)\n-C58AB Comment Length        0000 (0)\n-C58AD Disk Start            0000 (0)\n-C58AF Int File Attributes   0000 (0)\n+C5EA2 Compression Method    0000 (0) 'Stored'\n+C5EA4 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C5EA8 CRC                   00000000 (0)\n+C5EAC Compressed Size       00000000 (0)\n+C5EB0 Uncompressed Size     00000000 (0)\n+C5EB4 Filename Length       0068 (104)\n+C5EB6 Extra Length          0000 (0)\n+C5EB8 Comment Length        0000 (0)\n+C5EBA Disk Start            0000 (0)\n+C5EBC Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C58B1 Ext File Attributes   41ED0010 (1106051088)\n+C5EBE Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C58B5 Local Header Offset   000006A5 (1701)\n-C58B9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C5EC2 Local Header Offset   000006A5 (1701)\n+C5EC6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC58B9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC5EC6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC58B9: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC5EC6: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC5891: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC5E9E: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C5921 CENTRAL HEADER #20    02014B50 (33639248)\n-C5925 Created Zip Spec      14 (20) '2.0'\n-C5926 Created OS            03 (3) 'Unix'\n-C5927 Extract Zip Spec      0A (10) '1.0'\n-C5928 Extract OS            00 (0) 'MS-DOS'\n-C5929 General Purpose Flag  0800 (2048)\n+C5F2E CENTRAL HEADER #20    02014B50 (33639248)\n+C5F32 Created Zip Spec      14 (20) '2.0'\n+C5F33 Created OS            03 (3) 'Unix'\n+C5F34 Extract Zip Spec      0A (10) '1.0'\n+C5F35 Extract OS            00 (0) 'MS-DOS'\n+C5F36 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C592B Compression Method    0000 (0) 'Stored'\n-C592D Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C5931 CRC                   00000000 (0)\n-C5935 Compressed Size       00000000 (0)\n-C5939 Uncompressed Size     00000000 (0)\n-C593D Filename Length       0064 (100)\n-C593F Extra Length          0000 (0)\n-C5941 Comment Length        0000 (0)\n-C5943 Disk Start            0000 (0)\n-C5945 Int File Attributes   0000 (0)\n+C5F38 Compression Method    0000 (0) 'Stored'\n+C5F3A Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C5F3E CRC                   00000000 (0)\n+C5F42 Compressed Size       00000000 (0)\n+C5F46 Uncompressed Size     00000000 (0)\n+C5F4A Filename Length       0064 (100)\n+C5F4C Extra Length          0000 (0)\n+C5F4E Comment Length        0000 (0)\n+C5F50 Disk Start            0000 (0)\n+C5F52 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C5947 Ext File Attributes   41ED0010 (1106051088)\n+C5F54 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C594B Local Header Offset   0000072B (1835)\n-C594F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C5F58 Local Header Offset   0000072B (1835)\n+C5F5C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC594F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC5F5C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC594F: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC5F5C: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC5927: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC5F34: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C59B3 CENTRAL HEADER #21    02014B50 (33639248)\n-C59B7 Created Zip Spec      14 (20) '2.0'\n-C59B8 Created OS            03 (3) 'Unix'\n-C59B9 Extract Zip Spec      0A (10) '1.0'\n-C59BA Extract OS            00 (0) 'MS-DOS'\n-C59BB General Purpose Flag  0800 (2048)\n+C5FC0 CENTRAL HEADER #21    02014B50 (33639248)\n+C5FC4 Created Zip Spec      14 (20) '2.0'\n+C5FC5 Created OS            03 (3) 'Unix'\n+C5FC6 Extract Zip Spec      0A (10) '1.0'\n+C5FC7 Extract OS            00 (0) 'MS-DOS'\n+C5FC8 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C59BD Compression Method    0000 (0) 'Stored'\n-C59BF Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C59C3 CRC                   00000000 (0)\n-C59C7 Compressed Size       00000000 (0)\n-C59CB Uncompressed Size     00000000 (0)\n-C59CF Filename Length       006E (110)\n-C59D1 Extra Length          0000 (0)\n-C59D3 Comment Length        0000 (0)\n-C59D5 Disk Start            0000 (0)\n-C59D7 Int File Attributes   0000 (0)\n+C5FCA Compression Method    0000 (0) 'Stored'\n+C5FCC Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C5FD0 CRC                   00000000 (0)\n+C5FD4 Compressed Size       00000000 (0)\n+C5FD8 Uncompressed Size     00000000 (0)\n+C5FDC Filename Length       006E (110)\n+C5FDE Extra Length          0000 (0)\n+C5FE0 Comment Length        0000 (0)\n+C5FE2 Disk Start            0000 (0)\n+C5FE4 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C59D9 Ext File Attributes   41ED0010 (1106051088)\n+C5FE6 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C59DD Local Header Offset   000007AD (1965)\n-C59E1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C5FEA Local Header Offset   000007AD (1965)\n+C5FEE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC59E1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC5FEE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC59E1: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC5FEE: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC59B9: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC5FC6: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C5A4F CENTRAL HEADER #22    02014B50 (33639248)\n-C5A53 Created Zip Spec      14 (20) '2.0'\n-C5A54 Created OS            03 (3) 'Unix'\n-C5A55 Extract Zip Spec      0A (10) '1.0'\n-C5A56 Extract OS            00 (0) 'MS-DOS'\n-C5A57 General Purpose Flag  0800 (2048)\n+C605C CENTRAL HEADER #22    02014B50 (33639248)\n+C6060 Created Zip Spec      14 (20) '2.0'\n+C6061 Created OS            03 (3) 'Unix'\n+C6062 Extract Zip Spec      0A (10) '1.0'\n+C6063 Extract OS            00 (0) 'MS-DOS'\n+C6064 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C5A59 Compression Method    0000 (0) 'Stored'\n-C5A5B Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C5A5F CRC                   00000000 (0)\n-C5A63 Compressed Size       00000000 (0)\n-C5A67 Uncompressed Size     00000000 (0)\n-C5A6B Filename Length       006A (106)\n-C5A6D Extra Length          0000 (0)\n-C5A6F Comment Length        0000 (0)\n-C5A71 Disk Start            0000 (0)\n-C5A73 Int File Attributes   0000 (0)\n+C6066 Compression Method    0000 (0) 'Stored'\n+C6068 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C606C CRC                   00000000 (0)\n+C6070 Compressed Size       00000000 (0)\n+C6074 Uncompressed Size     00000000 (0)\n+C6078 Filename Length       006A (106)\n+C607A Extra Length          0000 (0)\n+C607C Comment Length        0000 (0)\n+C607E Disk Start            0000 (0)\n+C6080 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C5A75 Ext File Attributes   41ED0010 (1106051088)\n+C6082 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C5A79 Local Header Offset   00000839 (2105)\n-C5A7D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C6086 Local Header Offset   00000839 (2105)\n+C608A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC5A7D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC608A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC5A7D: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC608A: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC5A55: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC6062: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C5AE7 CENTRAL HEADER #23    02014B50 (33639248)\n-C5AEB Created Zip Spec      14 (20) '2.0'\n-C5AEC Created OS            03 (3) 'Unix'\n-C5AED Extract Zip Spec      0A (10) '1.0'\n-C5AEE Extract OS            00 (0) 'MS-DOS'\n-C5AEF General Purpose Flag  0800 (2048)\n+C60F4 CENTRAL HEADER #23    02014B50 (33639248)\n+C60F8 Created Zip Spec      14 (20) '2.0'\n+C60F9 Created OS            03 (3) 'Unix'\n+C60FA Extract Zip Spec      0A (10) '1.0'\n+C60FB Extract OS            00 (0) 'MS-DOS'\n+C60FC General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C5AF1 Compression Method    0000 (0) 'Stored'\n-C5AF3 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C5AF7 CRC                   00000000 (0)\n-C5AFB Compressed Size       00000000 (0)\n-C5AFF Uncompressed Size     00000000 (0)\n-C5B03 Filename Length       0072 (114)\n-C5B05 Extra Length          0000 (0)\n-C5B07 Comment Length        0000 (0)\n-C5B09 Disk Start            0000 (0)\n-C5B0B Int File Attributes   0000 (0)\n+C60FE Compression Method    0000 (0) 'Stored'\n+C6100 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C6104 CRC                   00000000 (0)\n+C6108 Compressed Size       00000000 (0)\n+C610C Uncompressed Size     00000000 (0)\n+C6110 Filename Length       0072 (114)\n+C6112 Extra Length          0000 (0)\n+C6114 Comment Length        0000 (0)\n+C6116 Disk Start            0000 (0)\n+C6118 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C5B0D Ext File Attributes   41ED0010 (1106051088)\n+C611A Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C5B11 Local Header Offset   000008C1 (2241)\n-C5B15 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C611E Local Header Offset   000008C1 (2241)\n+C6122 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC5B15: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC6122: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC5B15: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC6122: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC5AED: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC60FA: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C5B87 CENTRAL HEADER #24    02014B50 (33639248)\n-C5B8B Created Zip Spec      14 (20) '2.0'\n-C5B8C Created OS            03 (3) 'Unix'\n-C5B8D Extract Zip Spec      0A (10) '1.0'\n-C5B8E Extract OS            00 (0) 'MS-DOS'\n-C5B8F General Purpose Flag  0800 (2048)\n+C6194 CENTRAL HEADER #24    02014B50 (33639248)\n+C6198 Created Zip Spec      14 (20) '2.0'\n+C6199 Created OS            03 (3) 'Unix'\n+C619A Extract Zip Spec      0A (10) '1.0'\n+C619B Extract OS            00 (0) 'MS-DOS'\n+C619C General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C5B91 Compression Method    0000 (0) 'Stored'\n-C5B93 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C5B97 CRC                   00000000 (0)\n-C5B9B Compressed Size       00000000 (0)\n-C5B9F Uncompressed Size     00000000 (0)\n-C5BA3 Filename Length       006E (110)\n-C5BA5 Extra Length          0000 (0)\n-C5BA7 Comment Length        0000 (0)\n-C5BA9 Disk Start            0000 (0)\n-C5BAB Int File Attributes   0000 (0)\n+C619E Compression Method    0000 (0) 'Stored'\n+C61A0 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C61A4 CRC                   00000000 (0)\n+C61A8 Compressed Size       00000000 (0)\n+C61AC Uncompressed Size     00000000 (0)\n+C61B0 Filename Length       006E (110)\n+C61B2 Extra Length          0000 (0)\n+C61B4 Comment Length        0000 (0)\n+C61B6 Disk Start            0000 (0)\n+C61B8 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C5BAD Ext File Attributes   41ED0010 (1106051088)\n+C61BA Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C5BB1 Local Header Offset   00000951 (2385)\n-C5BB5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C61BE Local Header Offset   00000951 (2385)\n+C61C2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC5BB5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC61C2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC5BB5: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC61C2: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC5B8D: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC619A: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C5C23 CENTRAL HEADER #25    02014B50 (33639248)\n-C5C27 Created Zip Spec      14 (20) '2.0'\n-C5C28 Created OS            03 (3) 'Unix'\n-C5C29 Extract Zip Spec      0A (10) '1.0'\n-C5C2A Extract OS            00 (0) 'MS-DOS'\n-C5C2B General Purpose Flag  0800 (2048)\n+C6230 CENTRAL HEADER #25    02014B50 (33639248)\n+C6234 Created Zip Spec      14 (20) '2.0'\n+C6235 Created OS            03 (3) 'Unix'\n+C6236 Extract Zip Spec      0A (10) '1.0'\n+C6237 Extract OS            00 (0) 'MS-DOS'\n+C6238 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C5C2D Compression Method    0000 (0) 'Stored'\n-C5C2F Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C5C33 CRC                   00000000 (0)\n-C5C37 Compressed Size       00000000 (0)\n-C5C3B Uncompressed Size     00000000 (0)\n-C5C3F Filename Length       0070 (112)\n-C5C41 Extra Length          0000 (0)\n-C5C43 Comment Length        0000 (0)\n-C5C45 Disk Start            0000 (0)\n-C5C47 Int File Attributes   0000 (0)\n+C623A Compression Method    0000 (0) 'Stored'\n+C623C Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C6240 CRC                   00000000 (0)\n+C6244 Compressed Size       00000000 (0)\n+C6248 Uncompressed Size     00000000 (0)\n+C624C Filename Length       0070 (112)\n+C624E Extra Length          0000 (0)\n+C6250 Comment Length        0000 (0)\n+C6252 Disk Start            0000 (0)\n+C6254 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C5C49 Ext File Attributes   41ED0010 (1106051088)\n+C6256 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C5C4D Local Header Offset   000009DD (2525)\n-C5C51 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C625A Local Header Offset   000009DD (2525)\n+C625E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC5C51: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC625E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC5C51: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC625E: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC5C29: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC6236: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C5CC1 CENTRAL HEADER #26    02014B50 (33639248)\n-C5CC5 Created Zip Spec      14 (20) '2.0'\n-C5CC6 Created OS            03 (3) 'Unix'\n-C5CC7 Extract Zip Spec      0A (10) '1.0'\n-C5CC8 Extract OS            00 (0) 'MS-DOS'\n-C5CC9 General Purpose Flag  0800 (2048)\n+C62CE CENTRAL HEADER #26    02014B50 (33639248)\n+C62D2 Created Zip Spec      14 (20) '2.0'\n+C62D3 Created OS            03 (3) 'Unix'\n+C62D4 Extract Zip Spec      0A (10) '1.0'\n+C62D5 Extract OS            00 (0) 'MS-DOS'\n+C62D6 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C5CCB Compression Method    0000 (0) 'Stored'\n-C5CCD Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C5CD1 CRC                   00000000 (0)\n-C5CD5 Compressed Size       00000000 (0)\n-C5CD9 Uncompressed Size     00000000 (0)\n-C5CDD Filename Length       006C (108)\n-C5CDF Extra Length          0000 (0)\n-C5CE1 Comment Length        0000 (0)\n-C5CE3 Disk Start            0000 (0)\n-C5CE5 Int File Attributes   0000 (0)\n+C62D8 Compression Method    0000 (0) 'Stored'\n+C62DA Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C62DE CRC                   00000000 (0)\n+C62E2 Compressed Size       00000000 (0)\n+C62E6 Uncompressed Size     00000000 (0)\n+C62EA Filename Length       006C (108)\n+C62EC Extra Length          0000 (0)\n+C62EE Comment Length        0000 (0)\n+C62F0 Disk Start            0000 (0)\n+C62F2 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C5CE7 Ext File Attributes   41ED0010 (1106051088)\n+C62F4 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C5CEB Local Header Offset   00000A6B (2667)\n-C5CEF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C62F8 Local Header Offset   00000A6B (2667)\n+C62FC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC5CEF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC62FC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC5CEF: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC62FC: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC5CC7: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC62D4: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C5D5B CENTRAL HEADER #27    02014B50 (33639248)\n-C5D5F Created Zip Spec      14 (20) '2.0'\n-C5D60 Created OS            03 (3) 'Unix'\n-C5D61 Extract Zip Spec      0A (10) '1.0'\n-C5D62 Extract OS            00 (0) 'MS-DOS'\n-C5D63 General Purpose Flag  0800 (2048)\n+C6368 CENTRAL HEADER #27    02014B50 (33639248)\n+C636C Created Zip Spec      14 (20) '2.0'\n+C636D Created OS            03 (3) 'Unix'\n+C636E Extract Zip Spec      0A (10) '1.0'\n+C636F Extract OS            00 (0) 'MS-DOS'\n+C6370 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C5D65 Compression Method    0000 (0) 'Stored'\n-C5D67 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C5D6B CRC                   00000000 (0)\n-C5D6F Compressed Size       00000000 (0)\n-C5D73 Uncompressed Size     00000000 (0)\n-C5D77 Filename Length       0054 (84)\n-C5D79 Extra Length          0000 (0)\n-C5D7B Comment Length        0000 (0)\n-C5D7D Disk Start            0000 (0)\n-C5D7F Int File Attributes   0000 (0)\n+C6372 Compression Method    0000 (0) 'Stored'\n+C6374 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C6378 CRC                   00000000 (0)\n+C637C Compressed Size       00000000 (0)\n+C6380 Uncompressed Size     00000000 (0)\n+C6384 Filename Length       0054 (84)\n+C6386 Extra Length          0000 (0)\n+C6388 Comment Length        0000 (0)\n+C638A Disk Start            0000 (0)\n+C638C Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C5D81 Ext File Attributes   41ED0010 (1106051088)\n+C638E Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C5D85 Local Header Offset   00000AF5 (2805)\n-C5D89 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C6392 Local Header Offset   00000AF5 (2805)\n+C6396 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC5D89: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC6396: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC5D89: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC6396: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC5D61: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC636E: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C5DDD CENTRAL HEADER #28    02014B50 (33639248)\n-C5DE1 Created Zip Spec      14 (20) '2.0'\n-C5DE2 Created OS            03 (3) 'Unix'\n-C5DE3 Extract Zip Spec      0A (10) '1.0'\n-C5DE4 Extract OS            00 (0) 'MS-DOS'\n-C5DE5 General Purpose Flag  0800 (2048)\n+C63EA CENTRAL HEADER #28    02014B50 (33639248)\n+C63EE Created Zip Spec      14 (20) '2.0'\n+C63EF Created OS            03 (3) 'Unix'\n+C63F0 Extract Zip Spec      0A (10) '1.0'\n+C63F1 Extract OS            00 (0) 'MS-DOS'\n+C63F2 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C5DE7 Compression Method    0000 (0) 'Stored'\n-C5DE9 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C5DED CRC                   00000000 (0)\n-C5DF1 Compressed Size       00000000 (0)\n-C5DF5 Uncompressed Size     00000000 (0)\n-C5DF9 Filename Length       0059 (89)\n-C5DFB Extra Length          0000 (0)\n-C5DFD Comment Length        0000 (0)\n-C5DFF Disk Start            0000 (0)\n-C5E01 Int File Attributes   0000 (0)\n+C63F4 Compression Method    0000 (0) 'Stored'\n+C63F6 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C63FA CRC                   00000000 (0)\n+C63FE Compressed Size       00000000 (0)\n+C6402 Uncompressed Size     00000000 (0)\n+C6406 Filename Length       0059 (89)\n+C6408 Extra Length          0000 (0)\n+C640A Comment Length        0000 (0)\n+C640C Disk Start            0000 (0)\n+C640E Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C5E03 Ext File Attributes   41ED0010 (1106051088)\n+C6410 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C5E07 Local Header Offset   00000B67 (2919)\n-C5E0B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C6414 Local Header Offset   00000B67 (2919)\n+C6418 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC5E0B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC6418: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC5E0B: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC6418: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC5DE3: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC63F0: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C5E64 CENTRAL HEADER #29    02014B50 (33639248)\n-C5E68 Created Zip Spec      14 (20) '2.0'\n-C5E69 Created OS            03 (3) 'Unix'\n-C5E6A Extract Zip Spec      0A (10) '1.0'\n-C5E6B Extract OS            00 (0) 'MS-DOS'\n-C5E6C General Purpose Flag  0800 (2048)\n+C6471 CENTRAL HEADER #29    02014B50 (33639248)\n+C6475 Created Zip Spec      14 (20) '2.0'\n+C6476 Created OS            03 (3) 'Unix'\n+C6477 Extract Zip Spec      0A (10) '1.0'\n+C6478 Extract OS            00 (0) 'MS-DOS'\n+C6479 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C5E6E Compression Method    0000 (0) 'Stored'\n-C5E70 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C5E74 CRC                   00000000 (0)\n-C5E78 Compressed Size       00000000 (0)\n-C5E7C Uncompressed Size     00000000 (0)\n-C5E80 Filename Length       0074 (116)\n-C5E82 Extra Length          0000 (0)\n-C5E84 Comment Length        0000 (0)\n-C5E86 Disk Start            0000 (0)\n-C5E88 Int File Attributes   0000 (0)\n+C647B Compression Method    0000 (0) 'Stored'\n+C647D Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C6481 CRC                   00000000 (0)\n+C6485 Compressed Size       00000000 (0)\n+C6489 Uncompressed Size     00000000 (0)\n+C648D Filename Length       0074 (116)\n+C648F Extra Length          0000 (0)\n+C6491 Comment Length        0000 (0)\n+C6493 Disk Start            0000 (0)\n+C6495 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C5E8A Ext File Attributes   41ED0010 (1106051088)\n+C6497 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C5E8E Local Header Offset   00000BDE (3038)\n-C5E92 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C649B Local Header Offset   00000BDE (3038)\n+C649F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC5E92: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC649F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC5E92: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC649F: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC5E6A: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC6477: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C5F06 CENTRAL HEADER #30    02014B50 (33639248)\n-C5F0A Created Zip Spec      14 (20) '2.0'\n-C5F0B Created OS            03 (3) 'Unix'\n-C5F0C Extract Zip Spec      0A (10) '1.0'\n-C5F0D Extract OS            00 (0) 'MS-DOS'\n-C5F0E General Purpose Flag  0800 (2048)\n+C6513 CENTRAL HEADER #30    02014B50 (33639248)\n+C6517 Created Zip Spec      14 (20) '2.0'\n+C6518 Created OS            03 (3) 'Unix'\n+C6519 Extract Zip Spec      0A (10) '1.0'\n+C651A Extract OS            00 (0) 'MS-DOS'\n+C651B General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C5F10 Compression Method    0000 (0) 'Stored'\n-C5F12 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C5F16 CRC                   00000000 (0)\n-C5F1A Compressed Size       00000000 (0)\n-C5F1E Uncompressed Size     00000000 (0)\n-C5F22 Filename Length       0024 (36)\n-C5F24 Extra Length          0000 (0)\n-C5F26 Comment Length        0000 (0)\n-C5F28 Disk Start            0000 (0)\n-C5F2A Int File Attributes   0000 (0)\n+C651D Compression Method    0000 (0) 'Stored'\n+C651F Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C6523 CRC                   00000000 (0)\n+C6527 Compressed Size       00000000 (0)\n+C652B Uncompressed Size     00000000 (0)\n+C652F Filename Length       0024 (36)\n+C6531 Extra Length          0000 (0)\n+C6533 Comment Length        0000 (0)\n+C6535 Disk Start            0000 (0)\n+C6537 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C5F2C Ext File Attributes   41ED0010 (1106051088)\n+C6539 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C5F30 Local Header Offset   00000C70 (3184)\n-C5F34 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C653D Local Header Offset   00000C70 (3184)\n+C6541 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC5F34: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC6541: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC5F34: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC6541: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC5F0C: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC6519: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C5F58 CENTRAL HEADER #31    02014B50 (33639248)\n-C5F5C Created Zip Spec      14 (20) '2.0'\n-C5F5D Created OS            03 (3) 'Unix'\n-C5F5E Extract Zip Spec      0A (10) '1.0'\n-C5F5F Extract OS            00 (0) 'MS-DOS'\n-C5F60 General Purpose Flag  0800 (2048)\n+C6565 CENTRAL HEADER #31    02014B50 (33639248)\n+C6569 Created Zip Spec      14 (20) '2.0'\n+C656A Created OS            03 (3) 'Unix'\n+C656B Extract Zip Spec      0A (10) '1.0'\n+C656C Extract OS            00 (0) 'MS-DOS'\n+C656D General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C5F62 Compression Method    0000 (0) 'Stored'\n-C5F64 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C5F68 CRC                   00000000 (0)\n-C5F6C Compressed Size       00000000 (0)\n-C5F70 Uncompressed Size     00000000 (0)\n-C5F74 Filename Length       002D (45)\n-C5F76 Extra Length          0000 (0)\n-C5F78 Comment Length        0000 (0)\n-C5F7A Disk Start            0000 (0)\n-C5F7C Int File Attributes   0000 (0)\n+C656F Compression Method    0000 (0) 'Stored'\n+C6571 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C6575 CRC                   00000000 (0)\n+C6579 Compressed Size       00000000 (0)\n+C657D Uncompressed Size     00000000 (0)\n+C6581 Filename Length       002D (45)\n+C6583 Extra Length          0000 (0)\n+C6585 Comment Length        0000 (0)\n+C6587 Disk Start            0000 (0)\n+C6589 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C5F7E Ext File Attributes   41ED0010 (1106051088)\n+C658B Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C5F82 Local Header Offset   00000CB2 (3250)\n-C5F86 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C658F Local Header Offset   00000CB2 (3250)\n+C6593 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC5F86: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC6593: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC5F86: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC6593: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC5F5E: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC656B: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C5FB3 CENTRAL HEADER #32    02014B50 (33639248)\n-C5FB7 Created Zip Spec      14 (20) '2.0'\n-C5FB8 Created OS            03 (3) 'Unix'\n-C5FB9 Extract Zip Spec      0A (10) '1.0'\n-C5FBA Extract OS            00 (0) 'MS-DOS'\n-C5FBB General Purpose Flag  0800 (2048)\n+C65C0 CENTRAL HEADER #32    02014B50 (33639248)\n+C65C4 Created Zip Spec      14 (20) '2.0'\n+C65C5 Created OS            03 (3) 'Unix'\n+C65C6 Extract Zip Spec      0A (10) '1.0'\n+C65C7 Extract OS            00 (0) 'MS-DOS'\n+C65C8 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C5FBD Compression Method    0000 (0) 'Stored'\n-C5FBF Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C5FC3 CRC                   00000000 (0)\n-C5FC7 Compressed Size       00000000 (0)\n-C5FCB Uncompressed Size     00000000 (0)\n-C5FCF Filename Length       006E (110)\n-C5FD1 Extra Length          0000 (0)\n-C5FD3 Comment Length        0000 (0)\n-C5FD5 Disk Start            0000 (0)\n-C5FD7 Int File Attributes   0000 (0)\n+C65CA Compression Method    0000 (0) 'Stored'\n+C65CC Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C65D0 CRC                   00000000 (0)\n+C65D4 Compressed Size       00000000 (0)\n+C65D8 Uncompressed Size     00000000 (0)\n+C65DC Filename Length       006E (110)\n+C65DE Extra Length          0000 (0)\n+C65E0 Comment Length        0000 (0)\n+C65E2 Disk Start            0000 (0)\n+C65E4 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C5FD9 Ext File Attributes   41ED0010 (1106051088)\n+C65E6 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C5FDD Local Header Offset   00000CFD (3325)\n-C5FE1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C65EA Local Header Offset   00000CFD (3325)\n+C65EE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC5FE1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC65EE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC5FE1: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC65EE: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC5FB9: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC65C6: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C604F CENTRAL HEADER #33    02014B50 (33639248)\n-C6053 Created Zip Spec      14 (20) '2.0'\n-C6054 Created OS            03 (3) 'Unix'\n-C6055 Extract Zip Spec      0A (10) '1.0'\n-C6056 Extract OS            00 (0) 'MS-DOS'\n-C6057 General Purpose Flag  0800 (2048)\n+C665C CENTRAL HEADER #33    02014B50 (33639248)\n+C6660 Created Zip Spec      14 (20) '2.0'\n+C6661 Created OS            03 (3) 'Unix'\n+C6662 Extract Zip Spec      0A (10) '1.0'\n+C6663 Extract OS            00 (0) 'MS-DOS'\n+C6664 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C6059 Compression Method    0000 (0) 'Stored'\n-C605B Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C605F CRC                   00000000 (0)\n-C6063 Compressed Size       00000000 (0)\n-C6067 Uncompressed Size     00000000 (0)\n-C606B Filename Length       0075 (117)\n-C606D Extra Length          0000 (0)\n-C606F Comment Length        0000 (0)\n-C6071 Disk Start            0000 (0)\n-C6073 Int File Attributes   0000 (0)\n+C6666 Compression Method    0000 (0) 'Stored'\n+C6668 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C666C CRC                   00000000 (0)\n+C6670 Compressed Size       00000000 (0)\n+C6674 Uncompressed Size     00000000 (0)\n+C6678 Filename Length       0075 (117)\n+C667A Extra Length          0000 (0)\n+C667C Comment Length        0000 (0)\n+C667E Disk Start            0000 (0)\n+C6680 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C6075 Ext File Attributes   41ED0010 (1106051088)\n+C6682 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C6079 Local Header Offset   00000D89 (3465)\n-C607D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C6686 Local Header Offset   00000D89 (3465)\n+C668A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC607D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC668A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC607D: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC668A: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC6055: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC6662: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C60F2 CENTRAL HEADER #34    02014B50 (33639248)\n-C60F6 Created Zip Spec      14 (20) '2.0'\n-C60F7 Created OS            03 (3) 'Unix'\n-C60F8 Extract Zip Spec      0A (10) '1.0'\n-C60F9 Extract OS            00 (0) 'MS-DOS'\n-C60FA General Purpose Flag  0800 (2048)\n+C66FF CENTRAL HEADER #34    02014B50 (33639248)\n+C6703 Created Zip Spec      14 (20) '2.0'\n+C6704 Created OS            03 (3) 'Unix'\n+C6705 Extract Zip Spec      0A (10) '1.0'\n+C6706 Extract OS            00 (0) 'MS-DOS'\n+C6707 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C60FC Compression Method    0000 (0) 'Stored'\n-C60FE Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C6102 CRC                   00000000 (0)\n-C6106 Compressed Size       00000000 (0)\n-C610A Uncompressed Size     00000000 (0)\n-C610E Filename Length       0022 (34)\n-C6110 Extra Length          0000 (0)\n-C6112 Comment Length        0000 (0)\n-C6114 Disk Start            0000 (0)\n-C6116 Int File Attributes   0000 (0)\n+C6709 Compression Method    0000 (0) 'Stored'\n+C670B Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C670F CRC                   00000000 (0)\n+C6713 Compressed Size       00000000 (0)\n+C6717 Uncompressed Size     00000000 (0)\n+C671B Filename Length       0022 (34)\n+C671D Extra Length          0000 (0)\n+C671F Comment Length        0000 (0)\n+C6721 Disk Start            0000 (0)\n+C6723 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C6118 Ext File Attributes   41ED0010 (1106051088)\n+C6725 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C611C Local Header Offset   00000E1C (3612)\n-C6120 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C6729 Local Header Offset   00000E1C (3612)\n+C672D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC6120: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC672D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC6120: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC672D: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC60F8: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC6705: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C6142 CENTRAL HEADER #35    02014B50 (33639248)\n-C6146 Created Zip Spec      14 (20) '2.0'\n-C6147 Created OS            03 (3) 'Unix'\n-C6148 Extract Zip Spec      0A (10) '1.0'\n-C6149 Extract OS            00 (0) 'MS-DOS'\n-C614A General Purpose Flag  0800 (2048)\n+C674F CENTRAL HEADER #35    02014B50 (33639248)\n+C6753 Created Zip Spec      14 (20) '2.0'\n+C6754 Created OS            03 (3) 'Unix'\n+C6755 Extract Zip Spec      0A (10) '1.0'\n+C6756 Extract OS            00 (0) 'MS-DOS'\n+C6757 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C614C Compression Method    0000 (0) 'Stored'\n-C614E Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C6152 CRC                   00000000 (0)\n-C6156 Compressed Size       00000000 (0)\n-C615A Uncompressed Size     00000000 (0)\n-C615E Filename Length       002B (43)\n-C6160 Extra Length          0000 (0)\n-C6162 Comment Length        0000 (0)\n-C6164 Disk Start            0000 (0)\n-C6166 Int File Attributes   0000 (0)\n+C6759 Compression Method    0000 (0) 'Stored'\n+C675B Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C675F CRC                   00000000 (0)\n+C6763 Compressed Size       00000000 (0)\n+C6767 Uncompressed Size     00000000 (0)\n+C676B Filename Length       002B (43)\n+C676D Extra Length          0000 (0)\n+C676F Comment Length        0000 (0)\n+C6771 Disk Start            0000 (0)\n+C6773 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C6168 Ext File Attributes   41ED0010 (1106051088)\n+C6775 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C616C Local Header Offset   00000E5C (3676)\n-C6170 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C6779 Local Header Offset   00000E5C (3676)\n+C677D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC6170: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC677D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC6170: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC677D: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC6148: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC6755: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C619B CENTRAL HEADER #36    02014B50 (33639248)\n-C619F Created Zip Spec      14 (20) '2.0'\n-C61A0 Created OS            03 (3) 'Unix'\n-C61A1 Extract Zip Spec      0A (10) '1.0'\n-C61A2 Extract OS            00 (0) 'MS-DOS'\n-C61A3 General Purpose Flag  0800 (2048)\n+C67A8 CENTRAL HEADER #36    02014B50 (33639248)\n+C67AC Created Zip Spec      14 (20) '2.0'\n+C67AD Created OS            03 (3) 'Unix'\n+C67AE Extract Zip Spec      0A (10) '1.0'\n+C67AF Extract OS            00 (0) 'MS-DOS'\n+C67B0 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C61A5 Compression Method    0000 (0) 'Stored'\n-C61A7 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C61AB CRC                   00000000 (0)\n-C61AF Compressed Size       00000000 (0)\n-C61B3 Uncompressed Size     00000000 (0)\n-C61B7 Filename Length       0057 (87)\n-C61B9 Extra Length          0000 (0)\n-C61BB Comment Length        0000 (0)\n-C61BD Disk Start            0000 (0)\n-C61BF Int File Attributes   0000 (0)\n+C67B2 Compression Method    0000 (0) 'Stored'\n+C67B4 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C67B8 CRC                   00000000 (0)\n+C67BC Compressed Size       00000000 (0)\n+C67C0 Uncompressed Size     00000000 (0)\n+C67C4 Filename Length       0057 (87)\n+C67C6 Extra Length          0000 (0)\n+C67C8 Comment Length        0000 (0)\n+C67CA Disk Start            0000 (0)\n+C67CC Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C61C1 Ext File Attributes   41ED0010 (1106051088)\n+C67CE Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C61C5 Local Header Offset   00000EA5 (3749)\n-C61C9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C67D2 Local Header Offset   00000EA5 (3749)\n+C67D6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC61C9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC67D6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC61C9: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC67D6: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC61A1: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC67AE: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C6220 CENTRAL HEADER #37    02014B50 (33639248)\n-C6224 Created Zip Spec      14 (20) '2.0'\n-C6225 Created OS            03 (3) 'Unix'\n-C6226 Extract Zip Spec      0A (10) '1.0'\n-C6227 Extract OS            00 (0) 'MS-DOS'\n-C6228 General Purpose Flag  0800 (2048)\n+C682D CENTRAL HEADER #37    02014B50 (33639248)\n+C6831 Created Zip Spec      14 (20) '2.0'\n+C6832 Created OS            03 (3) 'Unix'\n+C6833 Extract Zip Spec      0A (10) '1.0'\n+C6834 Extract OS            00 (0) 'MS-DOS'\n+C6835 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C622A Compression Method    0000 (0) 'Stored'\n-C622C Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C6230 CRC                   00000000 (0)\n-C6234 Compressed Size       00000000 (0)\n-C6238 Uncompressed Size     00000000 (0)\n-C623C Filename Length       0056 (86)\n-C623E Extra Length          0000 (0)\n-C6240 Comment Length        0000 (0)\n-C6242 Disk Start            0000 (0)\n-C6244 Int File Attributes   0000 (0)\n+C6837 Compression Method    0000 (0) 'Stored'\n+C6839 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C683D CRC                   00000000 (0)\n+C6841 Compressed Size       00000000 (0)\n+C6845 Uncompressed Size     00000000 (0)\n+C6849 Filename Length       0056 (86)\n+C684B Extra Length          0000 (0)\n+C684D Comment Length        0000 (0)\n+C684F Disk Start            0000 (0)\n+C6851 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C6246 Ext File Attributes   41ED0010 (1106051088)\n+C6853 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C624A Local Header Offset   00000F1A (3866)\n-C624E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C6857 Local Header Offset   00000F1A (3866)\n+C685B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC624E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC685B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC624E: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC685B: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC6226: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC6833: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C62A4 CENTRAL HEADER #38    02014B50 (33639248)\n-C62A8 Created Zip Spec      14 (20) '2.0'\n-C62A9 Created OS            03 (3) 'Unix'\n-C62AA Extract Zip Spec      0A (10) '1.0'\n-C62AB Extract OS            00 (0) 'MS-DOS'\n-C62AC General Purpose Flag  0800 (2048)\n+C68B1 CENTRAL HEADER #38    02014B50 (33639248)\n+C68B5 Created Zip Spec      14 (20) '2.0'\n+C68B6 Created OS            03 (3) 'Unix'\n+C68B7 Extract Zip Spec      0A (10) '1.0'\n+C68B8 Extract OS            00 (0) 'MS-DOS'\n+C68B9 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C62AE Compression Method    0000 (0) 'Stored'\n-C62B0 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C62B4 CRC                   00000000 (0)\n-C62B8 Compressed Size       00000000 (0)\n-C62BC Uncompressed Size     00000000 (0)\n-C62C0 Filename Length       0055 (85)\n-C62C2 Extra Length          0000 (0)\n-C62C4 Comment Length        0000 (0)\n-C62C6 Disk Start            0000 (0)\n-C62C8 Int File Attributes   0000 (0)\n+C68BB Compression Method    0000 (0) 'Stored'\n+C68BD Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C68C1 CRC                   00000000 (0)\n+C68C5 Compressed Size       00000000 (0)\n+C68C9 Uncompressed Size     00000000 (0)\n+C68CD Filename Length       0055 (85)\n+C68CF Extra Length          0000 (0)\n+C68D1 Comment Length        0000 (0)\n+C68D3 Disk Start            0000 (0)\n+C68D5 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C62CA Ext File Attributes   41ED0010 (1106051088)\n+C68D7 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C62CE Local Header Offset   00000F8E (3982)\n-C62D2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C68DB Local Header Offset   00000F8E (3982)\n+C68DF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC62D2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC68DF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC62D2: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC68DF: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC62AA: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC68B7: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C6327 CENTRAL HEADER #39    02014B50 (33639248)\n-C632B Created Zip Spec      14 (20) '2.0'\n-C632C Created OS            03 (3) 'Unix'\n-C632D Extract Zip Spec      0A (10) '1.0'\n-C632E Extract OS            00 (0) 'MS-DOS'\n-C632F General Purpose Flag  0800 (2048)\n+C6934 CENTRAL HEADER #39    02014B50 (33639248)\n+C6938 Created Zip Spec      14 (20) '2.0'\n+C6939 Created OS            03 (3) 'Unix'\n+C693A Extract Zip Spec      0A (10) '1.0'\n+C693B Extract OS            00 (0) 'MS-DOS'\n+C693C General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C6331 Compression Method    0000 (0) 'Stored'\n-C6333 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C6337 CRC                   00000000 (0)\n-C633B Compressed Size       00000000 (0)\n-C633F Uncompressed Size     00000000 (0)\n-C6343 Filename Length       002B (43)\n-C6345 Extra Length          0000 (0)\n-C6347 Comment Length        0000 (0)\n-C6349 Disk Start            0000 (0)\n-C634B Int File Attributes   0000 (0)\n+C693E Compression Method    0000 (0) 'Stored'\n+C6940 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C6944 CRC                   00000000 (0)\n+C6948 Compressed Size       00000000 (0)\n+C694C Uncompressed Size     00000000 (0)\n+C6950 Filename Length       002B (43)\n+C6952 Extra Length          0000 (0)\n+C6954 Comment Length        0000 (0)\n+C6956 Disk Start            0000 (0)\n+C6958 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C634D Ext File Attributes   41ED0010 (1106051088)\n+C695A Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C6351 Local Header Offset   00001001 (4097)\n-C6355 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C695E Local Header Offset   00001001 (4097)\n+C6962 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC6355: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC6962: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC6355: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC6962: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC632D: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC693A: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C6380 CENTRAL HEADER #40    02014B50 (33639248)\n-C6384 Created Zip Spec      14 (20) '2.0'\n-C6385 Created OS            03 (3) 'Unix'\n-C6386 Extract Zip Spec      0A (10) '1.0'\n-C6387 Extract OS            00 (0) 'MS-DOS'\n-C6388 General Purpose Flag  0800 (2048)\n+C698D CENTRAL HEADER #40    02014B50 (33639248)\n+C6991 Created Zip Spec      14 (20) '2.0'\n+C6992 Created OS            03 (3) 'Unix'\n+C6993 Extract Zip Spec      0A (10) '1.0'\n+C6994 Extract OS            00 (0) 'MS-DOS'\n+C6995 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C638A Compression Method    0000 (0) 'Stored'\n-C638C Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C6390 CRC                   00000000 (0)\n-C6394 Compressed Size       00000000 (0)\n-C6398 Uncompressed Size     00000000 (0)\n-C639C Filename Length       0034 (52)\n-C639E Extra Length          0000 (0)\n-C63A0 Comment Length        0000 (0)\n-C63A2 Disk Start            0000 (0)\n-C63A4 Int File Attributes   0000 (0)\n+C6997 Compression Method    0000 (0) 'Stored'\n+C6999 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C699D CRC                   00000000 (0)\n+C69A1 Compressed Size       00000000 (0)\n+C69A5 Uncompressed Size     00000000 (0)\n+C69A9 Filename Length       0034 (52)\n+C69AB Extra Length          0000 (0)\n+C69AD Comment Length        0000 (0)\n+C69AF Disk Start            0000 (0)\n+C69B1 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C63A6 Ext File Attributes   41ED0010 (1106051088)\n+C69B3 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C63AA Local Header Offset   0000104A (4170)\n-C63AE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C69B7 Local Header Offset   0000104A (4170)\n+C69BB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC63AE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC69BB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC63AE: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC69BB: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC6386: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC6993: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C63E2 CENTRAL HEADER #41    02014B50 (33639248)\n-C63E6 Created Zip Spec      14 (20) '2.0'\n-C63E7 Created OS            03 (3) 'Unix'\n-C63E8 Extract Zip Spec      0A (10) '1.0'\n-C63E9 Extract OS            00 (0) 'MS-DOS'\n-C63EA General Purpose Flag  0800 (2048)\n+C69EF CENTRAL HEADER #41    02014B50 (33639248)\n+C69F3 Created Zip Spec      14 (20) '2.0'\n+C69F4 Created OS            03 (3) 'Unix'\n+C69F5 Extract Zip Spec      0A (10) '1.0'\n+C69F6 Extract OS            00 (0) 'MS-DOS'\n+C69F7 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C63EC Compression Method    0000 (0) 'Stored'\n-C63EE Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C63F2 CRC                   00000000 (0)\n-C63F6 Compressed Size       00000000 (0)\n-C63FA Uncompressed Size     00000000 (0)\n-C63FE Filename Length       007B (123)\n-C6400 Extra Length          0000 (0)\n-C6402 Comment Length        0000 (0)\n-C6404 Disk Start            0000 (0)\n-C6406 Int File Attributes   0000 (0)\n+C69F9 Compression Method    0000 (0) 'Stored'\n+C69FB Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C69FF CRC                   00000000 (0)\n+C6A03 Compressed Size       00000000 (0)\n+C6A07 Uncompressed Size     00000000 (0)\n+C6A0B Filename Length       007B (123)\n+C6A0D Extra Length          0000 (0)\n+C6A0F Comment Length        0000 (0)\n+C6A11 Disk Start            0000 (0)\n+C6A13 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C6408 Ext File Attributes   41ED0010 (1106051088)\n+C6A15 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C640C Local Header Offset   0000109C (4252)\n-C6410 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C6A19 Local Header Offset   0000109C (4252)\n+C6A1D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC6410: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC6A1D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC6410: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC6A1D: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC63E8: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC69F5: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C648B CENTRAL HEADER #42    02014B50 (33639248)\n-C648F Created Zip Spec      14 (20) '2.0'\n-C6490 Created OS            03 (3) 'Unix'\n-C6491 Extract Zip Spec      0A (10) '1.0'\n-C6492 Extract OS            00 (0) 'MS-DOS'\n-C6493 General Purpose Flag  0800 (2048)\n+C6A98 CENTRAL HEADER #42    02014B50 (33639248)\n+C6A9C Created Zip Spec      14 (20) '2.0'\n+C6A9D Created OS            03 (3) 'Unix'\n+C6A9E Extract Zip Spec      0A (10) '1.0'\n+C6A9F Extract OS            00 (0) 'MS-DOS'\n+C6AA0 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C6495 Compression Method    0000 (0) 'Stored'\n-C6497 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C649B CRC                   00000000 (0)\n-C649F Compressed Size       00000000 (0)\n-C64A3 Uncompressed Size     00000000 (0)\n-C64A7 Filename Length       0025 (37)\n-C64A9 Extra Length          0000 (0)\n-C64AB Comment Length        0000 (0)\n-C64AD Disk Start            0000 (0)\n-C64AF Int File Attributes   0000 (0)\n+C6AA2 Compression Method    0000 (0) 'Stored'\n+C6AA4 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C6AA8 CRC                   00000000 (0)\n+C6AAC Compressed Size       00000000 (0)\n+C6AB0 Uncompressed Size     00000000 (0)\n+C6AB4 Filename Length       0025 (37)\n+C6AB6 Extra Length          0000 (0)\n+C6AB8 Comment Length        0000 (0)\n+C6ABA Disk Start            0000 (0)\n+C6ABC Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C64B1 Ext File Attributes   41ED0010 (1106051088)\n+C6ABE Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C64B5 Local Header Offset   00001135 (4405)\n-C64B9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C6AC2 Local Header Offset   00001135 (4405)\n+C6AC6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC64B9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC6AC6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC64B9: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC6AC6: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC6491: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC6A9E: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C64DE CENTRAL HEADER #43    02014B50 (33639248)\n-C64E2 Created Zip Spec      14 (20) '2.0'\n-C64E3 Created OS            03 (3) 'Unix'\n-C64E4 Extract Zip Spec      0A (10) '1.0'\n-C64E5 Extract OS            00 (0) 'MS-DOS'\n-C64E6 General Purpose Flag  0800 (2048)\n+C6AEB CENTRAL HEADER #43    02014B50 (33639248)\n+C6AEF Created Zip Spec      14 (20) '2.0'\n+C6AF0 Created OS            03 (3) 'Unix'\n+C6AF1 Extract Zip Spec      0A (10) '1.0'\n+C6AF2 Extract OS            00 (0) 'MS-DOS'\n+C6AF3 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C64E8 Compression Method    0000 (0) 'Stored'\n-C64EA Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C64EE CRC                   00000000 (0)\n-C64F2 Compressed Size       00000000 (0)\n-C64F6 Uncompressed Size     00000000 (0)\n-C64FA Filename Length       002E (46)\n-C64FC Extra Length          0000 (0)\n-C64FE Comment Length        0000 (0)\n-C6500 Disk Start            0000 (0)\n-C6502 Int File Attributes   0000 (0)\n+C6AF5 Compression Method    0000 (0) 'Stored'\n+C6AF7 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C6AFB CRC                   00000000 (0)\n+C6AFF Compressed Size       00000000 (0)\n+C6B03 Uncompressed Size     00000000 (0)\n+C6B07 Filename Length       002E (46)\n+C6B09 Extra Length          0000 (0)\n+C6B0B Comment Length        0000 (0)\n+C6B0D Disk Start            0000 (0)\n+C6B0F Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C6504 Ext File Attributes   41ED0010 (1106051088)\n+C6B11 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C6508 Local Header Offset   00001178 (4472)\n-C650C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C6B15 Local Header Offset   00001178 (4472)\n+C6B19 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC650C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC6B19: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC650C: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC6B19: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC64E4: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC6AF1: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C653A CENTRAL HEADER #44    02014B50 (33639248)\n-C653E Created Zip Spec      14 (20) '2.0'\n-C653F Created OS            03 (3) 'Unix'\n-C6540 Extract Zip Spec      0A (10) '1.0'\n-C6541 Extract OS            00 (0) 'MS-DOS'\n-C6542 General Purpose Flag  0800 (2048)\n+C6B47 CENTRAL HEADER #44    02014B50 (33639248)\n+C6B4B Created Zip Spec      14 (20) '2.0'\n+C6B4C Created OS            03 (3) 'Unix'\n+C6B4D Extract Zip Spec      0A (10) '1.0'\n+C6B4E Extract OS            00 (0) 'MS-DOS'\n+C6B4F General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C6544 Compression Method    0000 (0) 'Stored'\n-C6546 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C654A CRC                   00000000 (0)\n-C654E Compressed Size       00000000 (0)\n-C6552 Uncompressed Size     00000000 (0)\n-C6556 Filename Length       005F (95)\n-C6558 Extra Length          0000 (0)\n-C655A Comment Length        0000 (0)\n-C655C Disk Start            0000 (0)\n-C655E Int File Attributes   0000 (0)\n+C6B51 Compression Method    0000 (0) 'Stored'\n+C6B53 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C6B57 CRC                   00000000 (0)\n+C6B5B Compressed Size       00000000 (0)\n+C6B5F Uncompressed Size     00000000 (0)\n+C6B63 Filename Length       005F (95)\n+C6B65 Extra Length          0000 (0)\n+C6B67 Comment Length        0000 (0)\n+C6B69 Disk Start            0000 (0)\n+C6B6B Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C6560 Ext File Attributes   41ED0010 (1106051088)\n+C6B6D Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C6564 Local Header Offset   000011C4 (4548)\n-C6568 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C6B71 Local Header Offset   000011C4 (4548)\n+C6B75 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC6568: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC6B75: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC6568: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC6B75: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC6540: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC6B4D: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C65C7 CENTRAL HEADER #45    02014B50 (33639248)\n-C65CB Created Zip Spec      14 (20) '2.0'\n-C65CC Created OS            03 (3) 'Unix'\n-C65CD Extract Zip Spec      0A (10) '1.0'\n-C65CE Extract OS            00 (0) 'MS-DOS'\n-C65CF General Purpose Flag  0800 (2048)\n+C6BD4 CENTRAL HEADER #45    02014B50 (33639248)\n+C6BD8 Created Zip Spec      14 (20) '2.0'\n+C6BD9 Created OS            03 (3) 'Unix'\n+C6BDA Extract Zip Spec      0A (10) '1.0'\n+C6BDB Extract OS            00 (0) 'MS-DOS'\n+C6BDC General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C65D1 Compression Method    0000 (0) 'Stored'\n-C65D3 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C65D7 CRC                   00000000 (0)\n-C65DB Compressed Size       00000000 (0)\n-C65DF Uncompressed Size     00000000 (0)\n-C65E3 Filename Length       006C (108)\n-C65E5 Extra Length          0000 (0)\n-C65E7 Comment Length        0000 (0)\n-C65E9 Disk Start            0000 (0)\n-C65EB Int File Attributes   0000 (0)\n+C6BDE Compression Method    0000 (0) 'Stored'\n+C6BE0 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C6BE4 CRC                   00000000 (0)\n+C6BE8 Compressed Size       00000000 (0)\n+C6BEC Uncompressed Size     00000000 (0)\n+C6BF0 Filename Length       006C (108)\n+C6BF2 Extra Length          0000 (0)\n+C6BF4 Comment Length        0000 (0)\n+C6BF6 Disk Start            0000 (0)\n+C6BF8 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C65ED Ext File Attributes   41ED0010 (1106051088)\n+C6BFA Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C65F1 Local Header Offset   00001241 (4673)\n-C65F5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C6BFE Local Header Offset   00001241 (4673)\n+C6C02 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC65F5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC6C02: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC65F5: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC6C02: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC65CD: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC6BDA: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C6661 CENTRAL HEADER #46    02014B50 (33639248)\n-C6665 Created Zip Spec      14 (20) '2.0'\n-C6666 Created OS            03 (3) 'Unix'\n-C6667 Extract Zip Spec      0A (10) '1.0'\n-C6668 Extract OS            00 (0) 'MS-DOS'\n-C6669 General Purpose Flag  0800 (2048)\n+C6C6E CENTRAL HEADER #46    02014B50 (33639248)\n+C6C72 Created Zip Spec      14 (20) '2.0'\n+C6C73 Created OS            03 (3) 'Unix'\n+C6C74 Extract Zip Spec      0A (10) '1.0'\n+C6C75 Extract OS            00 (0) 'MS-DOS'\n+C6C76 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C666B Compression Method    0000 (0) 'Stored'\n-C666D Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C6671 CRC                   00000000 (0)\n-C6675 Compressed Size       00000000 (0)\n-C6679 Uncompressed Size     00000000 (0)\n-C667D Filename Length       002F (47)\n-C667F Extra Length          0000 (0)\n-C6681 Comment Length        0000 (0)\n-C6683 Disk Start            0000 (0)\n-C6685 Int File Attributes   0000 (0)\n+C6C78 Compression Method    0000 (0) 'Stored'\n+C6C7A Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C6C7E CRC                   00000000 (0)\n+C6C82 Compressed Size       00000000 (0)\n+C6C86 Uncompressed Size     00000000 (0)\n+C6C8A Filename Length       002F (47)\n+C6C8C Extra Length          0000 (0)\n+C6C8E Comment Length        0000 (0)\n+C6C90 Disk Start            0000 (0)\n+C6C92 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C6687 Ext File Attributes   41ED0010 (1106051088)\n+C6C94 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C668B Local Header Offset   000012CB (4811)\n-C668F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C6C98 Local Header Offset   000012CB (4811)\n+C6C9C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC668F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC6C9C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC668F: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC6C9C: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC6667: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC6C74: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C66BE CENTRAL HEADER #47    02014B50 (33639248)\n-C66C2 Created Zip Spec      14 (20) '2.0'\n-C66C3 Created OS            03 (3) 'Unix'\n-C66C4 Extract Zip Spec      0A (10) '1.0'\n-C66C5 Extract OS            00 (0) 'MS-DOS'\n-C66C6 General Purpose Flag  0800 (2048)\n+C6CCB CENTRAL HEADER #47    02014B50 (33639248)\n+C6CCF Created Zip Spec      14 (20) '2.0'\n+C6CD0 Created OS            03 (3) 'Unix'\n+C6CD1 Extract Zip Spec      0A (10) '1.0'\n+C6CD2 Extract OS            00 (0) 'MS-DOS'\n+C6CD3 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C66C8 Compression Method    0000 (0) 'Stored'\n-C66CA Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C66CE CRC                   00000000 (0)\n-C66D2 Compressed Size       00000000 (0)\n-C66D6 Uncompressed Size     00000000 (0)\n-C66DA Filename Length       0038 (56)\n-C66DC Extra Length          0000 (0)\n-C66DE Comment Length        0000 (0)\n-C66E0 Disk Start            0000 (0)\n-C66E2 Int File Attributes   0000 (0)\n+C6CD5 Compression Method    0000 (0) 'Stored'\n+C6CD7 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C6CDB CRC                   00000000 (0)\n+C6CDF Compressed Size       00000000 (0)\n+C6CE3 Uncompressed Size     00000000 (0)\n+C6CE7 Filename Length       0038 (56)\n+C6CE9 Extra Length          0000 (0)\n+C6CEB Comment Length        0000 (0)\n+C6CED Disk Start            0000 (0)\n+C6CEF Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C66E4 Ext File Attributes   41ED0010 (1106051088)\n+C6CF1 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C66E8 Local Header Offset   00001318 (4888)\n-C66EC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C6CF5 Local Header Offset   00001318 (4888)\n+C6CF9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC66EC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC6CF9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC66EC: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC6CF9: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC66C4: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC6CD1: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C6724 CENTRAL HEADER #48    02014B50 (33639248)\n-C6728 Created Zip Spec      14 (20) '2.0'\n-C6729 Created OS            03 (3) 'Unix'\n-C672A Extract Zip Spec      0A (10) '1.0'\n-C672B Extract OS            00 (0) 'MS-DOS'\n-C672C General Purpose Flag  0800 (2048)\n+C6D31 CENTRAL HEADER #48    02014B50 (33639248)\n+C6D35 Created Zip Spec      14 (20) '2.0'\n+C6D36 Created OS            03 (3) 'Unix'\n+C6D37 Extract Zip Spec      0A (10) '1.0'\n+C6D38 Extract OS            00 (0) 'MS-DOS'\n+C6D39 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C672E Compression Method    0000 (0) 'Stored'\n-C6730 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C6734 CRC                   00000000 (0)\n-C6738 Compressed Size       00000000 (0)\n-C673C Uncompressed Size     00000000 (0)\n-C6740 Filename Length       007A (122)\n-C6742 Extra Length          0000 (0)\n-C6744 Comment Length        0000 (0)\n-C6746 Disk Start            0000 (0)\n-C6748 Int File Attributes   0000 (0)\n+C6D3B Compression Method    0000 (0) 'Stored'\n+C6D3D Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C6D41 CRC                   00000000 (0)\n+C6D45 Compressed Size       00000000 (0)\n+C6D49 Uncompressed Size     00000000 (0)\n+C6D4D Filename Length       007A (122)\n+C6D4F Extra Length          0000 (0)\n+C6D51 Comment Length        0000 (0)\n+C6D53 Disk Start            0000 (0)\n+C6D55 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C674A Ext File Attributes   41ED0010 (1106051088)\n+C6D57 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C674E Local Header Offset   0000136E (4974)\n-C6752 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C6D5B Local Header Offset   0000136E (4974)\n+C6D5F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC6752: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC6D5F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC6752: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC6D5F: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC672A: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC6D37: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C67CC CENTRAL HEADER #49    02014B50 (33639248)\n-C67D0 Created Zip Spec      14 (20) '2.0'\n-C67D1 Created OS            03 (3) 'Unix'\n-C67D2 Extract Zip Spec      0A (10) '1.0'\n-C67D3 Extract OS            00 (0) 'MS-DOS'\n-C67D4 General Purpose Flag  0800 (2048)\n+C6DD9 CENTRAL HEADER #49    02014B50 (33639248)\n+C6DDD Created Zip Spec      14 (20) '2.0'\n+C6DDE Created OS            03 (3) 'Unix'\n+C6DDF Extract Zip Spec      0A (10) '1.0'\n+C6DE0 Extract OS            00 (0) 'MS-DOS'\n+C6DE1 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C67D6 Compression Method    0000 (0) 'Stored'\n-C67D8 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C67DC CRC                   00000000 (0)\n-C67E0 Compressed Size       00000000 (0)\n-C67E4 Uncompressed Size     00000000 (0)\n-C67E8 Filename Length       003B (59)\n-C67EA Extra Length          0000 (0)\n-C67EC Comment Length        0000 (0)\n-C67EE Disk Start            0000 (0)\n-C67F0 Int File Attributes   0000 (0)\n+C6DE3 Compression Method    0000 (0) 'Stored'\n+C6DE5 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C6DE9 CRC                   00000000 (0)\n+C6DED Compressed Size       00000000 (0)\n+C6DF1 Uncompressed Size     00000000 (0)\n+C6DF5 Filename Length       003B (59)\n+C6DF7 Extra Length          0000 (0)\n+C6DF9 Comment Length        0000 (0)\n+C6DFB Disk Start            0000 (0)\n+C6DFD Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C67F2 Ext File Attributes   41ED0010 (1106051088)\n+C6DFF Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C67F6 Local Header Offset   00001406 (5126)\n-C67FA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C6E03 Local Header Offset   00001406 (5126)\n+C6E07 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC67FA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC6E07: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC67FA: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC6E07: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC67D2: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC6DDF: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C6835 CENTRAL HEADER #50    02014B50 (33639248)\n-C6839 Created Zip Spec      14 (20) '2.0'\n-C683A Created OS            03 (3) 'Unix'\n-C683B Extract Zip Spec      0A (10) '1.0'\n-C683C Extract OS            00 (0) 'MS-DOS'\n-C683D General Purpose Flag  0800 (2048)\n+C6E42 CENTRAL HEADER #50    02014B50 (33639248)\n+C6E46 Created Zip Spec      14 (20) '2.0'\n+C6E47 Created OS            03 (3) 'Unix'\n+C6E48 Extract Zip Spec      0A (10) '1.0'\n+C6E49 Extract OS            00 (0) 'MS-DOS'\n+C6E4A General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C683F Compression Method    0000 (0) 'Stored'\n-C6841 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C6845 CRC                   00000000 (0)\n-C6849 Compressed Size       00000000 (0)\n-C684D Uncompressed Size     00000000 (0)\n-C6851 Filename Length       0044 (68)\n-C6853 Extra Length          0000 (0)\n-C6855 Comment Length        0000 (0)\n-C6857 Disk Start            0000 (0)\n-C6859 Int File Attributes   0000 (0)\n+C6E4C Compression Method    0000 (0) 'Stored'\n+C6E4E Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C6E52 CRC                   00000000 (0)\n+C6E56 Compressed Size       00000000 (0)\n+C6E5A Uncompressed Size     00000000 (0)\n+C6E5E Filename Length       0044 (68)\n+C6E60 Extra Length          0000 (0)\n+C6E62 Comment Length        0000 (0)\n+C6E64 Disk Start            0000 (0)\n+C6E66 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C685B Ext File Attributes   41ED0010 (1106051088)\n+C6E68 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C685F Local Header Offset   0000145F (5215)\n-C6863 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C6E6C Local Header Offset   0000145F (5215)\n+C6E70 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC6863: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC6E70: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC6863: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC6E70: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC683B: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC6E48: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C68A7 CENTRAL HEADER #51    02014B50 (33639248)\n-C68AB Created Zip Spec      14 (20) '2.0'\n-C68AC Created OS            03 (3) 'Unix'\n-C68AD Extract Zip Spec      0A (10) '1.0'\n-C68AE Extract OS            00 (0) 'MS-DOS'\n-C68AF General Purpose Flag  0800 (2048)\n+C6EB4 CENTRAL HEADER #51    02014B50 (33639248)\n+C6EB8 Created Zip Spec      14 (20) '2.0'\n+C6EB9 Created OS            03 (3) 'Unix'\n+C6EBA Extract Zip Spec      0A (10) '1.0'\n+C6EBB Extract OS            00 (0) 'MS-DOS'\n+C6EBC General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C68B1 Compression Method    0000 (0) 'Stored'\n-C68B3 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C68B7 CRC                   00000000 (0)\n-C68BB Compressed Size       00000000 (0)\n-C68BF Uncompressed Size     00000000 (0)\n-C68C3 Filename Length       0081 (129)\n-C68C5 Extra Length          0000 (0)\n-C68C7 Comment Length        0000 (0)\n-C68C9 Disk Start            0000 (0)\n-C68CB Int File Attributes   0000 (0)\n+C6EBE Compression Method    0000 (0) 'Stored'\n+C6EC0 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C6EC4 CRC                   00000000 (0)\n+C6EC8 Compressed Size       00000000 (0)\n+C6ECC Uncompressed Size     00000000 (0)\n+C6ED0 Filename Length       0081 (129)\n+C6ED2 Extra Length          0000 (0)\n+C6ED4 Comment Length        0000 (0)\n+C6ED6 Disk Start            0000 (0)\n+C6ED8 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C68CD Ext File Attributes   41ED0010 (1106051088)\n+C6EDA Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C68D1 Local Header Offset   000014C1 (5313)\n-C68D5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C6EDE Local Header Offset   000014C1 (5313)\n+C6EE2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC68D5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC6EE2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC68D5: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC6EE2: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC68AD: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC6EBA: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C6956 CENTRAL HEADER #52    02014B50 (33639248)\n-C695A Created Zip Spec      14 (20) '2.0'\n-C695B Created OS            03 (3) 'Unix'\n-C695C Extract Zip Spec      0A (10) '1.0'\n-C695D Extract OS            00 (0) 'MS-DOS'\n-C695E General Purpose Flag  0800 (2048)\n+C6F63 CENTRAL HEADER #52    02014B50 (33639248)\n+C6F67 Created Zip Spec      14 (20) '2.0'\n+C6F68 Created OS            03 (3) 'Unix'\n+C6F69 Extract Zip Spec      0A (10) '1.0'\n+C6F6A Extract OS            00 (0) 'MS-DOS'\n+C6F6B General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C6960 Compression Method    0000 (0) 'Stored'\n-C6962 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C6966 CRC                   00000000 (0)\n-C696A Compressed Size       00000000 (0)\n-C696E Uncompressed Size     00000000 (0)\n-C6972 Filename Length       007D (125)\n-C6974 Extra Length          0000 (0)\n-C6976 Comment Length        0000 (0)\n-C6978 Disk Start            0000 (0)\n-C697A Int File Attributes   0000 (0)\n+C6F6D Compression Method    0000 (0) 'Stored'\n+C6F6F Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C6F73 CRC                   00000000 (0)\n+C6F77 Compressed Size       00000000 (0)\n+C6F7B Uncompressed Size     00000000 (0)\n+C6F7F Filename Length       007D (125)\n+C6F81 Extra Length          0000 (0)\n+C6F83 Comment Length        0000 (0)\n+C6F85 Disk Start            0000 (0)\n+C6F87 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C697C Ext File Attributes   41ED0010 (1106051088)\n+C6F89 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C6980 Local Header Offset   00001560 (5472)\n-C6984 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C6F8D Local Header Offset   00001560 (5472)\n+C6F91 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC6984: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC6F91: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC6984: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC6F91: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC695C: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC6F69: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C6A01 CENTRAL HEADER #53    02014B50 (33639248)\n-C6A05 Created Zip Spec      14 (20) '2.0'\n-C6A06 Created OS            03 (3) 'Unix'\n-C6A07 Extract Zip Spec      0A (10) '1.0'\n-C6A08 Extract OS            00 (0) 'MS-DOS'\n-C6A09 General Purpose Flag  0800 (2048)\n+C700E CENTRAL HEADER #53    02014B50 (33639248)\n+C7012 Created Zip Spec      14 (20) '2.0'\n+C7013 Created OS            03 (3) 'Unix'\n+C7014 Extract Zip Spec      0A (10) '1.0'\n+C7015 Extract OS            00 (0) 'MS-DOS'\n+C7016 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C6A0B Compression Method    0000 (0) 'Stored'\n-C6A0D Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C6A11 CRC                   00000000 (0)\n-C6A15 Compressed Size       00000000 (0)\n-C6A19 Uncompressed Size     00000000 (0)\n-C6A1D Filename Length       0034 (52)\n-C6A1F Extra Length          0000 (0)\n-C6A21 Comment Length        0000 (0)\n-C6A23 Disk Start            0000 (0)\n-C6A25 Int File Attributes   0000 (0)\n+C7018 Compression Method    0000 (0) 'Stored'\n+C701A Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C701E CRC                   00000000 (0)\n+C7022 Compressed Size       00000000 (0)\n+C7026 Uncompressed Size     00000000 (0)\n+C702A Filename Length       0034 (52)\n+C702C Extra Length          0000 (0)\n+C702E Comment Length        0000 (0)\n+C7030 Disk Start            0000 (0)\n+C7032 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C6A27 Ext File Attributes   41ED0010 (1106051088)\n+C7034 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C6A2B Local Header Offset   000015FB (5627)\n-C6A2F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C7038 Local Header Offset   000015FB (5627)\n+C703C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC6A2F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC703C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC6A2F: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC703C: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC6A07: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC7014: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C6A63 CENTRAL HEADER #54    02014B50 (33639248)\n-C6A67 Created Zip Spec      14 (20) '2.0'\n-C6A68 Created OS            03 (3) 'Unix'\n-C6A69 Extract Zip Spec      0A (10) '1.0'\n-C6A6A Extract OS            00 (0) 'MS-DOS'\n-C6A6B General Purpose Flag  0800 (2048)\n+C7070 CENTRAL HEADER #54    02014B50 (33639248)\n+C7074 Created Zip Spec      14 (20) '2.0'\n+C7075 Created OS            03 (3) 'Unix'\n+C7076 Extract Zip Spec      0A (10) '1.0'\n+C7077 Extract OS            00 (0) 'MS-DOS'\n+C7078 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C6A6D Compression Method    0000 (0) 'Stored'\n-C6A6F Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C6A73 CRC                   00000000 (0)\n-C6A77 Compressed Size       00000000 (0)\n-C6A7B Uncompressed Size     00000000 (0)\n-C6A7F Filename Length       003D (61)\n-C6A81 Extra Length          0000 (0)\n-C6A83 Comment Length        0000 (0)\n-C6A85 Disk Start            0000 (0)\n-C6A87 Int File Attributes   0000 (0)\n+C707A Compression Method    0000 (0) 'Stored'\n+C707C Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C7080 CRC                   00000000 (0)\n+C7084 Compressed Size       00000000 (0)\n+C7088 Uncompressed Size     00000000 (0)\n+C708C Filename Length       003D (61)\n+C708E Extra Length          0000 (0)\n+C7090 Comment Length        0000 (0)\n+C7092 Disk Start            0000 (0)\n+C7094 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C6A89 Ext File Attributes   41ED0010 (1106051088)\n+C7096 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C6A8D Local Header Offset   0000164D (5709)\n-C6A91 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C709A Local Header Offset   0000164D (5709)\n+C709E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC6A91: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC709E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC6A91: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC709E: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC6A69: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC7076: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C6ACE CENTRAL HEADER #55    02014B50 (33639248)\n-C6AD2 Created Zip Spec      14 (20) '2.0'\n-C6AD3 Created OS            03 (3) 'Unix'\n-C6AD4 Extract Zip Spec      0A (10) '1.0'\n-C6AD5 Extract OS            00 (0) 'MS-DOS'\n-C6AD6 General Purpose Flag  0800 (2048)\n+C70DB CENTRAL HEADER #55    02014B50 (33639248)\n+C70DF Created Zip Spec      14 (20) '2.0'\n+C70E0 Created OS            03 (3) 'Unix'\n+C70E1 Extract Zip Spec      0A (10) '1.0'\n+C70E2 Extract OS            00 (0) 'MS-DOS'\n+C70E3 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C6AD8 Compression Method    0000 (0) 'Stored'\n-C6ADA Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C6ADE CRC                   00000000 (0)\n-C6AE2 Compressed Size       00000000 (0)\n-C6AE6 Uncompressed Size     00000000 (0)\n-C6AEA Filename Length       007B (123)\n-C6AEC Extra Length          0000 (0)\n-C6AEE Comment Length        0000 (0)\n-C6AF0 Disk Start            0000 (0)\n-C6AF2 Int File Attributes   0000 (0)\n+C70E5 Compression Method    0000 (0) 'Stored'\n+C70E7 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C70EB CRC                   00000000 (0)\n+C70EF Compressed Size       00000000 (0)\n+C70F3 Uncompressed Size     00000000 (0)\n+C70F7 Filename Length       007B (123)\n+C70F9 Extra Length          0000 (0)\n+C70FB Comment Length        0000 (0)\n+C70FD Disk Start            0000 (0)\n+C70FF Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C6AF4 Ext File Attributes   41ED0010 (1106051088)\n+C7101 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C6AF8 Local Header Offset   000016A8 (5800)\n-C6AFC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C7105 Local Header Offset   000016A8 (5800)\n+C7109 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC6AFC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC7109: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC6AFC: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC7109: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC6AD4: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC70E1: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C6B77 CENTRAL HEADER #56    02014B50 (33639248)\n-C6B7B Created Zip Spec      14 (20) '2.0'\n-C6B7C Created OS            03 (3) 'Unix'\n-C6B7D Extract Zip Spec      0A (10) '1.0'\n-C6B7E Extract OS            00 (0) 'MS-DOS'\n-C6B7F General Purpose Flag  0800 (2048)\n+C7184 CENTRAL HEADER #56    02014B50 (33639248)\n+C7188 Created Zip Spec      14 (20) '2.0'\n+C7189 Created OS            03 (3) 'Unix'\n+C718A Extract Zip Spec      0A (10) '1.0'\n+C718B Extract OS            00 (0) 'MS-DOS'\n+C718C General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C6B81 Compression Method    0000 (0) 'Stored'\n-C6B83 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C6B87 CRC                   00000000 (0)\n-C6B8B Compressed Size       00000000 (0)\n-C6B8F Uncompressed Size     00000000 (0)\n-C6B93 Filename Length       0081 (129)\n-C6B95 Extra Length          0000 (0)\n-C6B97 Comment Length        0000 (0)\n-C6B99 Disk Start            0000 (0)\n-C6B9B Int File Attributes   0000 (0)\n+C718E Compression Method    0000 (0) 'Stored'\n+C7190 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C7194 CRC                   00000000 (0)\n+C7198 Compressed Size       00000000 (0)\n+C719C Uncompressed Size     00000000 (0)\n+C71A0 Filename Length       0081 (129)\n+C71A2 Extra Length          0000 (0)\n+C71A4 Comment Length        0000 (0)\n+C71A6 Disk Start            0000 (0)\n+C71A8 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C6B9D Ext File Attributes   41ED0010 (1106051088)\n+C71AA Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C6BA1 Local Header Offset   00001741 (5953)\n-C6BA5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C71AE Local Header Offset   00001741 (5953)\n+C71B2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC6BA5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC71B2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC6BA5: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC71B2: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC6B7D: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC718A: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C6C26 CENTRAL HEADER #57    02014B50 (33639248)\n-C6C2A Created Zip Spec      14 (20) '2.0'\n-C6C2B Created OS            03 (3) 'Unix'\n-C6C2C Extract Zip Spec      0A (10) '1.0'\n-C6C2D Extract OS            00 (0) 'MS-DOS'\n-C6C2E General Purpose Flag  0800 (2048)\n+C7233 CENTRAL HEADER #57    02014B50 (33639248)\n+C7237 Created Zip Spec      14 (20) '2.0'\n+C7238 Created OS            03 (3) 'Unix'\n+C7239 Extract Zip Spec      0A (10) '1.0'\n+C723A Extract OS            00 (0) 'MS-DOS'\n+C723B General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C6C30 Compression Method    0000 (0) 'Stored'\n-C6C32 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C6C36 CRC                   00000000 (0)\n-C6C3A Compressed Size       00000000 (0)\n-C6C3E Uncompressed Size     00000000 (0)\n-C6C42 Filename Length       007D (125)\n-C6C44 Extra Length          0000 (0)\n-C6C46 Comment Length        0000 (0)\n-C6C48 Disk Start            0000 (0)\n-C6C4A Int File Attributes   0000 (0)\n+C723D Compression Method    0000 (0) 'Stored'\n+C723F Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C7243 CRC                   00000000 (0)\n+C7247 Compressed Size       00000000 (0)\n+C724B Uncompressed Size     00000000 (0)\n+C724F Filename Length       007D (125)\n+C7251 Extra Length          0000 (0)\n+C7253 Comment Length        0000 (0)\n+C7255 Disk Start            0000 (0)\n+C7257 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C6C4C Ext File Attributes   41ED0010 (1106051088)\n+C7259 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C6C50 Local Header Offset   000017E0 (6112)\n-C6C54 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C725D Local Header Offset   000017E0 (6112)\n+C7261 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC6C54: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC7261: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC6C54: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC7261: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC6C2C: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC7239: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C6CD1 CENTRAL HEADER #58    02014B50 (33639248)\n-C6CD5 Created Zip Spec      14 (20) '2.0'\n-C6CD6 Created OS            03 (3) 'Unix'\n-C6CD7 Extract Zip Spec      0A (10) '1.0'\n-C6CD8 Extract OS            00 (0) 'MS-DOS'\n-C6CD9 General Purpose Flag  0800 (2048)\n+C72DE CENTRAL HEADER #58    02014B50 (33639248)\n+C72E2 Created Zip Spec      14 (20) '2.0'\n+C72E3 Created OS            03 (3) 'Unix'\n+C72E4 Extract Zip Spec      0A (10) '1.0'\n+C72E5 Extract OS            00 (0) 'MS-DOS'\n+C72E6 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C6CDB Compression Method    0000 (0) 'Stored'\n-C6CDD Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C6CE1 CRC                   00000000 (0)\n-C6CE5 Compressed Size       00000000 (0)\n-C6CE9 Uncompressed Size     00000000 (0)\n-C6CED Filename Length       0086 (134)\n-C6CEF Extra Length          0000 (0)\n-C6CF1 Comment Length        0000 (0)\n-C6CF3 Disk Start            0000 (0)\n-C6CF5 Int File Attributes   0000 (0)\n+C72E8 Compression Method    0000 (0) 'Stored'\n+C72EA Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C72EE CRC                   00000000 (0)\n+C72F2 Compressed Size       00000000 (0)\n+C72F6 Uncompressed Size     00000000 (0)\n+C72FA Filename Length       0086 (134)\n+C72FC Extra Length          0000 (0)\n+C72FE Comment Length        0000 (0)\n+C7300 Disk Start            0000 (0)\n+C7302 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C6CF7 Ext File Attributes   41ED0010 (1106051088)\n+C7304 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C6CFB Local Header Offset   0000187B (6267)\n-C6CFF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+C7308 Local Header Offset   0000187B (6267)\n+C730C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XX'\n #\n-# WARNING: Offset 0xC6CFF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC730C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC6CFF: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC730C: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC6CD7: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC72E4: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C6D85 CENTRAL HEADER #59    02014B50 (33639248)\n-C6D89 Created Zip Spec      14 (20) '2.0'\n-C6D8A Created OS            03 (3) 'Unix'\n-C6D8B Extract Zip Spec      0A (10) '1.0'\n-C6D8C Extract OS            00 (0) 'MS-DOS'\n-C6D8D General Purpose Flag  0800 (2048)\n+C7392 CENTRAL HEADER #59    02014B50 (33639248)\n+C7396 Created Zip Spec      14 (20) '2.0'\n+C7397 Created OS            03 (3) 'Unix'\n+C7398 Extract Zip Spec      0A (10) '1.0'\n+C7399 Extract OS            00 (0) 'MS-DOS'\n+C739A General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C6D8F Compression Method    0000 (0) 'Stored'\n-C6D91 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C6D95 CRC                   00000000 (0)\n-C6D99 Compressed Size       00000000 (0)\n-C6D9D Uncompressed Size     00000000 (0)\n-C6DA1 Filename Length       007B (123)\n-C6DA3 Extra Length          0000 (0)\n-C6DA5 Comment Length        0000 (0)\n-C6DA7 Disk Start            0000 (0)\n-C6DA9 Int File Attributes   0000 (0)\n+C739C Compression Method    0000 (0) 'Stored'\n+C739E Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C73A2 CRC                   00000000 (0)\n+C73A6 Compressed Size       00000000 (0)\n+C73AA Uncompressed Size     00000000 (0)\n+C73AE Filename Length       007B (123)\n+C73B0 Extra Length          0000 (0)\n+C73B2 Comment Length        0000 (0)\n+C73B4 Disk Start            0000 (0)\n+C73B6 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C6DAB Ext File Attributes   41ED0010 (1106051088)\n+C73B8 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C6DAF Local Header Offset   0000191F (6431)\n-C6DB3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C73BC Local Header Offset   0000191F (6431)\n+C73C0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC6DB3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC73C0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC6DB3: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC73C0: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC6D8B: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC7398: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C6E2E CENTRAL HEADER #60    02014B50 (33639248)\n-C6E32 Created Zip Spec      14 (20) '2.0'\n-C6E33 Created OS            03 (3) 'Unix'\n-C6E34 Extract Zip Spec      0A (10) '1.0'\n-C6E35 Extract OS            00 (0) 'MS-DOS'\n-C6E36 General Purpose Flag  0800 (2048)\n+C743B CENTRAL HEADER #60    02014B50 (33639248)\n+C743F Created Zip Spec      14 (20) '2.0'\n+C7440 Created OS            03 (3) 'Unix'\n+C7441 Extract Zip Spec      0A (10) '1.0'\n+C7442 Extract OS            00 (0) 'MS-DOS'\n+C7443 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C6E38 Compression Method    0000 (0) 'Stored'\n-C6E3A Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C6E3E CRC                   00000000 (0)\n-C6E42 Compressed Size       00000000 (0)\n-C6E46 Uncompressed Size     00000000 (0)\n-C6E4A Filename Length       007D (125)\n-C6E4C Extra Length          0000 (0)\n-C6E4E Comment Length        0000 (0)\n-C6E50 Disk Start            0000 (0)\n-C6E52 Int File Attributes   0000 (0)\n+C7445 Compression Method    0000 (0) 'Stored'\n+C7447 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C744B CRC                   00000000 (0)\n+C744F Compressed Size       00000000 (0)\n+C7453 Uncompressed Size     00000000 (0)\n+C7457 Filename Length       007D (125)\n+C7459 Extra Length          0000 (0)\n+C745B Comment Length        0000 (0)\n+C745D Disk Start            0000 (0)\n+C745F Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C6E54 Ext File Attributes   41ED0010 (1106051088)\n+C7461 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C6E58 Local Header Offset   000019B8 (6584)\n-C6E5C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C7465 Local Header Offset   000019B8 (6584)\n+C7469 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC6E5C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC7469: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC6E5C: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC7469: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC6E34: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC7441: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C6ED9 CENTRAL HEADER #61    02014B50 (33639248)\n-C6EDD Created Zip Spec      14 (20) '2.0'\n-C6EDE Created OS            03 (3) 'Unix'\n-C6EDF Extract Zip Spec      0A (10) '1.0'\n-C6EE0 Extract OS            00 (0) 'MS-DOS'\n-C6EE1 General Purpose Flag  0800 (2048)\n+C74E6 CENTRAL HEADER #61    02014B50 (33639248)\n+C74EA Created Zip Spec      14 (20) '2.0'\n+C74EB Created OS            03 (3) 'Unix'\n+C74EC Extract Zip Spec      0A (10) '1.0'\n+C74ED Extract OS            00 (0) 'MS-DOS'\n+C74EE General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C6EE3 Compression Method    0000 (0) 'Stored'\n-C6EE5 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C6EE9 CRC                   00000000 (0)\n-C6EED Compressed Size       00000000 (0)\n-C6EF1 Uncompressed Size     00000000 (0)\n-C6EF5 Filename Length       007A (122)\n-C6EF7 Extra Length          0000 (0)\n-C6EF9 Comment Length        0000 (0)\n-C6EFB Disk Start            0000 (0)\n-C6EFD Int File Attributes   0000 (0)\n+C74F0 Compression Method    0000 (0) 'Stored'\n+C74F2 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C74F6 CRC                   00000000 (0)\n+C74FA Compressed Size       00000000 (0)\n+C74FE Uncompressed Size     00000000 (0)\n+C7502 Filename Length       007A (122)\n+C7504 Extra Length          0000 (0)\n+C7506 Comment Length        0000 (0)\n+C7508 Disk Start            0000 (0)\n+C750A Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C6EFF Ext File Attributes   41ED0010 (1106051088)\n+C750C Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C6F03 Local Header Offset   00001A53 (6739)\n-C6F07 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C7510 Local Header Offset   00001A53 (6739)\n+C7514 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC6F07: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC7514: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC6F07: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC7514: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC6EDF: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC74EC: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C6F81 CENTRAL HEADER #62    02014B50 (33639248)\n-C6F85 Created Zip Spec      14 (20) '2.0'\n-C6F86 Created OS            03 (3) 'Unix'\n-C6F87 Extract Zip Spec      0A (10) '1.0'\n-C6F88 Extract OS            00 (0) 'MS-DOS'\n-C6F89 General Purpose Flag  0800 (2048)\n+C758E CENTRAL HEADER #62    02014B50 (33639248)\n+C7592 Created Zip Spec      14 (20) '2.0'\n+C7593 Created OS            03 (3) 'Unix'\n+C7594 Extract Zip Spec      0A (10) '1.0'\n+C7595 Extract OS            00 (0) 'MS-DOS'\n+C7596 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C6F8B Compression Method    0000 (0) 'Stored'\n-C6F8D Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C6F91 CRC                   00000000 (0)\n-C6F95 Compressed Size       00000000 (0)\n-C6F99 Uncompressed Size     00000000 (0)\n-C6F9D Filename Length       0081 (129)\n-C6F9F Extra Length          0000 (0)\n-C6FA1 Comment Length        0000 (0)\n-C6FA3 Disk Start            0000 (0)\n-C6FA5 Int File Attributes   0000 (0)\n+C7598 Compression Method    0000 (0) 'Stored'\n+C759A Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C759E CRC                   00000000 (0)\n+C75A2 Compressed Size       00000000 (0)\n+C75A6 Uncompressed Size     00000000 (0)\n+C75AA Filename Length       0081 (129)\n+C75AC Extra Length          0000 (0)\n+C75AE Comment Length        0000 (0)\n+C75B0 Disk Start            0000 (0)\n+C75B2 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C6FA7 Ext File Attributes   41ED0010 (1106051088)\n+C75B4 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C6FAB Local Header Offset   00001AEB (6891)\n-C6FAF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C75B8 Local Header Offset   00001AEB (6891)\n+C75BC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC6FAF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC75BC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC6FAF: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC75BC: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC6F87: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC7594: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C7030 CENTRAL HEADER #63    02014B50 (33639248)\n-C7034 Created Zip Spec      14 (20) '2.0'\n-C7035 Created OS            03 (3) 'Unix'\n-C7036 Extract Zip Spec      0A (10) '1.0'\n-C7037 Extract OS            00 (0) 'MS-DOS'\n-C7038 General Purpose Flag  0800 (2048)\n+C763D CENTRAL HEADER #63    02014B50 (33639248)\n+C7641 Created Zip Spec      14 (20) '2.0'\n+C7642 Created OS            03 (3) 'Unix'\n+C7643 Extract Zip Spec      0A (10) '1.0'\n+C7644 Extract OS            00 (0) 'MS-DOS'\n+C7645 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C703A Compression Method    0000 (0) 'Stored'\n-C703C Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C7040 CRC                   00000000 (0)\n-C7044 Compressed Size       00000000 (0)\n-C7048 Uncompressed Size     00000000 (0)\n-C704C Filename Length       0024 (36)\n-C704E Extra Length          0000 (0)\n-C7050 Comment Length        0000 (0)\n-C7052 Disk Start            0000 (0)\n-C7054 Int File Attributes   0000 (0)\n+C7647 Compression Method    0000 (0) 'Stored'\n+C7649 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C764D CRC                   00000000 (0)\n+C7651 Compressed Size       00000000 (0)\n+C7655 Uncompressed Size     00000000 (0)\n+C7659 Filename Length       0024 (36)\n+C765B Extra Length          0000 (0)\n+C765D Comment Length        0000 (0)\n+C765F Disk Start            0000 (0)\n+C7661 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C7056 Ext File Attributes   41ED0010 (1106051088)\n+C7663 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C705A Local Header Offset   00001B8A (7050)\n-C705E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C7667 Local Header Offset   00001B8A (7050)\n+C766B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC705E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC766B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC705E: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC766B: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC7036: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC7643: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C7082 CENTRAL HEADER #64    02014B50 (33639248)\n-C7086 Created Zip Spec      14 (20) '2.0'\n-C7087 Created OS            03 (3) 'Unix'\n-C7088 Extract Zip Spec      0A (10) '1.0'\n-C7089 Extract OS            00 (0) 'MS-DOS'\n-C708A General Purpose Flag  0800 (2048)\n+C768F CENTRAL HEADER #64    02014B50 (33639248)\n+C7693 Created Zip Spec      14 (20) '2.0'\n+C7694 Created OS            03 (3) 'Unix'\n+C7695 Extract Zip Spec      0A (10) '1.0'\n+C7696 Extract OS            00 (0) 'MS-DOS'\n+C7697 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C708C Compression Method    0000 (0) 'Stored'\n-C708E Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C7092 CRC                   00000000 (0)\n-C7096 Compressed Size       00000000 (0)\n-C709A Uncompressed Size     00000000 (0)\n-C709E Filename Length       002D (45)\n-C70A0 Extra Length          0000 (0)\n-C70A2 Comment Length        0000 (0)\n-C70A4 Disk Start            0000 (0)\n-C70A6 Int File Attributes   0000 (0)\n+C7699 Compression Method    0000 (0) 'Stored'\n+C769B Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C769F CRC                   00000000 (0)\n+C76A3 Compressed Size       00000000 (0)\n+C76A7 Uncompressed Size     00000000 (0)\n+C76AB Filename Length       002D (45)\n+C76AD Extra Length          0000 (0)\n+C76AF Comment Length        0000 (0)\n+C76B1 Disk Start            0000 (0)\n+C76B3 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C70A8 Ext File Attributes   41ED0010 (1106051088)\n+C76B5 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C70AC Local Header Offset   00001BCC (7116)\n-C70B0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C76B9 Local Header Offset   00001BCC (7116)\n+C76BD Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC70B0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC76BD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC70B0: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC76BD: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC7088: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC7695: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C70DD CENTRAL HEADER #65    02014B50 (33639248)\n-C70E1 Created Zip Spec      14 (20) '2.0'\n-C70E2 Created OS            03 (3) 'Unix'\n-C70E3 Extract Zip Spec      0A (10) '1.0'\n-C70E4 Extract OS            00 (0) 'MS-DOS'\n-C70E5 General Purpose Flag  0800 (2048)\n+C76EA CENTRAL HEADER #65    02014B50 (33639248)\n+C76EE Created Zip Spec      14 (20) '2.0'\n+C76EF Created OS            03 (3) 'Unix'\n+C76F0 Extract Zip Spec      0A (10) '1.0'\n+C76F1 Extract OS            00 (0) 'MS-DOS'\n+C76F2 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C70E7 Compression Method    0000 (0) 'Stored'\n-C70E9 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C70ED CRC                   00000000 (0)\n-C70F1 Compressed Size       00000000 (0)\n-C70F5 Uncompressed Size     00000000 (0)\n-C70F9 Filename Length       005A (90)\n-C70FB Extra Length          0000 (0)\n-C70FD Comment Length        0000 (0)\n-C70FF Disk Start            0000 (0)\n-C7101 Int File Attributes   0000 (0)\n+C76F4 Compression Method    0000 (0) 'Stored'\n+C76F6 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C76FA CRC                   00000000 (0)\n+C76FE Compressed Size       00000000 (0)\n+C7702 Uncompressed Size     00000000 (0)\n+C7706 Filename Length       005A (90)\n+C7708 Extra Length          0000 (0)\n+C770A Comment Length        0000 (0)\n+C770C Disk Start            0000 (0)\n+C770E Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C7103 Ext File Attributes   41ED0010 (1106051088)\n+C7710 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C7107 Local Header Offset   00001C17 (7191)\n-C710B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C7714 Local Header Offset   00001C17 (7191)\n+C7718 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC710B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC7718: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC710B: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC7718: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC70E3: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC76F0: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C7165 CENTRAL HEADER #66    02014B50 (33639248)\n-C7169 Created Zip Spec      14 (20) '2.0'\n-C716A Created OS            03 (3) 'Unix'\n-C716B Extract Zip Spec      0A (10) '1.0'\n-C716C Extract OS            00 (0) 'MS-DOS'\n-C716D General Purpose Flag  0800 (2048)\n+C7772 CENTRAL HEADER #66    02014B50 (33639248)\n+C7776 Created Zip Spec      14 (20) '2.0'\n+C7777 Created OS            03 (3) 'Unix'\n+C7778 Extract Zip Spec      0A (10) '1.0'\n+C7779 Extract OS            00 (0) 'MS-DOS'\n+C777A General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C716F Compression Method    0000 (0) 'Stored'\n-C7171 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C7175 CRC                   00000000 (0)\n-C7179 Compressed Size       00000000 (0)\n-C717D Uncompressed Size     00000000 (0)\n-C7181 Filename Length       005A (90)\n-C7183 Extra Length          0000 (0)\n-C7185 Comment Length        0000 (0)\n-C7187 Disk Start            0000 (0)\n-C7189 Int File Attributes   0000 (0)\n+C777C Compression Method    0000 (0) 'Stored'\n+C777E Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C7782 CRC                   00000000 (0)\n+C7786 Compressed Size       00000000 (0)\n+C778A Uncompressed Size     00000000 (0)\n+C778E Filename Length       005A (90)\n+C7790 Extra Length          0000 (0)\n+C7792 Comment Length        0000 (0)\n+C7794 Disk Start            0000 (0)\n+C7796 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C718B Ext File Attributes   41ED0010 (1106051088)\n+C7798 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C718F Local Header Offset   00001C8F (7311)\n-C7193 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C779C Local Header Offset   00001C8F (7311)\n+C77A0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC7193: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC77A0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC7193: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC77A0: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC716B: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC7778: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C71ED CENTRAL HEADER #67    02014B50 (33639248)\n-C71F1 Created Zip Spec      14 (20) '2.0'\n-C71F2 Created OS            03 (3) 'Unix'\n-C71F3 Extract Zip Spec      0A (10) '1.0'\n-C71F4 Extract OS            00 (0) 'MS-DOS'\n-C71F5 General Purpose Flag  0800 (2048)\n+C77FA CENTRAL HEADER #67    02014B50 (33639248)\n+C77FE Created Zip Spec      14 (20) '2.0'\n+C77FF Created OS            03 (3) 'Unix'\n+C7800 Extract Zip Spec      0A (10) '1.0'\n+C7801 Extract OS            00 (0) 'MS-DOS'\n+C7802 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C71F7 Compression Method    0000 (0) 'Stored'\n-C71F9 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C71FD CRC                   00000000 (0)\n-C7201 Compressed Size       00000000 (0)\n-C7205 Uncompressed Size     00000000 (0)\n-C7209 Filename Length       0023 (35)\n-C720B Extra Length          0000 (0)\n-C720D Comment Length        0000 (0)\n-C720F Disk Start            0000 (0)\n-C7211 Int File Attributes   0000 (0)\n+C7804 Compression Method    0000 (0) 'Stored'\n+C7806 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C780A CRC                   00000000 (0)\n+C780E Compressed Size       00000000 (0)\n+C7812 Uncompressed Size     00000000 (0)\n+C7816 Filename Length       0023 (35)\n+C7818 Extra Length          0000 (0)\n+C781A Comment Length        0000 (0)\n+C781C Disk Start            0000 (0)\n+C781E Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C7213 Ext File Attributes   41ED0010 (1106051088)\n+C7820 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C7217 Local Header Offset   00001D07 (7431)\n-C721B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C7824 Local Header Offset   00001D07 (7431)\n+C7828 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC721B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC7828: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC721B: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC7828: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC71F3: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC7800: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C723E CENTRAL HEADER #68    02014B50 (33639248)\n-C7242 Created Zip Spec      14 (20) '2.0'\n-C7243 Created OS            03 (3) 'Unix'\n-C7244 Extract Zip Spec      0A (10) '1.0'\n-C7245 Extract OS            00 (0) 'MS-DOS'\n-C7246 General Purpose Flag  0800 (2048)\n+C784B CENTRAL HEADER #68    02014B50 (33639248)\n+C784F Created Zip Spec      14 (20) '2.0'\n+C7850 Created OS            03 (3) 'Unix'\n+C7851 Extract Zip Spec      0A (10) '1.0'\n+C7852 Extract OS            00 (0) 'MS-DOS'\n+C7853 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C7248 Compression Method    0000 (0) 'Stored'\n-C724A Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C724E CRC                   00000000 (0)\n-C7252 Compressed Size       00000000 (0)\n-C7256 Uncompressed Size     00000000 (0)\n-C725A Filename Length       002C (44)\n-C725C Extra Length          0000 (0)\n-C725E Comment Length        0000 (0)\n-C7260 Disk Start            0000 (0)\n-C7262 Int File Attributes   0000 (0)\n+C7855 Compression Method    0000 (0) 'Stored'\n+C7857 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C785B CRC                   00000000 (0)\n+C785F Compressed Size       00000000 (0)\n+C7863 Uncompressed Size     00000000 (0)\n+C7867 Filename Length       002C (44)\n+C7869 Extra Length          0000 (0)\n+C786B Comment Length        0000 (0)\n+C786D Disk Start            0000 (0)\n+C786F Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C7264 Ext File Attributes   41ED0010 (1106051088)\n+C7871 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C7268 Local Header Offset   00001D48 (7496)\n-C726C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C7875 Local Header Offset   00001D48 (7496)\n+C7879 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC726C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC7879: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC726C: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC7879: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC7244: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC7851: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C7298 CENTRAL HEADER #69    02014B50 (33639248)\n-C729C Created Zip Spec      14 (20) '2.0'\n-C729D Created OS            03 (3) 'Unix'\n-C729E Extract Zip Spec      0A (10) '1.0'\n-C729F Extract OS            00 (0) 'MS-DOS'\n-C72A0 General Purpose Flag  0800 (2048)\n+C78A5 CENTRAL HEADER #69    02014B50 (33639248)\n+C78A9 Created Zip Spec      14 (20) '2.0'\n+C78AA Created OS            03 (3) 'Unix'\n+C78AB Extract Zip Spec      0A (10) '1.0'\n+C78AC Extract OS            00 (0) 'MS-DOS'\n+C78AD General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C72A2 Compression Method    0000 (0) 'Stored'\n-C72A4 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C72A8 CRC                   00000000 (0)\n-C72AC Compressed Size       00000000 (0)\n-C72B0 Uncompressed Size     00000000 (0)\n-C72B4 Filename Length       0056 (86)\n-C72B6 Extra Length          0000 (0)\n-C72B8 Comment Length        0000 (0)\n-C72BA Disk Start            0000 (0)\n-C72BC Int File Attributes   0000 (0)\n+C78AF Compression Method    0000 (0) 'Stored'\n+C78B1 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C78B5 CRC                   00000000 (0)\n+C78B9 Compressed Size       00000000 (0)\n+C78BD Uncompressed Size     00000000 (0)\n+C78C1 Filename Length       0056 (86)\n+C78C3 Extra Length          0000 (0)\n+C78C5 Comment Length        0000 (0)\n+C78C7 Disk Start            0000 (0)\n+C78C9 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C72BE Ext File Attributes   41ED0010 (1106051088)\n+C78CB Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C72C2 Local Header Offset   00001D92 (7570)\n-C72C6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C78CF Local Header Offset   00001D92 (7570)\n+C78D3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC72C6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC78D3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC72C6: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC78D3: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC729E: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC78AB: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C731C CENTRAL HEADER #70    02014B50 (33639248)\n-C7320 Created Zip Spec      14 (20) '2.0'\n-C7321 Created OS            03 (3) 'Unix'\n-C7322 Extract Zip Spec      0A (10) '1.0'\n-C7323 Extract OS            00 (0) 'MS-DOS'\n-C7324 General Purpose Flag  0800 (2048)\n+C7929 CENTRAL HEADER #70    02014B50 (33639248)\n+C792D Created Zip Spec      14 (20) '2.0'\n+C792E Created OS            03 (3) 'Unix'\n+C792F Extract Zip Spec      0A (10) '1.0'\n+C7930 Extract OS            00 (0) 'MS-DOS'\n+C7931 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C7326 Compression Method    0000 (0) 'Stored'\n-C7328 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C732C CRC                   00000000 (0)\n-C7330 Compressed Size       00000000 (0)\n-C7334 Uncompressed Size     00000000 (0)\n-C7338 Filename Length       0022 (34)\n-C733A Extra Length          0000 (0)\n-C733C Comment Length        0000 (0)\n-C733E Disk Start            0000 (0)\n-C7340 Int File Attributes   0000 (0)\n+C7933 Compression Method    0000 (0) 'Stored'\n+C7935 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C7939 CRC                   00000000 (0)\n+C793D Compressed Size       00000000 (0)\n+C7941 Uncompressed Size     00000000 (0)\n+C7945 Filename Length       0022 (34)\n+C7947 Extra Length          0000 (0)\n+C7949 Comment Length        0000 (0)\n+C794B Disk Start            0000 (0)\n+C794D Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C7342 Ext File Attributes   41ED0010 (1106051088)\n+C794F Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C7346 Local Header Offset   00001E06 (7686)\n-C734A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C7953 Local Header Offset   00001E06 (7686)\n+C7957 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC734A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC7957: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC734A: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC7957: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC7322: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC792F: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C736C CENTRAL HEADER #71    02014B50 (33639248)\n-C7370 Created Zip Spec      14 (20) '2.0'\n-C7371 Created OS            03 (3) 'Unix'\n-C7372 Extract Zip Spec      0A (10) '1.0'\n-C7373 Extract OS            00 (0) 'MS-DOS'\n-C7374 General Purpose Flag  0800 (2048)\n+C7979 CENTRAL HEADER #71    02014B50 (33639248)\n+C797D Created Zip Spec      14 (20) '2.0'\n+C797E Created OS            03 (3) 'Unix'\n+C797F Extract Zip Spec      0A (10) '1.0'\n+C7980 Extract OS            00 (0) 'MS-DOS'\n+C7981 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C7376 Compression Method    0000 (0) 'Stored'\n-C7378 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C737C CRC                   00000000 (0)\n-C7380 Compressed Size       00000000 (0)\n-C7384 Uncompressed Size     00000000 (0)\n-C7388 Filename Length       002B (43)\n-C738A Extra Length          0000 (0)\n-C738C Comment Length        0000 (0)\n-C738E Disk Start            0000 (0)\n-C7390 Int File Attributes   0000 (0)\n+C7983 Compression Method    0000 (0) 'Stored'\n+C7985 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C7989 CRC                   00000000 (0)\n+C798D Compressed Size       00000000 (0)\n+C7991 Uncompressed Size     00000000 (0)\n+C7995 Filename Length       002B (43)\n+C7997 Extra Length          0000 (0)\n+C7999 Comment Length        0000 (0)\n+C799B Disk Start            0000 (0)\n+C799D Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C7392 Ext File Attributes   41ED0010 (1106051088)\n+C799F Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C7396 Local Header Offset   00001E46 (7750)\n-C739A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C79A3 Local Header Offset   00001E46 (7750)\n+C79A7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC739A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC79A7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC739A: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC79A7: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC7372: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC797F: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C73C5 CENTRAL HEADER #72    02014B50 (33639248)\n-C73C9 Created Zip Spec      14 (20) '2.0'\n-C73CA Created OS            03 (3) 'Unix'\n-C73CB Extract Zip Spec      0A (10) '1.0'\n-C73CC Extract OS            00 (0) 'MS-DOS'\n-C73CD General Purpose Flag  0800 (2048)\n+C79D2 CENTRAL HEADER #72    02014B50 (33639248)\n+C79D6 Created Zip Spec      14 (20) '2.0'\n+C79D7 Created OS            03 (3) 'Unix'\n+C79D8 Extract Zip Spec      0A (10) '1.0'\n+C79D9 Extract OS            00 (0) 'MS-DOS'\n+C79DA General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C73CF Compression Method    0000 (0) 'Stored'\n-C73D1 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C73D5 CRC                   00000000 (0)\n-C73D9 Compressed Size       00000000 (0)\n-C73DD Uncompressed Size     00000000 (0)\n-C73E1 Filename Length       005F (95)\n-C73E3 Extra Length          0000 (0)\n-C73E5 Comment Length        0000 (0)\n-C73E7 Disk Start            0000 (0)\n-C73E9 Int File Attributes   0000 (0)\n+C79DC Compression Method    0000 (0) 'Stored'\n+C79DE Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C79E2 CRC                   00000000 (0)\n+C79E6 Compressed Size       00000000 (0)\n+C79EA Uncompressed Size     00000000 (0)\n+C79EE Filename Length       005F (95)\n+C79F0 Extra Length          0000 (0)\n+C79F2 Comment Length        0000 (0)\n+C79F4 Disk Start            0000 (0)\n+C79F6 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C73EB Ext File Attributes   41ED0010 (1106051088)\n+C79F8 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C73EF Local Header Offset   00001E8F (7823)\n-C73F3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C79FC Local Header Offset   00001E8F (7823)\n+C7A00 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC73F3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC7A00: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC73F3: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC7A00: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC73CB: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC79D8: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C7452 CENTRAL HEADER #73    02014B50 (33639248)\n-C7456 Created Zip Spec      14 (20) '2.0'\n-C7457 Created OS            03 (3) 'Unix'\n-C7458 Extract Zip Spec      0A (10) '1.0'\n-C7459 Extract OS            00 (0) 'MS-DOS'\n-C745A General Purpose Flag  0800 (2048)\n+C7A5F CENTRAL HEADER #73    02014B50 (33639248)\n+C7A63 Created Zip Spec      14 (20) '2.0'\n+C7A64 Created OS            03 (3) 'Unix'\n+C7A65 Extract Zip Spec      0A (10) '1.0'\n+C7A66 Extract OS            00 (0) 'MS-DOS'\n+C7A67 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C745C Compression Method    0000 (0) 'Stored'\n-C745E Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C7462 CRC                   00000000 (0)\n-C7466 Compressed Size       00000000 (0)\n-C746A Uncompressed Size     00000000 (0)\n-C746E Filename Length       0061 (97)\n-C7470 Extra Length          0000 (0)\n-C7472 Comment Length        0000 (0)\n-C7474 Disk Start            0000 (0)\n-C7476 Int File Attributes   0000 (0)\n+C7A69 Compression Method    0000 (0) 'Stored'\n+C7A6B Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C7A6F CRC                   00000000 (0)\n+C7A73 Compressed Size       00000000 (0)\n+C7A77 Uncompressed Size     00000000 (0)\n+C7A7B Filename Length       0061 (97)\n+C7A7D Extra Length          0000 (0)\n+C7A7F Comment Length        0000 (0)\n+C7A81 Disk Start            0000 (0)\n+C7A83 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C7478 Ext File Attributes   41ED0010 (1106051088)\n+C7A85 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C747C Local Header Offset   00001F0C (7948)\n-C7480 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C7A89 Local Header Offset   00001F0C (7948)\n+C7A8D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC7480: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC7A8D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC7480: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC7A8D: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC7458: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC7A65: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C74E1 CENTRAL HEADER #74    02014B50 (33639248)\n-C74E5 Created Zip Spec      14 (20) '2.0'\n-C74E6 Created OS            03 (3) 'Unix'\n-C74E7 Extract Zip Spec      0A (10) '1.0'\n-C74E8 Extract OS            00 (0) 'MS-DOS'\n-C74E9 General Purpose Flag  0800 (2048)\n+C7AEE CENTRAL HEADER #74    02014B50 (33639248)\n+C7AF2 Created Zip Spec      14 (20) '2.0'\n+C7AF3 Created OS            03 (3) 'Unix'\n+C7AF4 Extract Zip Spec      0A (10) '1.0'\n+C7AF5 Extract OS            00 (0) 'MS-DOS'\n+C7AF6 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C74EB Compression Method    0000 (0) 'Stored'\n-C74ED Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C74F1 CRC                   00000000 (0)\n-C74F5 Compressed Size       00000000 (0)\n-C74F9 Uncompressed Size     00000000 (0)\n-C74FD Filename Length       0060 (96)\n-C74FF Extra Length          0000 (0)\n-C7501 Comment Length        0000 (0)\n-C7503 Disk Start            0000 (0)\n-C7505 Int File Attributes   0000 (0)\n+C7AF8 Compression Method    0000 (0) 'Stored'\n+C7AFA Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C7AFE CRC                   00000000 (0)\n+C7B02 Compressed Size       00000000 (0)\n+C7B06 Uncompressed Size     00000000 (0)\n+C7B0A Filename Length       0060 (96)\n+C7B0C Extra Length          0000 (0)\n+C7B0E Comment Length        0000 (0)\n+C7B10 Disk Start            0000 (0)\n+C7B12 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C7507 Ext File Attributes   41ED0010 (1106051088)\n+C7B14 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C750B Local Header Offset   00001F8B (8075)\n-C750F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C7B18 Local Header Offset   00001F8B (8075)\n+C7B1C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC750F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC7B1C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC750F: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC7B1C: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC74E7: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC7AF4: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C756F CENTRAL HEADER #75    02014B50 (33639248)\n-C7573 Created Zip Spec      14 (20) '2.0'\n-C7574 Created OS            03 (3) 'Unix'\n-C7575 Extract Zip Spec      0A (10) '1.0'\n-C7576 Extract OS            00 (0) 'MS-DOS'\n-C7577 General Purpose Flag  0800 (2048)\n+C7B7C CENTRAL HEADER #75    02014B50 (33639248)\n+C7B80 Created Zip Spec      14 (20) '2.0'\n+C7B81 Created OS            03 (3) 'Unix'\n+C7B82 Extract Zip Spec      0A (10) '1.0'\n+C7B83 Extract OS            00 (0) 'MS-DOS'\n+C7B84 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C7579 Compression Method    0000 (0) 'Stored'\n-C757B Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C757F CRC                   00000000 (0)\n-C7583 Compressed Size       00000000 (0)\n-C7587 Uncompressed Size     00000000 (0)\n-C758B Filename Length       005F (95)\n-C758D Extra Length          0000 (0)\n-C758F Comment Length        0000 (0)\n-C7591 Disk Start            0000 (0)\n-C7593 Int File Attributes   0000 (0)\n+C7B86 Compression Method    0000 (0) 'Stored'\n+C7B88 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C7B8C CRC                   00000000 (0)\n+C7B90 Compressed Size       00000000 (0)\n+C7B94 Uncompressed Size     00000000 (0)\n+C7B98 Filename Length       005F (95)\n+C7B9A Extra Length          0000 (0)\n+C7B9C Comment Length        0000 (0)\n+C7B9E Disk Start            0000 (0)\n+C7BA0 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C7595 Ext File Attributes   41ED0010 (1106051088)\n+C7BA2 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C7599 Local Header Offset   00002009 (8201)\n-C759D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C7BA6 Local Header Offset   00002009 (8201)\n+C7BAA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC759D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC7BAA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC759D: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC7BAA: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC7575: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC7B82: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C75FC CENTRAL HEADER #76    02014B50 (33639248)\n-C7600 Created Zip Spec      14 (20) '2.0'\n-C7601 Created OS            03 (3) 'Unix'\n-C7602 Extract Zip Spec      0A (10) '1.0'\n-C7603 Extract OS            00 (0) 'MS-DOS'\n-C7604 General Purpose Flag  0800 (2048)\n+C7C09 CENTRAL HEADER #76    02014B50 (33639248)\n+C7C0D Created Zip Spec      14 (20) '2.0'\n+C7C0E Created OS            03 (3) 'Unix'\n+C7C0F Extract Zip Spec      0A (10) '1.0'\n+C7C10 Extract OS            00 (0) 'MS-DOS'\n+C7C11 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C7606 Compression Method    0000 (0) 'Stored'\n-C7608 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C760C CRC                   00000000 (0)\n-C7610 Compressed Size       00000000 (0)\n-C7614 Uncompressed Size     00000000 (0)\n-C7618 Filename Length       0060 (96)\n-C761A Extra Length          0000 (0)\n-C761C Comment Length        0000 (0)\n-C761E Disk Start            0000 (0)\n-C7620 Int File Attributes   0000 (0)\n+C7C13 Compression Method    0000 (0) 'Stored'\n+C7C15 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C7C19 CRC                   00000000 (0)\n+C7C1D Compressed Size       00000000 (0)\n+C7C21 Uncompressed Size     00000000 (0)\n+C7C25 Filename Length       0060 (96)\n+C7C27 Extra Length          0000 (0)\n+C7C29 Comment Length        0000 (0)\n+C7C2B Disk Start            0000 (0)\n+C7C2D Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C7622 Ext File Attributes   41ED0010 (1106051088)\n+C7C2F Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C7626 Local Header Offset   00002086 (8326)\n-C762A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C7C33 Local Header Offset   00002086 (8326)\n+C7C37 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC762A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC7C37: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC762A: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC7C37: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC7602: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC7C0F: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C768A CENTRAL HEADER #77    02014B50 (33639248)\n-C768E Created Zip Spec      14 (20) '2.0'\n-C768F Created OS            03 (3) 'Unix'\n-C7690 Extract Zip Spec      0A (10) '1.0'\n-C7691 Extract OS            00 (0) 'MS-DOS'\n-C7692 General Purpose Flag  0800 (2048)\n+C7C97 CENTRAL HEADER #77    02014B50 (33639248)\n+C7C9B Created Zip Spec      14 (20) '2.0'\n+C7C9C Created OS            03 (3) 'Unix'\n+C7C9D Extract Zip Spec      0A (10) '1.0'\n+C7C9E Extract OS            00 (0) 'MS-DOS'\n+C7C9F General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C7694 Compression Method    0000 (0) 'Stored'\n-C7696 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C769A CRC                   00000000 (0)\n-C769E Compressed Size       00000000 (0)\n-C76A2 Uncompressed Size     00000000 (0)\n-C76A6 Filename Length       007A (122)\n-C76A8 Extra Length          0000 (0)\n-C76AA Comment Length        0000 (0)\n-C76AC Disk Start            0000 (0)\n-C76AE Int File Attributes   0000 (0)\n+C7CA1 Compression Method    0000 (0) 'Stored'\n+C7CA3 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C7CA7 CRC                   00000000 (0)\n+C7CAB Compressed Size       00000000 (0)\n+C7CAF Uncompressed Size     00000000 (0)\n+C7CB3 Filename Length       007A (122)\n+C7CB5 Extra Length          0000 (0)\n+C7CB7 Comment Length        0000 (0)\n+C7CB9 Disk Start            0000 (0)\n+C7CBB Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C76B0 Ext File Attributes   41ED0010 (1106051088)\n+C7CBD Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C76B4 Local Header Offset   00002104 (8452)\n-C76B8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C7CC1 Local Header Offset   00002104 (8452)\n+C7CC5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC76B8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC7CC5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC76B8: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC7CC5: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC7690: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC7C9D: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C7732 CENTRAL HEADER #78    02014B50 (33639248)\n-C7736 Created Zip Spec      14 (20) '2.0'\n-C7737 Created OS            03 (3) 'Unix'\n-C7738 Extract Zip Spec      0A (10) '1.0'\n-C7739 Extract OS            00 (0) 'MS-DOS'\n-C773A General Purpose Flag  0800 (2048)\n+C7D3F CENTRAL HEADER #78    02014B50 (33639248)\n+C7D43 Created Zip Spec      14 (20) '2.0'\n+C7D44 Created OS            03 (3) 'Unix'\n+C7D45 Extract Zip Spec      0A (10) '1.0'\n+C7D46 Extract OS            00 (0) 'MS-DOS'\n+C7D47 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C773C Compression Method    0000 (0) 'Stored'\n-C773E Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C7742 CRC                   00000000 (0)\n-C7746 Compressed Size       00000000 (0)\n-C774A Uncompressed Size     00000000 (0)\n-C774E Filename Length       007B (123)\n-C7750 Extra Length          0000 (0)\n-C7752 Comment Length        0000 (0)\n-C7754 Disk Start            0000 (0)\n-C7756 Int File Attributes   0000 (0)\n+C7D49 Compression Method    0000 (0) 'Stored'\n+C7D4B Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C7D4F CRC                   00000000 (0)\n+C7D53 Compressed Size       00000000 (0)\n+C7D57 Uncompressed Size     00000000 (0)\n+C7D5B Filename Length       007B (123)\n+C7D5D Extra Length          0000 (0)\n+C7D5F Comment Length        0000 (0)\n+C7D61 Disk Start            0000 (0)\n+C7D63 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C7758 Ext File Attributes   41ED0010 (1106051088)\n+C7D65 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C775C Local Header Offset   0000219C (8604)\n-C7760 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C7D69 Local Header Offset   0000219C (8604)\n+C7D6D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC7760: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC7D6D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC7760: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC7D6D: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC7738: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC7D45: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C77DB CENTRAL HEADER #79    02014B50 (33639248)\n-C77DF Created Zip Spec      14 (20) '2.0'\n-C77E0 Created OS            03 (3) 'Unix'\n-C77E1 Extract Zip Spec      0A (10) '1.0'\n-C77E2 Extract OS            00 (0) 'MS-DOS'\n-C77E3 General Purpose Flag  0800 (2048)\n+C7DE8 CENTRAL HEADER #79    02014B50 (33639248)\n+C7DEC Created Zip Spec      14 (20) '2.0'\n+C7DED Created OS            03 (3) 'Unix'\n+C7DEE Extract Zip Spec      0A (10) '1.0'\n+C7DEF Extract OS            00 (0) 'MS-DOS'\n+C7DF0 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C77E5 Compression Method    0000 (0) 'Stored'\n-C77E7 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C77EB CRC                   00000000 (0)\n-C77EF Compressed Size       00000000 (0)\n-C77F3 Uncompressed Size     00000000 (0)\n-C77F7 Filename Length       0076 (118)\n-C77F9 Extra Length          0000 (0)\n-C77FB Comment Length        0000 (0)\n-C77FD Disk Start            0000 (0)\n-C77FF Int File Attributes   0000 (0)\n+C7DF2 Compression Method    0000 (0) 'Stored'\n+C7DF4 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C7DF8 CRC                   00000000 (0)\n+C7DFC Compressed Size       00000000 (0)\n+C7E00 Uncompressed Size     00000000 (0)\n+C7E04 Filename Length       0076 (118)\n+C7E06 Extra Length          0000 (0)\n+C7E08 Comment Length        0000 (0)\n+C7E0A Disk Start            0000 (0)\n+C7E0C Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C7801 Ext File Attributes   41ED0010 (1106051088)\n+C7E0E Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C7805 Local Header Offset   00002235 (8757)\n-C7809 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C7E12 Local Header Offset   00002235 (8757)\n+C7E16 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC7809: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC7E16: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC7809: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC7E16: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC77E1: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC7DEE: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C787F CENTRAL HEADER #80    02014B50 (33639248)\n-C7883 Created Zip Spec      14 (20) '2.0'\n-C7884 Created OS            03 (3) 'Unix'\n-C7885 Extract Zip Spec      0A (10) '1.0'\n-C7886 Extract OS            00 (0) 'MS-DOS'\n-C7887 General Purpose Flag  0800 (2048)\n+C7E8C CENTRAL HEADER #80    02014B50 (33639248)\n+C7E90 Created Zip Spec      14 (20) '2.0'\n+C7E91 Created OS            03 (3) 'Unix'\n+C7E92 Extract Zip Spec      0A (10) '1.0'\n+C7E93 Extract OS            00 (0) 'MS-DOS'\n+C7E94 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C7889 Compression Method    0000 (0) 'Stored'\n-C788B Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C788F CRC                   00000000 (0)\n-C7893 Compressed Size       00000000 (0)\n-C7897 Uncompressed Size     00000000 (0)\n-C789B Filename Length       0077 (119)\n-C789D Extra Length          0000 (0)\n-C789F Comment Length        0000 (0)\n-C78A1 Disk Start            0000 (0)\n-C78A3 Int File Attributes   0000 (0)\n+C7E96 Compression Method    0000 (0) 'Stored'\n+C7E98 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C7E9C CRC                   00000000 (0)\n+C7EA0 Compressed Size       00000000 (0)\n+C7EA4 Uncompressed Size     00000000 (0)\n+C7EA8 Filename Length       0077 (119)\n+C7EAA Extra Length          0000 (0)\n+C7EAC Comment Length        0000 (0)\n+C7EAE Disk Start            0000 (0)\n+C7EB0 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C78A5 Ext File Attributes   41ED0010 (1106051088)\n+C7EB2 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C78A9 Local Header Offset   000022C9 (8905)\n-C78AD Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C7EB6 Local Header Offset   000022C9 (8905)\n+C7EBA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC78AD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC7EBA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC78AD: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC7EBA: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC7885: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC7E92: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C7924 CENTRAL HEADER #81    02014B50 (33639248)\n-C7928 Created Zip Spec      14 (20) '2.0'\n-C7929 Created OS            03 (3) 'Unix'\n-C792A Extract Zip Spec      0A (10) '1.0'\n-C792B Extract OS            00 (0) 'MS-DOS'\n-C792C General Purpose Flag  0800 (2048)\n+C7F31 CENTRAL HEADER #81    02014B50 (33639248)\n+C7F35 Created Zip Spec      14 (20) '2.0'\n+C7F36 Created OS            03 (3) 'Unix'\n+C7F37 Extract Zip Spec      0A (10) '1.0'\n+C7F38 Extract OS            00 (0) 'MS-DOS'\n+C7F39 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C792E Compression Method    0000 (0) 'Stored'\n-C7930 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C7934 CRC                   00000000 (0)\n-C7938 Compressed Size       00000000 (0)\n-C793C Uncompressed Size     00000000 (0)\n-C7940 Filename Length       0026 (38)\n-C7942 Extra Length          0000 (0)\n-C7944 Comment Length        0000 (0)\n-C7946 Disk Start            0000 (0)\n-C7948 Int File Attributes   0000 (0)\n+C7F3B Compression Method    0000 (0) 'Stored'\n+C7F3D Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C7F41 CRC                   00000000 (0)\n+C7F45 Compressed Size       00000000 (0)\n+C7F49 Uncompressed Size     00000000 (0)\n+C7F4D Filename Length       0026 (38)\n+C7F4F Extra Length          0000 (0)\n+C7F51 Comment Length        0000 (0)\n+C7F53 Disk Start            0000 (0)\n+C7F55 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C794A Ext File Attributes   41ED0010 (1106051088)\n+C7F57 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C794E Local Header Offset   0000235E (9054)\n-C7952 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C7F5B Local Header Offset   0000235E (9054)\n+C7F5F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC7952: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC7F5F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC7952: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC7F5F: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC792A: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC7F37: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C7978 CENTRAL HEADER #82    02014B50 (33639248)\n-C797C Created Zip Spec      14 (20) '2.0'\n-C797D Created OS            03 (3) 'Unix'\n-C797E Extract Zip Spec      0A (10) '1.0'\n-C797F Extract OS            00 (0) 'MS-DOS'\n-C7980 General Purpose Flag  0800 (2048)\n+C7F85 CENTRAL HEADER #82    02014B50 (33639248)\n+C7F89 Created Zip Spec      14 (20) '2.0'\n+C7F8A Created OS            03 (3) 'Unix'\n+C7F8B Extract Zip Spec      0A (10) '1.0'\n+C7F8C Extract OS            00 (0) 'MS-DOS'\n+C7F8D General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C7982 Compression Method    0000 (0) 'Stored'\n-C7984 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C7988 CRC                   00000000 (0)\n-C798C Compressed Size       00000000 (0)\n-C7990 Uncompressed Size     00000000 (0)\n-C7994 Filename Length       002F (47)\n-C7996 Extra Length          0000 (0)\n-C7998 Comment Length        0000 (0)\n-C799A Disk Start            0000 (0)\n-C799C Int File Attributes   0000 (0)\n+C7F8F Compression Method    0000 (0) 'Stored'\n+C7F91 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C7F95 CRC                   00000000 (0)\n+C7F99 Compressed Size       00000000 (0)\n+C7F9D Uncompressed Size     00000000 (0)\n+C7FA1 Filename Length       002F (47)\n+C7FA3 Extra Length          0000 (0)\n+C7FA5 Comment Length        0000 (0)\n+C7FA7 Disk Start            0000 (0)\n+C7FA9 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C799E Ext File Attributes   41ED0010 (1106051088)\n+C7FAB Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C79A2 Local Header Offset   000023A2 (9122)\n-C79A6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C7FAF Local Header Offset   000023A2 (9122)\n+C7FB3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC79A6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC7FB3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC79A6: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC7FB3: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC797E: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC7F8B: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C79D5 CENTRAL HEADER #83    02014B50 (33639248)\n-C79D9 Created Zip Spec      14 (20) '2.0'\n-C79DA Created OS            03 (3) 'Unix'\n-C79DB Extract Zip Spec      0A (10) '1.0'\n-C79DC Extract OS            00 (0) 'MS-DOS'\n-C79DD General Purpose Flag  0800 (2048)\n+C7FE2 CENTRAL HEADER #83    02014B50 (33639248)\n+C7FE6 Created Zip Spec      14 (20) '2.0'\n+C7FE7 Created OS            03 (3) 'Unix'\n+C7FE8 Extract Zip Spec      0A (10) '1.0'\n+C7FE9 Extract OS            00 (0) 'MS-DOS'\n+C7FEA General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C79DF Compression Method    0000 (0) 'Stored'\n-C79E1 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C79E5 CRC                   00000000 (0)\n-C79E9 Compressed Size       00000000 (0)\n-C79ED Uncompressed Size     00000000 (0)\n-C79F1 Filename Length       0060 (96)\n-C79F3 Extra Length          0000 (0)\n-C79F5 Comment Length        0000 (0)\n-C79F7 Disk Start            0000 (0)\n-C79F9 Int File Attributes   0000 (0)\n+C7FEC Compression Method    0000 (0) 'Stored'\n+C7FEE Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C7FF2 CRC                   00000000 (0)\n+C7FF6 Compressed Size       00000000 (0)\n+C7FFA Uncompressed Size     00000000 (0)\n+C7FFE Filename Length       0060 (96)\n+C8000 Extra Length          0000 (0)\n+C8002 Comment Length        0000 (0)\n+C8004 Disk Start            0000 (0)\n+C8006 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C79FB Ext File Attributes   41ED0010 (1106051088)\n+C8008 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C79FF Local Header Offset   000023EF (9199)\n-C7A03 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C800C Local Header Offset   000023EF (9199)\n+C8010 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC7A03: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC8010: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC7A03: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC8010: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC79DB: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC7FE8: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C7A63 CENTRAL HEADER #84    02014B50 (33639248)\n-C7A67 Created Zip Spec      14 (20) '2.0'\n-C7A68 Created OS            03 (3) 'Unix'\n-C7A69 Extract Zip Spec      0A (10) '1.0'\n-C7A6A Extract OS            00 (0) 'MS-DOS'\n-C7A6B General Purpose Flag  0800 (2048)\n+C8070 CENTRAL HEADER #84    02014B50 (33639248)\n+C8074 Created Zip Spec      14 (20) '2.0'\n+C8075 Created OS            03 (3) 'Unix'\n+C8076 Extract Zip Spec      0A (10) '1.0'\n+C8077 Extract OS            00 (0) 'MS-DOS'\n+C8078 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C7A6D Compression Method    0000 (0) 'Stored'\n-C7A6F Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C7A73 CRC                   00000000 (0)\n-C7A77 Compressed Size       00000000 (0)\n-C7A7B Uncompressed Size     00000000 (0)\n-C7A7F Filename Length       0026 (38)\n-C7A81 Extra Length          0000 (0)\n-C7A83 Comment Length        0000 (0)\n-C7A85 Disk Start            0000 (0)\n-C7A87 Int File Attributes   0000 (0)\n+C807A Compression Method    0000 (0) 'Stored'\n+C807C Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C8080 CRC                   00000000 (0)\n+C8084 Compressed Size       00000000 (0)\n+C8088 Uncompressed Size     00000000 (0)\n+C808C Filename Length       0026 (38)\n+C808E Extra Length          0000 (0)\n+C8090 Comment Length        0000 (0)\n+C8092 Disk Start            0000 (0)\n+C8094 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C7A89 Ext File Attributes   41ED0010 (1106051088)\n+C8096 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C7A8D Local Header Offset   0000246D (9325)\n-C7A91 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C809A Local Header Offset   0000246D (9325)\n+C809E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC7A91: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC809E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC7A91: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC809E: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC7A69: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC8076: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C7AB7 CENTRAL HEADER #85    02014B50 (33639248)\n-C7ABB Created Zip Spec      14 (20) '2.0'\n-C7ABC Created OS            03 (3) 'Unix'\n-C7ABD Extract Zip Spec      0A (10) '1.0'\n-C7ABE Extract OS            00 (0) 'MS-DOS'\n-C7ABF General Purpose Flag  0800 (2048)\n+C80C4 CENTRAL HEADER #85    02014B50 (33639248)\n+C80C8 Created Zip Spec      14 (20) '2.0'\n+C80C9 Created OS            03 (3) 'Unix'\n+C80CA Extract Zip Spec      0A (10) '1.0'\n+C80CB Extract OS            00 (0) 'MS-DOS'\n+C80CC General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C7AC1 Compression Method    0000 (0) 'Stored'\n-C7AC3 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C7AC7 CRC                   00000000 (0)\n-C7ACB Compressed Size       00000000 (0)\n-C7ACF Uncompressed Size     00000000 (0)\n-C7AD3 Filename Length       002F (47)\n-C7AD5 Extra Length          0000 (0)\n-C7AD7 Comment Length        0000 (0)\n-C7AD9 Disk Start            0000 (0)\n-C7ADB Int File Attributes   0000 (0)\n+C80CE Compression Method    0000 (0) 'Stored'\n+C80D0 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C80D4 CRC                   00000000 (0)\n+C80D8 Compressed Size       00000000 (0)\n+C80DC Uncompressed Size     00000000 (0)\n+C80E0 Filename Length       002F (47)\n+C80E2 Extra Length          0000 (0)\n+C80E4 Comment Length        0000 (0)\n+C80E6 Disk Start            0000 (0)\n+C80E8 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C7ADD Ext File Attributes   41ED0010 (1106051088)\n+C80EA Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C7AE1 Local Header Offset   000024B1 (9393)\n-C7AE5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C80EE Local Header Offset   000024B1 (9393)\n+C80F2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC7AE5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC80F2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC7AE5: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC80F2: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC7ABD: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC80CA: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C7B14 CENTRAL HEADER #86    02014B50 (33639248)\n-C7B18 Created Zip Spec      14 (20) '2.0'\n-C7B19 Created OS            03 (3) 'Unix'\n-C7B1A Extract Zip Spec      0A (10) '1.0'\n-C7B1B Extract OS            00 (0) 'MS-DOS'\n-C7B1C General Purpose Flag  0800 (2048)\n+C8121 CENTRAL HEADER #86    02014B50 (33639248)\n+C8125 Created Zip Spec      14 (20) '2.0'\n+C8126 Created OS            03 (3) 'Unix'\n+C8127 Extract Zip Spec      0A (10) '1.0'\n+C8128 Extract OS            00 (0) 'MS-DOS'\n+C8129 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C7B1E Compression Method    0000 (0) 'Stored'\n-C7B20 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C7B24 CRC                   00000000 (0)\n-C7B28 Compressed Size       00000000 (0)\n-C7B2C Uncompressed Size     00000000 (0)\n-C7B30 Filename Length       0066 (102)\n-C7B32 Extra Length          0000 (0)\n-C7B34 Comment Length        0000 (0)\n-C7B36 Disk Start            0000 (0)\n-C7B38 Int File Attributes   0000 (0)\n+C812B Compression Method    0000 (0) 'Stored'\n+C812D Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C8131 CRC                   00000000 (0)\n+C8135 Compressed Size       00000000 (0)\n+C8139 Uncompressed Size     00000000 (0)\n+C813D Filename Length       0066 (102)\n+C813F Extra Length          0000 (0)\n+C8141 Comment Length        0000 (0)\n+C8143 Disk Start            0000 (0)\n+C8145 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C7B3A Ext File Attributes   41ED0010 (1106051088)\n+C8147 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C7B3E Local Header Offset   000024FE (9470)\n-C7B42 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C814B Local Header Offset   000024FE (9470)\n+C814F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC7B42: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC814F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC7B42: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC814F: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC7B1A: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC8127: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C7BA8 CENTRAL HEADER #87    02014B50 (33639248)\n-C7BAC Created Zip Spec      14 (20) '2.0'\n-C7BAD Created OS            03 (3) 'Unix'\n-C7BAE Extract Zip Spec      0A (10) '1.0'\n-C7BAF Extract OS            00 (0) 'MS-DOS'\n-C7BB0 General Purpose Flag  0800 (2048)\n+C81B5 CENTRAL HEADER #87    02014B50 (33639248)\n+C81B9 Created Zip Spec      14 (20) '2.0'\n+C81BA Created OS            03 (3) 'Unix'\n+C81BB Extract Zip Spec      0A (10) '1.0'\n+C81BC Extract OS            00 (0) 'MS-DOS'\n+C81BD General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C7BB2 Compression Method    0000 (0) 'Stored'\n-C7BB4 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C7BB8 CRC                   00000000 (0)\n-C7BBC Compressed Size       00000000 (0)\n-C7BC0 Uncompressed Size     00000000 (0)\n-C7BC4 Filename Length       002E (46)\n-C7BC6 Extra Length          0000 (0)\n-C7BC8 Comment Length        0000 (0)\n-C7BCA Disk Start            0000 (0)\n-C7BCC Int File Attributes   0000 (0)\n+C81BF Compression Method    0000 (0) 'Stored'\n+C81C1 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C81C5 CRC                   00000000 (0)\n+C81C9 Compressed Size       00000000 (0)\n+C81CD Uncompressed Size     00000000 (0)\n+C81D1 Filename Length       002E (46)\n+C81D3 Extra Length          0000 (0)\n+C81D5 Comment Length        0000 (0)\n+C81D7 Disk Start            0000 (0)\n+C81D9 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C7BCE Ext File Attributes   41ED0010 (1106051088)\n+C81DB Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C7BD2 Local Header Offset   00002582 (9602)\n-C7BD6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C81DF Local Header Offset   00002582 (9602)\n+C81E3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC7BD6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC81E3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC7BD6: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC81E3: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC7BAE: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC81BB: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C7C04 CENTRAL HEADER #88    02014B50 (33639248)\n-C7C08 Created Zip Spec      14 (20) '2.0'\n-C7C09 Created OS            03 (3) 'Unix'\n-C7C0A Extract Zip Spec      0A (10) '1.0'\n-C7C0B Extract OS            00 (0) 'MS-DOS'\n-C7C0C General Purpose Flag  0800 (2048)\n+C8211 CENTRAL HEADER #88    02014B50 (33639248)\n+C8215 Created Zip Spec      14 (20) '2.0'\n+C8216 Created OS            03 (3) 'Unix'\n+C8217 Extract Zip Spec      0A (10) '1.0'\n+C8218 Extract OS            00 (0) 'MS-DOS'\n+C8219 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C7C0E Compression Method    0000 (0) 'Stored'\n-C7C10 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C7C14 CRC                   00000000 (0)\n-C7C18 Compressed Size       00000000 (0)\n-C7C1C Uncompressed Size     00000000 (0)\n-C7C20 Filename Length       0037 (55)\n-C7C22 Extra Length          0000 (0)\n-C7C24 Comment Length        0000 (0)\n-C7C26 Disk Start            0000 (0)\n-C7C28 Int File Attributes   0000 (0)\n+C821B Compression Method    0000 (0) 'Stored'\n+C821D Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C8221 CRC                   00000000 (0)\n+C8225 Compressed Size       00000000 (0)\n+C8229 Uncompressed Size     00000000 (0)\n+C822D Filename Length       0037 (55)\n+C822F Extra Length          0000 (0)\n+C8231 Comment Length        0000 (0)\n+C8233 Disk Start            0000 (0)\n+C8235 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C7C2A Ext File Attributes   41ED0010 (1106051088)\n+C8237 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C7C2E Local Header Offset   000025CE (9678)\n-C7C32 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C823B Local Header Offset   000025CE (9678)\n+C823F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC7C32: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC823F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC7C32: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC823F: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC7C0A: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC8217: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C7C69 CENTRAL HEADER #89    02014B50 (33639248)\n-C7C6D Created Zip Spec      14 (20) '2.0'\n-C7C6E Created OS            03 (3) 'Unix'\n-C7C6F Extract Zip Spec      0A (10) '1.0'\n-C7C70 Extract OS            00 (0) 'MS-DOS'\n-C7C71 General Purpose Flag  0800 (2048)\n+C8276 CENTRAL HEADER #89    02014B50 (33639248)\n+C827A Created Zip Spec      14 (20) '2.0'\n+C827B Created OS            03 (3) 'Unix'\n+C827C Extract Zip Spec      0A (10) '1.0'\n+C827D Extract OS            00 (0) 'MS-DOS'\n+C827E General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C7C73 Compression Method    0000 (0) 'Stored'\n-C7C75 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C7C79 CRC                   00000000 (0)\n-C7C7D Compressed Size       00000000 (0)\n-C7C81 Uncompressed Size     00000000 (0)\n-C7C85 Filename Length       007B (123)\n-C7C87 Extra Length          0000 (0)\n-C7C89 Comment Length        0000 (0)\n-C7C8B Disk Start            0000 (0)\n-C7C8D Int File Attributes   0000 (0)\n+C8280 Compression Method    0000 (0) 'Stored'\n+C8282 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C8286 CRC                   00000000 (0)\n+C828A Compressed Size       00000000 (0)\n+C828E Uncompressed Size     00000000 (0)\n+C8292 Filename Length       007B (123)\n+C8294 Extra Length          0000 (0)\n+C8296 Comment Length        0000 (0)\n+C8298 Disk Start            0000 (0)\n+C829A Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C7C8F Ext File Attributes   41ED0010 (1106051088)\n+C829C Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C7C93 Local Header Offset   00002623 (9763)\n-C7C97 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C82A0 Local Header Offset   00002623 (9763)\n+C82A4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC7C97: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC82A4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC7C97: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC82A4: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC7C6F: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC827C: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C7D12 CENTRAL HEADER #90    02014B50 (33639248)\n-C7D16 Created Zip Spec      14 (20) '2.0'\n-C7D17 Created OS            03 (3) 'Unix'\n-C7D18 Extract Zip Spec      0A (10) '1.0'\n-C7D19 Extract OS            00 (0) 'MS-DOS'\n-C7D1A General Purpose Flag  0800 (2048)\n+C831F CENTRAL HEADER #90    02014B50 (33639248)\n+C8323 Created Zip Spec      14 (20) '2.0'\n+C8324 Created OS            03 (3) 'Unix'\n+C8325 Extract Zip Spec      0A (10) '1.0'\n+C8326 Extract OS            00 (0) 'MS-DOS'\n+C8327 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C7D1C Compression Method    0000 (0) 'Stored'\n-C7D1E Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C7D22 CRC                   00000000 (0)\n-C7D26 Compressed Size       00000000 (0)\n-C7D2A Uncompressed Size     00000000 (0)\n-C7D2E Filename Length       0031 (49)\n-C7D30 Extra Length          0000 (0)\n-C7D32 Comment Length        0000 (0)\n-C7D34 Disk Start            0000 (0)\n-C7D36 Int File Attributes   0000 (0)\n+C8329 Compression Method    0000 (0) 'Stored'\n+C832B Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C832F CRC                   00000000 (0)\n+C8333 Compressed Size       00000000 (0)\n+C8337 Uncompressed Size     00000000 (0)\n+C833B Filename Length       0031 (49)\n+C833D Extra Length          0000 (0)\n+C833F Comment Length        0000 (0)\n+C8341 Disk Start            0000 (0)\n+C8343 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C7D38 Ext File Attributes   41ED0010 (1106051088)\n+C8345 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C7D3C Local Header Offset   000026BC (9916)\n-C7D40 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C8349 Local Header Offset   000026BC (9916)\n+C834D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC7D40: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC834D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC7D40: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC834D: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC7D18: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC8325: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C7D71 CENTRAL HEADER #91    02014B50 (33639248)\n-C7D75 Created Zip Spec      14 (20) '2.0'\n-C7D76 Created OS            03 (3) 'Unix'\n-C7D77 Extract Zip Spec      0A (10) '1.0'\n-C7D78 Extract OS            00 (0) 'MS-DOS'\n-C7D79 General Purpose Flag  0800 (2048)\n+C837E CENTRAL HEADER #91    02014B50 (33639248)\n+C8382 Created Zip Spec      14 (20) '2.0'\n+C8383 Created OS            03 (3) 'Unix'\n+C8384 Extract Zip Spec      0A (10) '1.0'\n+C8385 Extract OS            00 (0) 'MS-DOS'\n+C8386 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C7D7B Compression Method    0000 (0) 'Stored'\n-C7D7D Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C7D81 CRC                   00000000 (0)\n-C7D85 Compressed Size       00000000 (0)\n-C7D89 Uncompressed Size     00000000 (0)\n-C7D8D Filename Length       003A (58)\n-C7D8F Extra Length          0000 (0)\n-C7D91 Comment Length        0000 (0)\n-C7D93 Disk Start            0000 (0)\n-C7D95 Int File Attributes   0000 (0)\n+C8388 Compression Method    0000 (0) 'Stored'\n+C838A Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C838E CRC                   00000000 (0)\n+C8392 Compressed Size       00000000 (0)\n+C8396 Uncompressed Size     00000000 (0)\n+C839A Filename Length       003A (58)\n+C839C Extra Length          0000 (0)\n+C839E Comment Length        0000 (0)\n+C83A0 Disk Start            0000 (0)\n+C83A2 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C7D97 Ext File Attributes   41ED0010 (1106051088)\n+C83A4 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C7D9B Local Header Offset   0000270B (9995)\n-C7D9F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C83A8 Local Header Offset   0000270B (9995)\n+C83AC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC7D9F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC83AC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC7D9F: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC83AC: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC7D77: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC8384: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C7DD9 CENTRAL HEADER #92    02014B50 (33639248)\n-C7DDD Created Zip Spec      14 (20) '2.0'\n-C7DDE Created OS            03 (3) 'Unix'\n-C7DDF Extract Zip Spec      0A (10) '1.0'\n-C7DE0 Extract OS            00 (0) 'MS-DOS'\n-C7DE1 General Purpose Flag  0800 (2048)\n+C83E6 CENTRAL HEADER #92    02014B50 (33639248)\n+C83EA Created Zip Spec      14 (20) '2.0'\n+C83EB Created OS            03 (3) 'Unix'\n+C83EC Extract Zip Spec      0A (10) '1.0'\n+C83ED Extract OS            00 (0) 'MS-DOS'\n+C83EE General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C7DE3 Compression Method    0000 (0) 'Stored'\n-C7DE5 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C7DE9 CRC                   00000000 (0)\n-C7DED Compressed Size       00000000 (0)\n-C7DF1 Uncompressed Size     00000000 (0)\n-C7DF5 Filename Length       0081 (129)\n-C7DF7 Extra Length          0000 (0)\n-C7DF9 Comment Length        0000 (0)\n-C7DFB Disk Start            0000 (0)\n-C7DFD Int File Attributes   0000 (0)\n+C83F0 Compression Method    0000 (0) 'Stored'\n+C83F2 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C83F6 CRC                   00000000 (0)\n+C83FA Compressed Size       00000000 (0)\n+C83FE Uncompressed Size     00000000 (0)\n+C8402 Filename Length       0081 (129)\n+C8404 Extra Length          0000 (0)\n+C8406 Comment Length        0000 (0)\n+C8408 Disk Start            0000 (0)\n+C840A Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C7DFF Ext File Attributes   41ED0010 (1106051088)\n+C840C Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C7E03 Local Header Offset   00002763 (10083)\n-C7E07 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C8410 Local Header Offset   00002763 (10083)\n+C8414 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC7E07: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC8414: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC7E07: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC8414: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC7DDF: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC83EC: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C7E88 CENTRAL HEADER #93    02014B50 (33639248)\n-C7E8C Created Zip Spec      14 (20) '2.0'\n-C7E8D Created OS            03 (3) 'Unix'\n-C7E8E Extract Zip Spec      0A (10) '1.0'\n-C7E8F Extract OS            00 (0) 'MS-DOS'\n-C7E90 General Purpose Flag  0800 (2048)\n+C8495 CENTRAL HEADER #93    02014B50 (33639248)\n+C8499 Created Zip Spec      14 (20) '2.0'\n+C849A Created OS            03 (3) 'Unix'\n+C849B Extract Zip Spec      0A (10) '1.0'\n+C849C Extract OS            00 (0) 'MS-DOS'\n+C849D General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C7E92 Compression Method    0000 (0) 'Stored'\n-C7E94 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C7E98 CRC                   00000000 (0)\n-C7E9C Compressed Size       00000000 (0)\n-C7EA0 Uncompressed Size     00000000 (0)\n-C7EA4 Filename Length       0088 (136)\n-C7EA6 Extra Length          0000 (0)\n-C7EA8 Comment Length        0000 (0)\n-C7EAA Disk Start            0000 (0)\n-C7EAC Int File Attributes   0000 (0)\n+C849F Compression Method    0000 (0) 'Stored'\n+C84A1 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C84A5 CRC                   00000000 (0)\n+C84A9 Compressed Size       00000000 (0)\n+C84AD Uncompressed Size     00000000 (0)\n+C84B1 Filename Length       0088 (136)\n+C84B3 Extra Length          0000 (0)\n+C84B5 Comment Length        0000 (0)\n+C84B7 Disk Start            0000 (0)\n+C84B9 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C7EAE Ext File Attributes   41ED0010 (1106051088)\n+C84BB Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C7EB2 Local Header Offset   00002802 (10242)\n-C7EB6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+C84BF Local Header Offset   00002802 (10242)\n+C84C3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXX'\n #\n-# WARNING: Offset 0xC7EB6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC84C3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC7EB6: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC84C3: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC7E8E: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC849B: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C7F3E CENTRAL HEADER #94    02014B50 (33639248)\n-C7F42 Created Zip Spec      14 (20) '2.0'\n-C7F43 Created OS            03 (3) 'Unix'\n-C7F44 Extract Zip Spec      0A (10) '1.0'\n-C7F45 Extract OS            00 (0) 'MS-DOS'\n-C7F46 General Purpose Flag  0800 (2048)\n+C854B CENTRAL HEADER #94    02014B50 (33639248)\n+C854F Created Zip Spec      14 (20) '2.0'\n+C8550 Created OS            03 (3) 'Unix'\n+C8551 Extract Zip Spec      0A (10) '1.0'\n+C8552 Extract OS            00 (0) 'MS-DOS'\n+C8553 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C7F48 Compression Method    0000 (0) 'Stored'\n-C7F4A Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C7F4E CRC                   00000000 (0)\n-C7F52 Compressed Size       00000000 (0)\n-C7F56 Uncompressed Size     00000000 (0)\n-C7F5A Filename Length       0088 (136)\n-C7F5C Extra Length          0000 (0)\n-C7F5E Comment Length        0000 (0)\n-C7F60 Disk Start            0000 (0)\n-C7F62 Int File Attributes   0000 (0)\n+C8555 Compression Method    0000 (0) 'Stored'\n+C8557 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C855B CRC                   00000000 (0)\n+C855F Compressed Size       00000000 (0)\n+C8563 Uncompressed Size     00000000 (0)\n+C8567 Filename Length       0088 (136)\n+C8569 Extra Length          0000 (0)\n+C856B Comment Length        0000 (0)\n+C856D Disk Start            0000 (0)\n+C856F Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C7F64 Ext File Attributes   41ED0010 (1106051088)\n+C8571 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C7F68 Local Header Offset   000028A8 (10408)\n-C7F6C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+C8575 Local Header Offset   000028A8 (10408)\n+C8579 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXX'\n #\n-# WARNING: Offset 0xC7F6C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC8579: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC7F6C: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC8579: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC7F44: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC8551: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C7FF4 CENTRAL HEADER #95    02014B50 (33639248)\n-C7FF8 Created Zip Spec      14 (20) '2.0'\n-C7FF9 Created OS            03 (3) 'Unix'\n-C7FFA Extract Zip Spec      0A (10) '1.0'\n-C7FFB Extract OS            00 (0) 'MS-DOS'\n-C7FFC General Purpose Flag  0800 (2048)\n+C8601 CENTRAL HEADER #95    02014B50 (33639248)\n+C8605 Created Zip Spec      14 (20) '2.0'\n+C8606 Created OS            03 (3) 'Unix'\n+C8607 Extract Zip Spec      0A (10) '1.0'\n+C8608 Extract OS            00 (0) 'MS-DOS'\n+C8609 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C7FFE Compression Method    0000 (0) 'Stored'\n-C8000 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C8004 CRC                   00000000 (0)\n-C8008 Compressed Size       00000000 (0)\n-C800C Uncompressed Size     00000000 (0)\n-C8010 Filename Length       0026 (38)\n-C8012 Extra Length          0000 (0)\n-C8014 Comment Length        0000 (0)\n-C8016 Disk Start            0000 (0)\n-C8018 Int File Attributes   0000 (0)\n+C860B Compression Method    0000 (0) 'Stored'\n+C860D Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C8611 CRC                   00000000 (0)\n+C8615 Compressed Size       00000000 (0)\n+C8619 Uncompressed Size     00000000 (0)\n+C861D Filename Length       0026 (38)\n+C861F Extra Length          0000 (0)\n+C8621 Comment Length        0000 (0)\n+C8623 Disk Start            0000 (0)\n+C8625 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C801A Ext File Attributes   41ED0010 (1106051088)\n+C8627 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C801E Local Header Offset   0000294E (10574)\n-C8022 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C862B Local Header Offset   0000294E (10574)\n+C862F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC8022: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC862F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC8022: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC862F: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC7FFA: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC8607: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C8048 CENTRAL HEADER #96    02014B50 (33639248)\n-C804C Created Zip Spec      14 (20) '2.0'\n-C804D Created OS            03 (3) 'Unix'\n-C804E Extract Zip Spec      0A (10) '1.0'\n-C804F Extract OS            00 (0) 'MS-DOS'\n-C8050 General Purpose Flag  0800 (2048)\n+C8655 CENTRAL HEADER #96    02014B50 (33639248)\n+C8659 Created Zip Spec      14 (20) '2.0'\n+C865A Created OS            03 (3) 'Unix'\n+C865B Extract Zip Spec      0A (10) '1.0'\n+C865C Extract OS            00 (0) 'MS-DOS'\n+C865D General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C8052 Compression Method    0000 (0) 'Stored'\n-C8054 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C8058 CRC                   00000000 (0)\n-C805C Compressed Size       00000000 (0)\n-C8060 Uncompressed Size     00000000 (0)\n-C8064 Filename Length       002F (47)\n-C8066 Extra Length          0000 (0)\n-C8068 Comment Length        0000 (0)\n-C806A Disk Start            0000 (0)\n-C806C Int File Attributes   0000 (0)\n+C865F Compression Method    0000 (0) 'Stored'\n+C8661 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C8665 CRC                   00000000 (0)\n+C8669 Compressed Size       00000000 (0)\n+C866D Uncompressed Size     00000000 (0)\n+C8671 Filename Length       002F (47)\n+C8673 Extra Length          0000 (0)\n+C8675 Comment Length        0000 (0)\n+C8677 Disk Start            0000 (0)\n+C8679 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C806E Ext File Attributes   41ED0010 (1106051088)\n+C867B Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C8072 Local Header Offset   00002992 (10642)\n-C8076 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C867F Local Header Offset   00002992 (10642)\n+C8683 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC8076: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC8683: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC8076: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC8683: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC804E: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC865B: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C80A5 CENTRAL HEADER #97    02014B50 (33639248)\n-C80A9 Created Zip Spec      14 (20) '2.0'\n-C80AA Created OS            03 (3) 'Unix'\n-C80AB Extract Zip Spec      0A (10) '1.0'\n-C80AC Extract OS            00 (0) 'MS-DOS'\n-C80AD General Purpose Flag  0800 (2048)\n+C86B2 CENTRAL HEADER #97    02014B50 (33639248)\n+C86B6 Created Zip Spec      14 (20) '2.0'\n+C86B7 Created OS            03 (3) 'Unix'\n+C86B8 Extract Zip Spec      0A (10) '1.0'\n+C86B9 Extract OS            00 (0) 'MS-DOS'\n+C86BA General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C80AF Compression Method    0000 (0) 'Stored'\n-C80B1 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C80B5 CRC                   00000000 (0)\n-C80B9 Compressed Size       00000000 (0)\n-C80BD Uncompressed Size     00000000 (0)\n-C80C1 Filename Length       005D (93)\n-C80C3 Extra Length          0000 (0)\n-C80C5 Comment Length        0000 (0)\n-C80C7 Disk Start            0000 (0)\n-C80C9 Int File Attributes   0000 (0)\n+C86BC Compression Method    0000 (0) 'Stored'\n+C86BE Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C86C2 CRC                   00000000 (0)\n+C86C6 Compressed Size       00000000 (0)\n+C86CA Uncompressed Size     00000000 (0)\n+C86CE Filename Length       005D (93)\n+C86D0 Extra Length          0000 (0)\n+C86D2 Comment Length        0000 (0)\n+C86D4 Disk Start            0000 (0)\n+C86D6 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C80CB Ext File Attributes   41ED0010 (1106051088)\n+C86D8 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C80CF Local Header Offset   000029DF (10719)\n-C80D3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C86DC Local Header Offset   000029DF (10719)\n+C86E0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC80D3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC86E0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC80D3: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC86E0: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC80AB: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC86B8: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C8130 CENTRAL HEADER #98    02014B50 (33639248)\n-C8134 Created Zip Spec      14 (20) '2.0'\n-C8135 Created OS            03 (3) 'Unix'\n-C8136 Extract Zip Spec      0A (10) '1.0'\n-C8137 Extract OS            00 (0) 'MS-DOS'\n-C8138 General Purpose Flag  0800 (2048)\n+C873D CENTRAL HEADER #98    02014B50 (33639248)\n+C8741 Created Zip Spec      14 (20) '2.0'\n+C8742 Created OS            03 (3) 'Unix'\n+C8743 Extract Zip Spec      0A (10) '1.0'\n+C8744 Extract OS            00 (0) 'MS-DOS'\n+C8745 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C813A Compression Method    0000 (0) 'Stored'\n-C813C Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C8140 CRC                   00000000 (0)\n-C8144 Compressed Size       00000000 (0)\n-C8148 Uncompressed Size     00000000 (0)\n-C814C Filename Length       002D (45)\n-C814E Extra Length          0000 (0)\n-C8150 Comment Length        0000 (0)\n-C8152 Disk Start            0000 (0)\n-C8154 Int File Attributes   0000 (0)\n+C8747 Compression Method    0000 (0) 'Stored'\n+C8749 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C874D CRC                   00000000 (0)\n+C8751 Compressed Size       00000000 (0)\n+C8755 Uncompressed Size     00000000 (0)\n+C8759 Filename Length       002D (45)\n+C875B Extra Length          0000 (0)\n+C875D Comment Length        0000 (0)\n+C875F Disk Start            0000 (0)\n+C8761 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C8156 Ext File Attributes   41ED0010 (1106051088)\n+C8763 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C815A Local Header Offset   00002A5A (10842)\n-C815E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C8767 Local Header Offset   00002A5A (10842)\n+C876B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC815E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC876B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC815E: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC876B: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC8136: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC8743: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C818B CENTRAL HEADER #99    02014B50 (33639248)\n-C818F Created Zip Spec      14 (20) '2.0'\n-C8190 Created OS            03 (3) 'Unix'\n-C8191 Extract Zip Spec      0A (10) '1.0'\n-C8192 Extract OS            00 (0) 'MS-DOS'\n-C8193 General Purpose Flag  0800 (2048)\n+C8798 CENTRAL HEADER #99    02014B50 (33639248)\n+C879C Created Zip Spec      14 (20) '2.0'\n+C879D Created OS            03 (3) 'Unix'\n+C879E Extract Zip Spec      0A (10) '1.0'\n+C879F Extract OS            00 (0) 'MS-DOS'\n+C87A0 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C8195 Compression Method    0000 (0) 'Stored'\n-C8197 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C819B CRC                   00000000 (0)\n-C819F Compressed Size       00000000 (0)\n-C81A3 Uncompressed Size     00000000 (0)\n-C81A7 Filename Length       0036 (54)\n-C81A9 Extra Length          0000 (0)\n-C81AB Comment Length        0000 (0)\n-C81AD Disk Start            0000 (0)\n-C81AF Int File Attributes   0000 (0)\n+C87A2 Compression Method    0000 (0) 'Stored'\n+C87A4 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C87A8 CRC                   00000000 (0)\n+C87AC Compressed Size       00000000 (0)\n+C87B0 Uncompressed Size     00000000 (0)\n+C87B4 Filename Length       0036 (54)\n+C87B6 Extra Length          0000 (0)\n+C87B8 Comment Length        0000 (0)\n+C87BA Disk Start            0000 (0)\n+C87BC Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C81B1 Ext File Attributes   41ED0010 (1106051088)\n+C87BE Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C81B5 Local Header Offset   00002AA5 (10917)\n-C81B9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C87C2 Local Header Offset   00002AA5 (10917)\n+C87C6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC81B9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC87C6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC81B9: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC87C6: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC8191: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC879E: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C81EF CENTRAL HEADER #100   02014B50 (33639248)\n-C81F3 Created Zip Spec      14 (20) '2.0'\n-C81F4 Created OS            03 (3) 'Unix'\n-C81F5 Extract Zip Spec      0A (10) '1.0'\n-C81F6 Extract OS            00 (0) 'MS-DOS'\n-C81F7 General Purpose Flag  0800 (2048)\n+C87FC CENTRAL HEADER #100   02014B50 (33639248)\n+C8800 Created Zip Spec      14 (20) '2.0'\n+C8801 Created OS            03 (3) 'Unix'\n+C8802 Extract Zip Spec      0A (10) '1.0'\n+C8803 Extract OS            00 (0) 'MS-DOS'\n+C8804 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C81F9 Compression Method    0000 (0) 'Stored'\n-C81FB Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C81FF CRC                   00000000 (0)\n-C8203 Compressed Size       00000000 (0)\n-C8207 Uncompressed Size     00000000 (0)\n-C820B Filename Length       006A (106)\n-C820D Extra Length          0000 (0)\n-C820F Comment Length        0000 (0)\n-C8211 Disk Start            0000 (0)\n-C8213 Int File Attributes   0000 (0)\n+C8806 Compression Method    0000 (0) 'Stored'\n+C8808 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C880C CRC                   00000000 (0)\n+C8810 Compressed Size       00000000 (0)\n+C8814 Uncompressed Size     00000000 (0)\n+C8818 Filename Length       006A (106)\n+C881A Extra Length          0000 (0)\n+C881C Comment Length        0000 (0)\n+C881E Disk Start            0000 (0)\n+C8820 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C8215 Ext File Attributes   41ED0010 (1106051088)\n+C8822 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C8219 Local Header Offset   00002AF9 (11001)\n-C821D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C8826 Local Header Offset   00002AF9 (11001)\n+C882A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC821D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC882A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC821D: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC882A: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC81F5: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC8802: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C8287 CENTRAL HEADER #101   02014B50 (33639248)\n-C828B Created Zip Spec      14 (20) '2.0'\n-C828C Created OS            03 (3) 'Unix'\n-C828D Extract Zip Spec      0A (10) '1.0'\n-C828E Extract OS            00 (0) 'MS-DOS'\n-C828F General Purpose Flag  0800 (2048)\n+C8894 CENTRAL HEADER #101   02014B50 (33639248)\n+C8898 Created Zip Spec      14 (20) '2.0'\n+C8899 Created OS            03 (3) 'Unix'\n+C889A Extract Zip Spec      0A (10) '1.0'\n+C889B Extract OS            00 (0) 'MS-DOS'\n+C889C General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C8291 Compression Method    0000 (0) 'Stored'\n-C8293 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C8297 CRC                   00000000 (0)\n-C829B Compressed Size       00000000 (0)\n-C829F Uncompressed Size     00000000 (0)\n-C82A3 Filename Length       006E (110)\n-C82A5 Extra Length          0000 (0)\n-C82A7 Comment Length        0000 (0)\n-C82A9 Disk Start            0000 (0)\n-C82AB Int File Attributes   0000 (0)\n+C889E Compression Method    0000 (0) 'Stored'\n+C88A0 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C88A4 CRC                   00000000 (0)\n+C88A8 Compressed Size       00000000 (0)\n+C88AC Uncompressed Size     00000000 (0)\n+C88B0 Filename Length       006E (110)\n+C88B2 Extra Length          0000 (0)\n+C88B4 Comment Length        0000 (0)\n+C88B6 Disk Start            0000 (0)\n+C88B8 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C82AD Ext File Attributes   41ED0010 (1106051088)\n+C88BA Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C82B1 Local Header Offset   00002B81 (11137)\n-C82B5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C88BE Local Header Offset   00002B81 (11137)\n+C88C2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC82B5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC88C2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC82B5: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC88C2: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC828D: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC889A: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C8323 CENTRAL HEADER #102   02014B50 (33639248)\n-C8327 Created Zip Spec      14 (20) '2.0'\n-C8328 Created OS            03 (3) 'Unix'\n-C8329 Extract Zip Spec      0A (10) '1.0'\n-C832A Extract OS            00 (0) 'MS-DOS'\n-C832B General Purpose Flag  0800 (2048)\n+C8930 CENTRAL HEADER #102   02014B50 (33639248)\n+C8934 Created Zip Spec      14 (20) '2.0'\n+C8935 Created OS            03 (3) 'Unix'\n+C8936 Extract Zip Spec      0A (10) '1.0'\n+C8937 Extract OS            00 (0) 'MS-DOS'\n+C8938 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C832D Compression Method    0000 (0) 'Stored'\n-C832F Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C8333 CRC                   00000000 (0)\n-C8337 Compressed Size       00000000 (0)\n-C833B Uncompressed Size     00000000 (0)\n-C833F Filename Length       0060 (96)\n-C8341 Extra Length          0000 (0)\n-C8343 Comment Length        0000 (0)\n-C8345 Disk Start            0000 (0)\n-C8347 Int File Attributes   0000 (0)\n+C893A Compression Method    0000 (0) 'Stored'\n+C893C Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C8940 CRC                   00000000 (0)\n+C8944 Compressed Size       00000000 (0)\n+C8948 Uncompressed Size     00000000 (0)\n+C894C Filename Length       0060 (96)\n+C894E Extra Length          0000 (0)\n+C8950 Comment Length        0000 (0)\n+C8952 Disk Start            0000 (0)\n+C8954 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C8349 Ext File Attributes   41ED0010 (1106051088)\n+C8956 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C834D Local Header Offset   00002C0D (11277)\n-C8351 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C895A Local Header Offset   00002C0D (11277)\n+C895E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC8351: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC895E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC8351: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC895E: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC8329: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC8936: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C83B1 CENTRAL HEADER #103   02014B50 (33639248)\n-C83B5 Created Zip Spec      14 (20) '2.0'\n-C83B6 Created OS            03 (3) 'Unix'\n-C83B7 Extract Zip Spec      0A (10) '1.0'\n-C83B8 Extract OS            00 (0) 'MS-DOS'\n-C83B9 General Purpose Flag  0800 (2048)\n+C89BE CENTRAL HEADER #103   02014B50 (33639248)\n+C89C2 Created Zip Spec      14 (20) '2.0'\n+C89C3 Created OS            03 (3) 'Unix'\n+C89C4 Extract Zip Spec      0A (10) '1.0'\n+C89C5 Extract OS            00 (0) 'MS-DOS'\n+C89C6 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C83BB Compression Method    0000 (0) 'Stored'\n-C83BD Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C83C1 CRC                   00000000 (0)\n-C83C5 Compressed Size       00000000 (0)\n-C83C9 Uncompressed Size     00000000 (0)\n-C83CD Filename Length       0060 (96)\n-C83CF Extra Length          0000 (0)\n-C83D1 Comment Length        0000 (0)\n-C83D3 Disk Start            0000 (0)\n-C83D5 Int File Attributes   0000 (0)\n+C89C8 Compression Method    0000 (0) 'Stored'\n+C89CA Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C89CE CRC                   00000000 (0)\n+C89D2 Compressed Size       00000000 (0)\n+C89D6 Uncompressed Size     00000000 (0)\n+C89DA Filename Length       0060 (96)\n+C89DC Extra Length          0000 (0)\n+C89DE Comment Length        0000 (0)\n+C89E0 Disk Start            0000 (0)\n+C89E2 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C83D7 Ext File Attributes   41ED0010 (1106051088)\n+C89E4 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C83DB Local Header Offset   00002C8B (11403)\n-C83DF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C89E8 Local Header Offset   00002C8B (11403)\n+C89EC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC83DF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC89EC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC83DF: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC89EC: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC83B7: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC89C4: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C843F CENTRAL HEADER #104   02014B50 (33639248)\n-C8443 Created Zip Spec      14 (20) '2.0'\n-C8444 Created OS            03 (3) 'Unix'\n-C8445 Extract Zip Spec      0A (10) '1.0'\n-C8446 Extract OS            00 (0) 'MS-DOS'\n-C8447 General Purpose Flag  0800 (2048)\n+C8A4C CENTRAL HEADER #104   02014B50 (33639248)\n+C8A50 Created Zip Spec      14 (20) '2.0'\n+C8A51 Created OS            03 (3) 'Unix'\n+C8A52 Extract Zip Spec      0A (10) '1.0'\n+C8A53 Extract OS            00 (0) 'MS-DOS'\n+C8A54 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C8449 Compression Method    0000 (0) 'Stored'\n-C844B Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C844F CRC                   00000000 (0)\n-C8453 Compressed Size       00000000 (0)\n-C8457 Uncompressed Size     00000000 (0)\n-C845B Filename Length       0023 (35)\n-C845D Extra Length          0000 (0)\n-C845F Comment Length        0000 (0)\n-C8461 Disk Start            0000 (0)\n-C8463 Int File Attributes   0000 (0)\n+C8A56 Compression Method    0000 (0) 'Stored'\n+C8A58 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C8A5C CRC                   00000000 (0)\n+C8A60 Compressed Size       00000000 (0)\n+C8A64 Uncompressed Size     00000000 (0)\n+C8A68 Filename Length       0023 (35)\n+C8A6A Extra Length          0000 (0)\n+C8A6C Comment Length        0000 (0)\n+C8A6E Disk Start            0000 (0)\n+C8A70 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C8465 Ext File Attributes   41ED0010 (1106051088)\n+C8A72 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C8469 Local Header Offset   00002D09 (11529)\n-C846D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C8A76 Local Header Offset   00002D09 (11529)\n+C8A7A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC846D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC8A7A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC846D: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC8A7A: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC8445: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC8A52: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C8490 CENTRAL HEADER #105   02014B50 (33639248)\n-C8494 Created Zip Spec      14 (20) '2.0'\n-C8495 Created OS            03 (3) 'Unix'\n-C8496 Extract Zip Spec      0A (10) '1.0'\n-C8497 Extract OS            00 (0) 'MS-DOS'\n-C8498 General Purpose Flag  0800 (2048)\n+C8A9D CENTRAL HEADER #105   02014B50 (33639248)\n+C8AA1 Created Zip Spec      14 (20) '2.0'\n+C8AA2 Created OS            03 (3) 'Unix'\n+C8AA3 Extract Zip Spec      0A (10) '1.0'\n+C8AA4 Extract OS            00 (0) 'MS-DOS'\n+C8AA5 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C849A Compression Method    0000 (0) 'Stored'\n-C849C Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C84A0 CRC                   00000000 (0)\n-C84A4 Compressed Size       00000000 (0)\n-C84A8 Uncompressed Size     00000000 (0)\n-C84AC Filename Length       002C (44)\n-C84AE Extra Length          0000 (0)\n-C84B0 Comment Length        0000 (0)\n-C84B2 Disk Start            0000 (0)\n-C84B4 Int File Attributes   0000 (0)\n+C8AA7 Compression Method    0000 (0) 'Stored'\n+C8AA9 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C8AAD CRC                   00000000 (0)\n+C8AB1 Compressed Size       00000000 (0)\n+C8AB5 Uncompressed Size     00000000 (0)\n+C8AB9 Filename Length       002C (44)\n+C8ABB Extra Length          0000 (0)\n+C8ABD Comment Length        0000 (0)\n+C8ABF Disk Start            0000 (0)\n+C8AC1 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C84B6 Ext File Attributes   41ED0010 (1106051088)\n+C8AC3 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C84BA Local Header Offset   00002D4A (11594)\n-C84BE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C8AC7 Local Header Offset   00002D4A (11594)\n+C8ACB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC84BE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC8ACB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC84BE: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC8ACB: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC8496: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC8AA3: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C84EA CENTRAL HEADER #106   02014B50 (33639248)\n-C84EE Created Zip Spec      14 (20) '2.0'\n-C84EF Created OS            03 (3) 'Unix'\n-C84F0 Extract Zip Spec      0A (10) '1.0'\n-C84F1 Extract OS            00 (0) 'MS-DOS'\n-C84F2 General Purpose Flag  0800 (2048)\n+C8AF7 CENTRAL HEADER #106   02014B50 (33639248)\n+C8AFB Created Zip Spec      14 (20) '2.0'\n+C8AFC Created OS            03 (3) 'Unix'\n+C8AFD Extract Zip Spec      0A (10) '1.0'\n+C8AFE Extract OS            00 (0) 'MS-DOS'\n+C8AFF General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C84F4 Compression Method    0000 (0) 'Stored'\n-C84F6 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C84FA CRC                   00000000 (0)\n-C84FE Compressed Size       00000000 (0)\n-C8502 Uncompressed Size     00000000 (0)\n-C8506 Filename Length       005E (94)\n-C8508 Extra Length          0000 (0)\n-C850A Comment Length        0000 (0)\n-C850C Disk Start            0000 (0)\n-C850E Int File Attributes   0000 (0)\n+C8B01 Compression Method    0000 (0) 'Stored'\n+C8B03 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C8B07 CRC                   00000000 (0)\n+C8B0B Compressed Size       00000000 (0)\n+C8B0F Uncompressed Size     00000000 (0)\n+C8B13 Filename Length       005E (94)\n+C8B15 Extra Length          0000 (0)\n+C8B17 Comment Length        0000 (0)\n+C8B19 Disk Start            0000 (0)\n+C8B1B Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C8510 Ext File Attributes   41ED0010 (1106051088)\n+C8B1D Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C8514 Local Header Offset   00002D94 (11668)\n-C8518 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C8B21 Local Header Offset   00002D94 (11668)\n+C8B25 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC8518: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC8B25: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC8518: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC8B25: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC84F0: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC8AFD: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C8576 CENTRAL HEADER #107   02014B50 (33639248)\n-C857A Created Zip Spec      14 (20) '2.0'\n-C857B Created OS            03 (3) 'Unix'\n-C857C Extract Zip Spec      0A (10) '1.0'\n-C857D Extract OS            00 (0) 'MS-DOS'\n-C857E General Purpose Flag  0800 (2048)\n+C8B83 CENTRAL HEADER #107   02014B50 (33639248)\n+C8B87 Created Zip Spec      14 (20) '2.0'\n+C8B88 Created OS            03 (3) 'Unix'\n+C8B89 Extract Zip Spec      0A (10) '1.0'\n+C8B8A Extract OS            00 (0) 'MS-DOS'\n+C8B8B General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C8580 Compression Method    0000 (0) 'Stored'\n-C8582 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C8586 CRC                   00000000 (0)\n-C858A Compressed Size       00000000 (0)\n-C858E Uncompressed Size     00000000 (0)\n-C8592 Filename Length       0028 (40)\n-C8594 Extra Length          0000 (0)\n-C8596 Comment Length        0000 (0)\n-C8598 Disk Start            0000 (0)\n-C859A Int File Attributes   0000 (0)\n+C8B8D Compression Method    0000 (0) 'Stored'\n+C8B8F Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C8B93 CRC                   00000000 (0)\n+C8B97 Compressed Size       00000000 (0)\n+C8B9B Uncompressed Size     00000000 (0)\n+C8B9F Filename Length       0028 (40)\n+C8BA1 Extra Length          0000 (0)\n+C8BA3 Comment Length        0000 (0)\n+C8BA5 Disk Start            0000 (0)\n+C8BA7 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C859C Ext File Attributes   41ED0010 (1106051088)\n+C8BA9 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C85A0 Local Header Offset   00002E10 (11792)\n-C85A4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C8BAD Local Header Offset   00002E10 (11792)\n+C8BB1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC85A4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC8BB1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC85A4: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC8BB1: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC857C: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC8B89: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C85CC CENTRAL HEADER #108   02014B50 (33639248)\n-C85D0 Created Zip Spec      14 (20) '2.0'\n-C85D1 Created OS            03 (3) 'Unix'\n-C85D2 Extract Zip Spec      0A (10) '1.0'\n-C85D3 Extract OS            00 (0) 'MS-DOS'\n-C85D4 General Purpose Flag  0800 (2048)\n+C8BD9 CENTRAL HEADER #108   02014B50 (33639248)\n+C8BDD Created Zip Spec      14 (20) '2.0'\n+C8BDE Created OS            03 (3) 'Unix'\n+C8BDF Extract Zip Spec      0A (10) '1.0'\n+C8BE0 Extract OS            00 (0) 'MS-DOS'\n+C8BE1 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C85D6 Compression Method    0000 (0) 'Stored'\n-C85D8 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C85DC CRC                   00000000 (0)\n-C85E0 Compressed Size       00000000 (0)\n-C85E4 Uncompressed Size     00000000 (0)\n-C85E8 Filename Length       0031 (49)\n-C85EA Extra Length          0000 (0)\n-C85EC Comment Length        0000 (0)\n-C85EE Disk Start            0000 (0)\n-C85F0 Int File Attributes   0000 (0)\n+C8BE3 Compression Method    0000 (0) 'Stored'\n+C8BE5 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C8BE9 CRC                   00000000 (0)\n+C8BED Compressed Size       00000000 (0)\n+C8BF1 Uncompressed Size     00000000 (0)\n+C8BF5 Filename Length       0031 (49)\n+C8BF7 Extra Length          0000 (0)\n+C8BF9 Comment Length        0000 (0)\n+C8BFB Disk Start            0000 (0)\n+C8BFD Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C85F2 Ext File Attributes   41ED0010 (1106051088)\n+C8BFF Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C85F6 Local Header Offset   00002E56 (11862)\n-C85FA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C8C03 Local Header Offset   00002E56 (11862)\n+C8C07 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC85FA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC8C07: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC85FA: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC8C07: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC85D2: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC8BDF: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C862B CENTRAL HEADER #109   02014B50 (33639248)\n-C862F Created Zip Spec      14 (20) '2.0'\n-C8630 Created OS            03 (3) 'Unix'\n-C8631 Extract Zip Spec      0A (10) '1.0'\n-C8632 Extract OS            00 (0) 'MS-DOS'\n-C8633 General Purpose Flag  0800 (2048)\n+C8C38 CENTRAL HEADER #109   02014B50 (33639248)\n+C8C3C Created Zip Spec      14 (20) '2.0'\n+C8C3D Created OS            03 (3) 'Unix'\n+C8C3E Extract Zip Spec      0A (10) '1.0'\n+C8C3F Extract OS            00 (0) 'MS-DOS'\n+C8C40 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C8635 Compression Method    0000 (0) 'Stored'\n-C8637 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C863B CRC                   00000000 (0)\n-C863F Compressed Size       00000000 (0)\n-C8643 Uncompressed Size     00000000 (0)\n-C8647 Filename Length       0070 (112)\n-C8649 Extra Length          0000 (0)\n-C864B Comment Length        0000 (0)\n-C864D Disk Start            0000 (0)\n-C864F Int File Attributes   0000 (0)\n+C8C42 Compression Method    0000 (0) 'Stored'\n+C8C44 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C8C48 CRC                   00000000 (0)\n+C8C4C Compressed Size       00000000 (0)\n+C8C50 Uncompressed Size     00000000 (0)\n+C8C54 Filename Length       0070 (112)\n+C8C56 Extra Length          0000 (0)\n+C8C58 Comment Length        0000 (0)\n+C8C5A Disk Start            0000 (0)\n+C8C5C Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C8651 Ext File Attributes   41ED0010 (1106051088)\n+C8C5E Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C8655 Local Header Offset   00002EA5 (11941)\n-C8659 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C8C62 Local Header Offset   00002EA5 (11941)\n+C8C66 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC8659: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC8C66: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC8659: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC8C66: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC8631: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC8C3E: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C86C9 CENTRAL HEADER #110   02014B50 (33639248)\n-C86CD Created Zip Spec      14 (20) '2.0'\n-C86CE Created OS            03 (3) 'Unix'\n-C86CF Extract Zip Spec      0A (10) '1.0'\n-C86D0 Extract OS            00 (0) 'MS-DOS'\n-C86D1 General Purpose Flag  0800 (2048)\n+C8CD6 CENTRAL HEADER #110   02014B50 (33639248)\n+C8CDA Created Zip Spec      14 (20) '2.0'\n+C8CDB Created OS            03 (3) 'Unix'\n+C8CDC Extract Zip Spec      0A (10) '1.0'\n+C8CDD Extract OS            00 (0) 'MS-DOS'\n+C8CDE General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C86D3 Compression Method    0000 (0) 'Stored'\n-C86D5 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C86D9 CRC                   00000000 (0)\n-C86DD Compressed Size       00000000 (0)\n-C86E1 Uncompressed Size     00000000 (0)\n-C86E5 Filename Length       006A (106)\n-C86E7 Extra Length          0000 (0)\n-C86E9 Comment Length        0000 (0)\n-C86EB Disk Start            0000 (0)\n-C86ED Int File Attributes   0000 (0)\n+C8CE0 Compression Method    0000 (0) 'Stored'\n+C8CE2 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C8CE6 CRC                   00000000 (0)\n+C8CEA Compressed Size       00000000 (0)\n+C8CEE Uncompressed Size     00000000 (0)\n+C8CF2 Filename Length       006A (106)\n+C8CF4 Extra Length          0000 (0)\n+C8CF6 Comment Length        0000 (0)\n+C8CF8 Disk Start            0000 (0)\n+C8CFA Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C86EF Ext File Attributes   41ED0010 (1106051088)\n+C8CFC Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C86F3 Local Header Offset   00002F33 (12083)\n-C86F7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C8D00 Local Header Offset   00002F33 (12083)\n+C8D04 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC86F7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC8D04: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC86F7: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC8D04: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC86CF: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC8CDC: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C8761 CENTRAL HEADER #111   02014B50 (33639248)\n-C8765 Created Zip Spec      14 (20) '2.0'\n-C8766 Created OS            03 (3) 'Unix'\n-C8767 Extract Zip Spec      0A (10) '1.0'\n-C8768 Extract OS            00 (0) 'MS-DOS'\n-C8769 General Purpose Flag  0800 (2048)\n+C8D6E CENTRAL HEADER #111   02014B50 (33639248)\n+C8D72 Created Zip Spec      14 (20) '2.0'\n+C8D73 Created OS            03 (3) 'Unix'\n+C8D74 Extract Zip Spec      0A (10) '1.0'\n+C8D75 Extract OS            00 (0) 'MS-DOS'\n+C8D76 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C876B Compression Method    0000 (0) 'Stored'\n-C876D Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C8771 CRC                   00000000 (0)\n-C8775 Compressed Size       00000000 (0)\n-C8779 Uncompressed Size     00000000 (0)\n-C877D Filename Length       0070 (112)\n-C877F Extra Length          0000 (0)\n-C8781 Comment Length        0000 (0)\n-C8783 Disk Start            0000 (0)\n-C8785 Int File Attributes   0000 (0)\n+C8D78 Compression Method    0000 (0) 'Stored'\n+C8D7A Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C8D7E CRC                   00000000 (0)\n+C8D82 Compressed Size       00000000 (0)\n+C8D86 Uncompressed Size     00000000 (0)\n+C8D8A Filename Length       0070 (112)\n+C8D8C Extra Length          0000 (0)\n+C8D8E Comment Length        0000 (0)\n+C8D90 Disk Start            0000 (0)\n+C8D92 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C8787 Ext File Attributes   41ED0010 (1106051088)\n+C8D94 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C878B Local Header Offset   00002FBB (12219)\n-C878F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C8D98 Local Header Offset   00002FBB (12219)\n+C8D9C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC878F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC8D9C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC878F: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC8D9C: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC8767: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC8D74: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C87FF CENTRAL HEADER #112   02014B50 (33639248)\n-C8803 Created Zip Spec      14 (20) '2.0'\n-C8804 Created OS            03 (3) 'Unix'\n-C8805 Extract Zip Spec      0A (10) '1.0'\n-C8806 Extract OS            00 (0) 'MS-DOS'\n-C8807 General Purpose Flag  0800 (2048)\n+C8E0C CENTRAL HEADER #112   02014B50 (33639248)\n+C8E10 Created Zip Spec      14 (20) '2.0'\n+C8E11 Created OS            03 (3) 'Unix'\n+C8E12 Extract Zip Spec      0A (10) '1.0'\n+C8E13 Extract OS            00 (0) 'MS-DOS'\n+C8E14 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C8809 Compression Method    0000 (0) 'Stored'\n-C880B Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C880F CRC                   00000000 (0)\n-C8813 Compressed Size       00000000 (0)\n-C8817 Uncompressed Size     00000000 (0)\n-C881B Filename Length       006A (106)\n-C881D Extra Length          0000 (0)\n-C881F Comment Length        0000 (0)\n-C8821 Disk Start            0000 (0)\n-C8823 Int File Attributes   0000 (0)\n+C8E16 Compression Method    0000 (0) 'Stored'\n+C8E18 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C8E1C CRC                   00000000 (0)\n+C8E20 Compressed Size       00000000 (0)\n+C8E24 Uncompressed Size     00000000 (0)\n+C8E28 Filename Length       006A (106)\n+C8E2A Extra Length          0000 (0)\n+C8E2C Comment Length        0000 (0)\n+C8E2E Disk Start            0000 (0)\n+C8E30 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C8825 Ext File Attributes   41ED0010 (1106051088)\n+C8E32 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C8829 Local Header Offset   00003049 (12361)\n-C882D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C8E36 Local Header Offset   00003049 (12361)\n+C8E3A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC882D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC8E3A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC882D: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC8E3A: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC8805: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC8E12: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C8897 CENTRAL HEADER #113   02014B50 (33639248)\n-C889B Created Zip Spec      14 (20) '2.0'\n-C889C Created OS            03 (3) 'Unix'\n-C889D Extract Zip Spec      0A (10) '1.0'\n-C889E Extract OS            00 (0) 'MS-DOS'\n-C889F General Purpose Flag  0800 (2048)\n+C8EA4 CENTRAL HEADER #113   02014B50 (33639248)\n+C8EA8 Created Zip Spec      14 (20) '2.0'\n+C8EA9 Created OS            03 (3) 'Unix'\n+C8EAA Extract Zip Spec      0A (10) '1.0'\n+C8EAB Extract OS            00 (0) 'MS-DOS'\n+C8EAC General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C88A1 Compression Method    0000 (0) 'Stored'\n-C88A3 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C88A7 CRC                   00000000 (0)\n-C88AB Compressed Size       00000000 (0)\n-C88AF Uncompressed Size     00000000 (0)\n-C88B3 Filename Length       002E (46)\n-C88B5 Extra Length          0000 (0)\n-C88B7 Comment Length        0000 (0)\n-C88B9 Disk Start            0000 (0)\n-C88BB Int File Attributes   0000 (0)\n+C8EAE Compression Method    0000 (0) 'Stored'\n+C8EB0 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C8EB4 CRC                   00000000 (0)\n+C8EB8 Compressed Size       00000000 (0)\n+C8EBC Uncompressed Size     00000000 (0)\n+C8EC0 Filename Length       002E (46)\n+C8EC2 Extra Length          0000 (0)\n+C8EC4 Comment Length        0000 (0)\n+C8EC6 Disk Start            0000 (0)\n+C8EC8 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C88BD Ext File Attributes   41ED0010 (1106051088)\n+C8ECA Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C88C1 Local Header Offset   000030D1 (12497)\n-C88C5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C8ECE Local Header Offset   000030D1 (12497)\n+C8ED2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC88C5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC8ED2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC88C5: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC8ED2: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC889D: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC8EAA: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C88F3 CENTRAL HEADER #114   02014B50 (33639248)\n-C88F7 Created Zip Spec      14 (20) '2.0'\n-C88F8 Created OS            03 (3) 'Unix'\n-C88F9 Extract Zip Spec      0A (10) '1.0'\n-C88FA Extract OS            00 (0) 'MS-DOS'\n-C88FB General Purpose Flag  0800 (2048)\n+C8F00 CENTRAL HEADER #114   02014B50 (33639248)\n+C8F04 Created Zip Spec      14 (20) '2.0'\n+C8F05 Created OS            03 (3) 'Unix'\n+C8F06 Extract Zip Spec      0A (10) '1.0'\n+C8F07 Extract OS            00 (0) 'MS-DOS'\n+C8F08 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C88FD Compression Method    0000 (0) 'Stored'\n-C88FF Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C8903 CRC                   00000000 (0)\n-C8907 Compressed Size       00000000 (0)\n-C890B Uncompressed Size     00000000 (0)\n-C890F Filename Length       0037 (55)\n-C8911 Extra Length          0000 (0)\n-C8913 Comment Length        0000 (0)\n-C8915 Disk Start            0000 (0)\n-C8917 Int File Attributes   0000 (0)\n+C8F0A Compression Method    0000 (0) 'Stored'\n+C8F0C Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C8F10 CRC                   00000000 (0)\n+C8F14 Compressed Size       00000000 (0)\n+C8F18 Uncompressed Size     00000000 (0)\n+C8F1C Filename Length       0037 (55)\n+C8F1E Extra Length          0000 (0)\n+C8F20 Comment Length        0000 (0)\n+C8F22 Disk Start            0000 (0)\n+C8F24 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C8919 Ext File Attributes   41ED0010 (1106051088)\n+C8F26 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C891D Local Header Offset   0000311D (12573)\n-C8921 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C8F2A Local Header Offset   0000311D (12573)\n+C8F2E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC8921: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC8F2E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC8921: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC8F2E: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC88F9: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC8F06: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C8958 CENTRAL HEADER #115   02014B50 (33639248)\n-C895C Created Zip Spec      14 (20) '2.0'\n-C895D Created OS            03 (3) 'Unix'\n-C895E Extract Zip Spec      0A (10) '1.0'\n-C895F Extract OS            00 (0) 'MS-DOS'\n-C8960 General Purpose Flag  0800 (2048)\n+C8F65 CENTRAL HEADER #115   02014B50 (33639248)\n+C8F69 Created Zip Spec      14 (20) '2.0'\n+C8F6A Created OS            03 (3) 'Unix'\n+C8F6B Extract Zip Spec      0A (10) '1.0'\n+C8F6C Extract OS            00 (0) 'MS-DOS'\n+C8F6D General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C8962 Compression Method    0000 (0) 'Stored'\n-C8964 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C8968 CRC                   00000000 (0)\n-C896C Compressed Size       00000000 (0)\n-C8970 Uncompressed Size     00000000 (0)\n-C8974 Filename Length       0060 (96)\n-C8976 Extra Length          0000 (0)\n-C8978 Comment Length        0000 (0)\n-C897A Disk Start            0000 (0)\n-C897C Int File Attributes   0000 (0)\n+C8F6F Compression Method    0000 (0) 'Stored'\n+C8F71 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C8F75 CRC                   00000000 (0)\n+C8F79 Compressed Size       00000000 (0)\n+C8F7D Uncompressed Size     00000000 (0)\n+C8F81 Filename Length       0060 (96)\n+C8F83 Extra Length          0000 (0)\n+C8F85 Comment Length        0000 (0)\n+C8F87 Disk Start            0000 (0)\n+C8F89 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C897E Ext File Attributes   41ED0010 (1106051088)\n+C8F8B Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C8982 Local Header Offset   00003172 (12658)\n-C8986 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C8F8F Local Header Offset   00003172 (12658)\n+C8F93 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC8986: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC8F93: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC8986: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC8F93: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC895E: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC8F6B: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C89E6 CENTRAL HEADER #116   02014B50 (33639248)\n-C89EA Created Zip Spec      14 (20) '2.0'\n-C89EB Created OS            03 (3) 'Unix'\n-C89EC Extract Zip Spec      0A (10) '1.0'\n-C89ED Extract OS            00 (0) 'MS-DOS'\n-C89EE General Purpose Flag  0800 (2048)\n+C8FF3 CENTRAL HEADER #116   02014B50 (33639248)\n+C8FF7 Created Zip Spec      14 (20) '2.0'\n+C8FF8 Created OS            03 (3) 'Unix'\n+C8FF9 Extract Zip Spec      0A (10) '1.0'\n+C8FFA Extract OS            00 (0) 'MS-DOS'\n+C8FFB General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C89F0 Compression Method    0000 (0) 'Stored'\n-C89F2 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C89F6 CRC                   00000000 (0)\n-C89FA Compressed Size       00000000 (0)\n-C89FE Uncompressed Size     00000000 (0)\n-C8A02 Filename Length       0066 (102)\n-C8A04 Extra Length          0000 (0)\n-C8A06 Comment Length        0000 (0)\n-C8A08 Disk Start            0000 (0)\n-C8A0A Int File Attributes   0000 (0)\n+C8FFD Compression Method    0000 (0) 'Stored'\n+C8FFF Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C9003 CRC                   00000000 (0)\n+C9007 Compressed Size       00000000 (0)\n+C900B Uncompressed Size     00000000 (0)\n+C900F Filename Length       0066 (102)\n+C9011 Extra Length          0000 (0)\n+C9013 Comment Length        0000 (0)\n+C9015 Disk Start            0000 (0)\n+C9017 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C8A0C Ext File Attributes   41ED0010 (1106051088)\n+C9019 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C8A10 Local Header Offset   000031F0 (12784)\n-C8A14 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C901D Local Header Offset   000031F0 (12784)\n+C9021 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC8A14: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC9021: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC8A14: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC9021: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC89EC: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC8FF9: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C8A7A CENTRAL HEADER #117   02014B50 (33639248)\n-C8A7E Created Zip Spec      14 (20) '2.0'\n-C8A7F Created OS            03 (3) 'Unix'\n-C8A80 Extract Zip Spec      0A (10) '1.0'\n-C8A81 Extract OS            00 (0) 'MS-DOS'\n-C8A82 General Purpose Flag  0800 (2048)\n+C9087 CENTRAL HEADER #117   02014B50 (33639248)\n+C908B Created Zip Spec      14 (20) '2.0'\n+C908C Created OS            03 (3) 'Unix'\n+C908D Extract Zip Spec      0A (10) '1.0'\n+C908E Extract OS            00 (0) 'MS-DOS'\n+C908F General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C8A84 Compression Method    0000 (0) 'Stored'\n-C8A86 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C8A8A CRC                   00000000 (0)\n-C8A8E Compressed Size       00000000 (0)\n-C8A92 Uncompressed Size     00000000 (0)\n-C8A96 Filename Length       0026 (38)\n-C8A98 Extra Length          0000 (0)\n-C8A9A Comment Length        0000 (0)\n-C8A9C Disk Start            0000 (0)\n-C8A9E Int File Attributes   0000 (0)\n+C9091 Compression Method    0000 (0) 'Stored'\n+C9093 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C9097 CRC                   00000000 (0)\n+C909B Compressed Size       00000000 (0)\n+C909F Uncompressed Size     00000000 (0)\n+C90A3 Filename Length       0026 (38)\n+C90A5 Extra Length          0000 (0)\n+C90A7 Comment Length        0000 (0)\n+C90A9 Disk Start            0000 (0)\n+C90AB Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C8AA0 Ext File Attributes   41ED0010 (1106051088)\n+C90AD Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C8AA4 Local Header Offset   00003274 (12916)\n-C8AA8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C90B1 Local Header Offset   00003274 (12916)\n+C90B5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC8AA8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC90B5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC8AA8: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC90B5: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC8A80: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC908D: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C8ACE CENTRAL HEADER #118   02014B50 (33639248)\n-C8AD2 Created Zip Spec      14 (20) '2.0'\n-C8AD3 Created OS            03 (3) 'Unix'\n-C8AD4 Extract Zip Spec      0A (10) '1.0'\n-C8AD5 Extract OS            00 (0) 'MS-DOS'\n-C8AD6 General Purpose Flag  0800 (2048)\n+C90DB CENTRAL HEADER #118   02014B50 (33639248)\n+C90DF Created Zip Spec      14 (20) '2.0'\n+C90E0 Created OS            03 (3) 'Unix'\n+C90E1 Extract Zip Spec      0A (10) '1.0'\n+C90E2 Extract OS            00 (0) 'MS-DOS'\n+C90E3 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C8AD8 Compression Method    0000 (0) 'Stored'\n-C8ADA Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C8ADE CRC                   00000000 (0)\n-C8AE2 Compressed Size       00000000 (0)\n-C8AE6 Uncompressed Size     00000000 (0)\n-C8AEA Filename Length       002F (47)\n-C8AEC Extra Length          0000 (0)\n-C8AEE Comment Length        0000 (0)\n-C8AF0 Disk Start            0000 (0)\n-C8AF2 Int File Attributes   0000 (0)\n+C90E5 Compression Method    0000 (0) 'Stored'\n+C90E7 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C90EB CRC                   00000000 (0)\n+C90EF Compressed Size       00000000 (0)\n+C90F3 Uncompressed Size     00000000 (0)\n+C90F7 Filename Length       002F (47)\n+C90F9 Extra Length          0000 (0)\n+C90FB Comment Length        0000 (0)\n+C90FD Disk Start            0000 (0)\n+C90FF Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C8AF4 Ext File Attributes   41ED0010 (1106051088)\n+C9101 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C8AF8 Local Header Offset   000032B8 (12984)\n-C8AFC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C9105 Local Header Offset   000032B8 (12984)\n+C9109 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC8AFC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC9109: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC8AFC: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC9109: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC8AD4: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC90E1: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C8B2B CENTRAL HEADER #119   02014B50 (33639248)\n-C8B2F Created Zip Spec      14 (20) '2.0'\n-C8B30 Created OS            03 (3) 'Unix'\n-C8B31 Extract Zip Spec      0A (10) '1.0'\n-C8B32 Extract OS            00 (0) 'MS-DOS'\n-C8B33 General Purpose Flag  0800 (2048)\n+C9138 CENTRAL HEADER #119   02014B50 (33639248)\n+C913C Created Zip Spec      14 (20) '2.0'\n+C913D Created OS            03 (3) 'Unix'\n+C913E Extract Zip Spec      0A (10) '1.0'\n+C913F Extract OS            00 (0) 'MS-DOS'\n+C9140 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C8B35 Compression Method    0000 (0) 'Stored'\n-C8B37 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C8B3B CRC                   00000000 (0)\n-C8B3F Compressed Size       00000000 (0)\n-C8B43 Uncompressed Size     00000000 (0)\n-C8B47 Filename Length       005E (94)\n-C8B49 Extra Length          0000 (0)\n-C8B4B Comment Length        0000 (0)\n-C8B4D Disk Start            0000 (0)\n-C8B4F Int File Attributes   0000 (0)\n+C9142 Compression Method    0000 (0) 'Stored'\n+C9144 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C9148 CRC                   00000000 (0)\n+C914C Compressed Size       00000000 (0)\n+C9150 Uncompressed Size     00000000 (0)\n+C9154 Filename Length       005E (94)\n+C9156 Extra Length          0000 (0)\n+C9158 Comment Length        0000 (0)\n+C915A Disk Start            0000 (0)\n+C915C Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C8B51 Ext File Attributes   41ED0010 (1106051088)\n+C915E Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C8B55 Local Header Offset   00003305 (13061)\n-C8B59 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C9162 Local Header Offset   00003305 (13061)\n+C9166 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC8B59: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC9166: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC8B59: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC9166: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC8B31: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC913E: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C8BB7 CENTRAL HEADER #120   02014B50 (33639248)\n-C8BBB Created Zip Spec      14 (20) '2.0'\n-C8BBC Created OS            03 (3) 'Unix'\n-C8BBD Extract Zip Spec      0A (10) '1.0'\n-C8BBE Extract OS            00 (0) 'MS-DOS'\n-C8BBF General Purpose Flag  0800 (2048)\n+C91C4 CENTRAL HEADER #120   02014B50 (33639248)\n+C91C8 Created Zip Spec      14 (20) '2.0'\n+C91C9 Created OS            03 (3) 'Unix'\n+C91CA Extract Zip Spec      0A (10) '1.0'\n+C91CB Extract OS            00 (0) 'MS-DOS'\n+C91CC General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C8BC1 Compression Method    0000 (0) 'Stored'\n-C8BC3 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C8BC7 CRC                   00000000 (0)\n-C8BCB Compressed Size       00000000 (0)\n-C8BCF Uncompressed Size     00000000 (0)\n-C8BD3 Filename Length       005B (91)\n-C8BD5 Extra Length          0000 (0)\n-C8BD7 Comment Length        0000 (0)\n-C8BD9 Disk Start            0000 (0)\n-C8BDB Int File Attributes   0000 (0)\n+C91CE Compression Method    0000 (0) 'Stored'\n+C91D0 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C91D4 CRC                   00000000 (0)\n+C91D8 Compressed Size       00000000 (0)\n+C91DC Uncompressed Size     00000000 (0)\n+C91E0 Filename Length       005B (91)\n+C91E2 Extra Length          0000 (0)\n+C91E4 Comment Length        0000 (0)\n+C91E6 Disk Start            0000 (0)\n+C91E8 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C8BDD Ext File Attributes   41ED0010 (1106051088)\n+C91EA Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C8BE1 Local Header Offset   00003381 (13185)\n-C8BE5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C91EE Local Header Offset   00003381 (13185)\n+C91F2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC8BE5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC91F2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC8BE5: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC91F2: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC8BBD: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC91CA: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C8C40 CENTRAL HEADER #121   02014B50 (33639248)\n-C8C44 Created Zip Spec      14 (20) '2.0'\n-C8C45 Created OS            03 (3) 'Unix'\n-C8C46 Extract Zip Spec      0A (10) '1.0'\n-C8C47 Extract OS            00 (0) 'MS-DOS'\n-C8C48 General Purpose Flag  0800 (2048)\n+C924D CENTRAL HEADER #121   02014B50 (33639248)\n+C9251 Created Zip Spec      14 (20) '2.0'\n+C9252 Created OS            03 (3) 'Unix'\n+C9253 Extract Zip Spec      0A (10) '1.0'\n+C9254 Extract OS            00 (0) 'MS-DOS'\n+C9255 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C8C4A Compression Method    0000 (0) 'Stored'\n-C8C4C Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C8C50 CRC                   00000000 (0)\n-C8C54 Compressed Size       00000000 (0)\n-C8C58 Uncompressed Size     00000000 (0)\n-C8C5C Filename Length       0061 (97)\n-C8C5E Extra Length          0000 (0)\n-C8C60 Comment Length        0000 (0)\n-C8C62 Disk Start            0000 (0)\n-C8C64 Int File Attributes   0000 (0)\n+C9257 Compression Method    0000 (0) 'Stored'\n+C9259 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C925D CRC                   00000000 (0)\n+C9261 Compressed Size       00000000 (0)\n+C9265 Uncompressed Size     00000000 (0)\n+C9269 Filename Length       0061 (97)\n+C926B Extra Length          0000 (0)\n+C926D Comment Length        0000 (0)\n+C926F Disk Start            0000 (0)\n+C9271 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C8C66 Ext File Attributes   41ED0010 (1106051088)\n+C9273 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C8C6A Local Header Offset   000033FA (13306)\n-C8C6E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C9277 Local Header Offset   000033FA (13306)\n+C927B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC8C6E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC927B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC8C6E: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC927B: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC8C46: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC9253: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C8CCF CENTRAL HEADER #122   02014B50 (33639248)\n-C8CD3 Created Zip Spec      14 (20) '2.0'\n-C8CD4 Created OS            03 (3) 'Unix'\n-C8CD5 Extract Zip Spec      0A (10) '1.0'\n-C8CD6 Extract OS            00 (0) 'MS-DOS'\n-C8CD7 General Purpose Flag  0800 (2048)\n+C92DC CENTRAL HEADER #122   02014B50 (33639248)\n+C92E0 Created Zip Spec      14 (20) '2.0'\n+C92E1 Created OS            03 (3) 'Unix'\n+C92E2 Extract Zip Spec      0A (10) '1.0'\n+C92E3 Extract OS            00 (0) 'MS-DOS'\n+C92E4 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C8CD9 Compression Method    0000 (0) 'Stored'\n-C8CDB Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C8CDF CRC                   00000000 (0)\n-C8CE3 Compressed Size       00000000 (0)\n-C8CE7 Uncompressed Size     00000000 (0)\n-C8CEB Filename Length       005B (91)\n-C8CED Extra Length          0000 (0)\n-C8CEF Comment Length        0000 (0)\n-C8CF1 Disk Start            0000 (0)\n-C8CF3 Int File Attributes   0000 (0)\n+C92E6 Compression Method    0000 (0) 'Stored'\n+C92E8 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C92EC CRC                   00000000 (0)\n+C92F0 Compressed Size       00000000 (0)\n+C92F4 Uncompressed Size     00000000 (0)\n+C92F8 Filename Length       005B (91)\n+C92FA Extra Length          0000 (0)\n+C92FC Comment Length        0000 (0)\n+C92FE Disk Start            0000 (0)\n+C9300 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C8CF5 Ext File Attributes   41ED0010 (1106051088)\n+C9302 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C8CF9 Local Header Offset   00003479 (13433)\n-C8CFD Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C9306 Local Header Offset   00003479 (13433)\n+C930A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC8CFD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC930A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC8CFD: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC930A: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC8CD5: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC92E2: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C8D58 CENTRAL HEADER #123   02014B50 (33639248)\n-C8D5C Created Zip Spec      14 (20) '2.0'\n-C8D5D Created OS            03 (3) 'Unix'\n-C8D5E Extract Zip Spec      0A (10) '1.0'\n-C8D5F Extract OS            00 (0) 'MS-DOS'\n-C8D60 General Purpose Flag  0800 (2048)\n+C9365 CENTRAL HEADER #123   02014B50 (33639248)\n+C9369 Created Zip Spec      14 (20) '2.0'\n+C936A Created OS            03 (3) 'Unix'\n+C936B Extract Zip Spec      0A (10) '1.0'\n+C936C Extract OS            00 (0) 'MS-DOS'\n+C936D General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C8D62 Compression Method    0000 (0) 'Stored'\n-C8D64 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C8D68 CRC                   00000000 (0)\n-C8D6C Compressed Size       00000000 (0)\n-C8D70 Uncompressed Size     00000000 (0)\n-C8D74 Filename Length       0066 (102)\n-C8D76 Extra Length          0000 (0)\n-C8D78 Comment Length        0000 (0)\n-C8D7A Disk Start            0000 (0)\n-C8D7C Int File Attributes   0000 (0)\n+C936F Compression Method    0000 (0) 'Stored'\n+C9371 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C9375 CRC                   00000000 (0)\n+C9379 Compressed Size       00000000 (0)\n+C937D Uncompressed Size     00000000 (0)\n+C9381 Filename Length       0066 (102)\n+C9383 Extra Length          0000 (0)\n+C9385 Comment Length        0000 (0)\n+C9387 Disk Start            0000 (0)\n+C9389 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C8D7E Ext File Attributes   41ED0010 (1106051088)\n+C938B Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C8D82 Local Header Offset   000034F2 (13554)\n-C8D86 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C938F Local Header Offset   000034F2 (13554)\n+C9393 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC8D86: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC9393: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC8D86: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC9393: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC8D5E: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC936B: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C8DEC CENTRAL HEADER #124   02014B50 (33639248)\n-C8DF0 Created Zip Spec      14 (20) '2.0'\n-C8DF1 Created OS            03 (3) 'Unix'\n-C8DF2 Extract Zip Spec      0A (10) '1.0'\n-C8DF3 Extract OS            00 (0) 'MS-DOS'\n-C8DF4 General Purpose Flag  0800 (2048)\n+C93F9 CENTRAL HEADER #124   02014B50 (33639248)\n+C93FD Created Zip Spec      14 (20) '2.0'\n+C93FE Created OS            03 (3) 'Unix'\n+C93FF Extract Zip Spec      0A (10) '1.0'\n+C9400 Extract OS            00 (0) 'MS-DOS'\n+C9401 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C8DF6 Compression Method    0000 (0) 'Stored'\n-C8DF8 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C8DFC CRC                   00000000 (0)\n-C8E00 Compressed Size       00000000 (0)\n-C8E04 Uncompressed Size     00000000 (0)\n-C8E08 Filename Length       0066 (102)\n-C8E0A Extra Length          0000 (0)\n-C8E0C Comment Length        0000 (0)\n-C8E0E Disk Start            0000 (0)\n-C8E10 Int File Attributes   0000 (0)\n+C9403 Compression Method    0000 (0) 'Stored'\n+C9405 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C9409 CRC                   00000000 (0)\n+C940D Compressed Size       00000000 (0)\n+C9411 Uncompressed Size     00000000 (0)\n+C9415 Filename Length       0066 (102)\n+C9417 Extra Length          0000 (0)\n+C9419 Comment Length        0000 (0)\n+C941B Disk Start            0000 (0)\n+C941D Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C8E12 Ext File Attributes   41ED0010 (1106051088)\n+C941F Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C8E16 Local Header Offset   00003576 (13686)\n-C8E1A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C9423 Local Header Offset   00003576 (13686)\n+C9427 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC8E1A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC9427: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC8E1A: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC9427: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC8DF2: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC93FF: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C8E80 CENTRAL HEADER #125   02014B50 (33639248)\n-C8E84 Created Zip Spec      14 (20) '2.0'\n-C8E85 Created OS            03 (3) 'Unix'\n-C8E86 Extract Zip Spec      0A (10) '1.0'\n-C8E87 Extract OS            00 (0) 'MS-DOS'\n-C8E88 General Purpose Flag  0800 (2048)\n+C948D CENTRAL HEADER #125   02014B50 (33639248)\n+C9491 Created Zip Spec      14 (20) '2.0'\n+C9492 Created OS            03 (3) 'Unix'\n+C9493 Extract Zip Spec      0A (10) '1.0'\n+C9494 Extract OS            00 (0) 'MS-DOS'\n+C9495 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C8E8A Compression Method    0000 (0) 'Stored'\n-C8E8C Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C8E90 CRC                   00000000 (0)\n-C8E94 Compressed Size       00000000 (0)\n-C8E98 Uncompressed Size     00000000 (0)\n-C8E9C Filename Length       0065 (101)\n-C8E9E Extra Length          0000 (0)\n-C8EA0 Comment Length        0000 (0)\n-C8EA2 Disk Start            0000 (0)\n-C8EA4 Int File Attributes   0000 (0)\n+C9497 Compression Method    0000 (0) 'Stored'\n+C9499 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C949D CRC                   00000000 (0)\n+C94A1 Compressed Size       00000000 (0)\n+C94A5 Uncompressed Size     00000000 (0)\n+C94A9 Filename Length       0065 (101)\n+C94AB Extra Length          0000 (0)\n+C94AD Comment Length        0000 (0)\n+C94AF Disk Start            0000 (0)\n+C94B1 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C8EA6 Ext File Attributes   41ED0010 (1106051088)\n+C94B3 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C8EAA Local Header Offset   000035FA (13818)\n-C8EAE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C94B7 Local Header Offset   000035FA (13818)\n+C94BB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC8EAE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC94BB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC8EAE: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC94BB: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC8E86: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC9493: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C8F13 CENTRAL HEADER #126   02014B50 (33639248)\n-C8F17 Created Zip Spec      14 (20) '2.0'\n-C8F18 Created OS            03 (3) 'Unix'\n-C8F19 Extract Zip Spec      0A (10) '1.0'\n-C8F1A Extract OS            00 (0) 'MS-DOS'\n-C8F1B General Purpose Flag  0800 (2048)\n+C9520 CENTRAL HEADER #126   02014B50 (33639248)\n+C9524 Created Zip Spec      14 (20) '2.0'\n+C9525 Created OS            03 (3) 'Unix'\n+C9526 Extract Zip Spec      0A (10) '1.0'\n+C9527 Extract OS            00 (0) 'MS-DOS'\n+C9528 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C8F1D Compression Method    0000 (0) 'Stored'\n-C8F1F Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C8F23 CRC                   00000000 (0)\n-C8F27 Compressed Size       00000000 (0)\n-C8F2B Uncompressed Size     00000000 (0)\n-C8F2F Filename Length       0063 (99)\n-C8F31 Extra Length          0000 (0)\n-C8F33 Comment Length        0000 (0)\n-C8F35 Disk Start            0000 (0)\n-C8F37 Int File Attributes   0000 (0)\n+C952A Compression Method    0000 (0) 'Stored'\n+C952C Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C9530 CRC                   00000000 (0)\n+C9534 Compressed Size       00000000 (0)\n+C9538 Uncompressed Size     00000000 (0)\n+C953C Filename Length       0063 (99)\n+C953E Extra Length          0000 (0)\n+C9540 Comment Length        0000 (0)\n+C9542 Disk Start            0000 (0)\n+C9544 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C8F39 Ext File Attributes   41ED0010 (1106051088)\n+C9546 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C8F3D Local Header Offset   0000367D (13949)\n-C8F41 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C954A Local Header Offset   0000367D (13949)\n+C954E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC8F41: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC954E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC8F41: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC954E: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC8F19: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC9526: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C8FA4 CENTRAL HEADER #127   02014B50 (33639248)\n-C8FA8 Created Zip Spec      14 (20) '2.0'\n-C8FA9 Created OS            03 (3) 'Unix'\n-C8FAA Extract Zip Spec      0A (10) '1.0'\n-C8FAB Extract OS            00 (0) 'MS-DOS'\n-C8FAC General Purpose Flag  0800 (2048)\n+C95B1 CENTRAL HEADER #127   02014B50 (33639248)\n+C95B5 Created Zip Spec      14 (20) '2.0'\n+C95B6 Created OS            03 (3) 'Unix'\n+C95B7 Extract Zip Spec      0A (10) '1.0'\n+C95B8 Extract OS            00 (0) 'MS-DOS'\n+C95B9 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C8FAE Compression Method    0000 (0) 'Stored'\n-C8FB0 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C8FB4 CRC                   00000000 (0)\n-C8FB8 Compressed Size       00000000 (0)\n-C8FBC Uncompressed Size     00000000 (0)\n-C8FC0 Filename Length       0023 (35)\n-C8FC2 Extra Length          0000 (0)\n-C8FC4 Comment Length        0000 (0)\n-C8FC6 Disk Start            0000 (0)\n-C8FC8 Int File Attributes   0000 (0)\n+C95BB Compression Method    0000 (0) 'Stored'\n+C95BD Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C95C1 CRC                   00000000 (0)\n+C95C5 Compressed Size       00000000 (0)\n+C95C9 Uncompressed Size     00000000 (0)\n+C95CD Filename Length       0023 (35)\n+C95CF Extra Length          0000 (0)\n+C95D1 Comment Length        0000 (0)\n+C95D3 Disk Start            0000 (0)\n+C95D5 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C8FCA Ext File Attributes   41ED0010 (1106051088)\n+C95D7 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C8FCE Local Header Offset   000036FE (14078)\n-C8FD2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C95DB Local Header Offset   000036FE (14078)\n+C95DF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC8FD2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC95DF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC8FD2: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC95DF: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC8FAA: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC95B7: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C8FF5 CENTRAL HEADER #128   02014B50 (33639248)\n-C8FF9 Created Zip Spec      14 (20) '2.0'\n-C8FFA Created OS            03 (3) 'Unix'\n-C8FFB Extract Zip Spec      0A (10) '1.0'\n-C8FFC Extract OS            00 (0) 'MS-DOS'\n-C8FFD General Purpose Flag  0800 (2048)\n+C9602 CENTRAL HEADER #128   02014B50 (33639248)\n+C9606 Created Zip Spec      14 (20) '2.0'\n+C9607 Created OS            03 (3) 'Unix'\n+C9608 Extract Zip Spec      0A (10) '1.0'\n+C9609 Extract OS            00 (0) 'MS-DOS'\n+C960A General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C8FFF Compression Method    0000 (0) 'Stored'\n-C9001 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C9005 CRC                   00000000 (0)\n-C9009 Compressed Size       00000000 (0)\n-C900D Uncompressed Size     00000000 (0)\n-C9011 Filename Length       002C (44)\n-C9013 Extra Length          0000 (0)\n-C9015 Comment Length        0000 (0)\n-C9017 Disk Start            0000 (0)\n-C9019 Int File Attributes   0000 (0)\n+C960C Compression Method    0000 (0) 'Stored'\n+C960E Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C9612 CRC                   00000000 (0)\n+C9616 Compressed Size       00000000 (0)\n+C961A Uncompressed Size     00000000 (0)\n+C961E Filename Length       002C (44)\n+C9620 Extra Length          0000 (0)\n+C9622 Comment Length        0000 (0)\n+C9624 Disk Start            0000 (0)\n+C9626 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C901B Ext File Attributes   41ED0010 (1106051088)\n+C9628 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C901F Local Header Offset   0000373F (14143)\n-C9023 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C962C Local Header Offset   0000373F (14143)\n+C9630 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC9023: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC9630: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC9023: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC9630: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC8FFB: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC9608: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C904F CENTRAL HEADER #129   02014B50 (33639248)\n-C9053 Created Zip Spec      14 (20) '2.0'\n-C9054 Created OS            03 (3) 'Unix'\n-C9055 Extract Zip Spec      0A (10) '1.0'\n-C9056 Extract OS            00 (0) 'MS-DOS'\n-C9057 General Purpose Flag  0800 (2048)\n+C965C CENTRAL HEADER #129   02014B50 (33639248)\n+C9660 Created Zip Spec      14 (20) '2.0'\n+C9661 Created OS            03 (3) 'Unix'\n+C9662 Extract Zip Spec      0A (10) '1.0'\n+C9663 Extract OS            00 (0) 'MS-DOS'\n+C9664 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C9059 Compression Method    0000 (0) 'Stored'\n-C905B Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C905F CRC                   00000000 (0)\n-C9063 Compressed Size       00000000 (0)\n-C9067 Uncompressed Size     00000000 (0)\n-C906B Filename Length       0058 (88)\n-C906D Extra Length          0000 (0)\n-C906F Comment Length        0000 (0)\n-C9071 Disk Start            0000 (0)\n-C9073 Int File Attributes   0000 (0)\n+C9666 Compression Method    0000 (0) 'Stored'\n+C9668 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C966C CRC                   00000000 (0)\n+C9670 Compressed Size       00000000 (0)\n+C9674 Uncompressed Size     00000000 (0)\n+C9678 Filename Length       0058 (88)\n+C967A Extra Length          0000 (0)\n+C967C Comment Length        0000 (0)\n+C967E Disk Start            0000 (0)\n+C9680 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C9075 Ext File Attributes   41ED0010 (1106051088)\n+C9682 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C9079 Local Header Offset   00003789 (14217)\n-C907D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C9686 Local Header Offset   00003789 (14217)\n+C968A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC907D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC968A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC907D: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC968A: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC9055: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC9662: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C90D5 CENTRAL HEADER #130   02014B50 (33639248)\n-C90D9 Created Zip Spec      14 (20) '2.0'\n-C90DA Created OS            03 (3) 'Unix'\n-C90DB Extract Zip Spec      0A (10) '1.0'\n-C90DC Extract OS            00 (0) 'MS-DOS'\n-C90DD General Purpose Flag  0800 (2048)\n+C96E2 CENTRAL HEADER #130   02014B50 (33639248)\n+C96E6 Created Zip Spec      14 (20) '2.0'\n+C96E7 Created OS            03 (3) 'Unix'\n+C96E8 Extract Zip Spec      0A (10) '1.0'\n+C96E9 Extract OS            00 (0) 'MS-DOS'\n+C96EA General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C90DF Compression Method    0000 (0) 'Stored'\n-C90E1 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C90E5 CRC                   00000000 (0)\n-C90E9 Compressed Size       00000000 (0)\n-C90ED Uncompressed Size     00000000 (0)\n-C90F1 Filename Length       0031 (49)\n-C90F3 Extra Length          0000 (0)\n-C90F5 Comment Length        0000 (0)\n-C90F7 Disk Start            0000 (0)\n-C90F9 Int File Attributes   0000 (0)\n+C96EC Compression Method    0000 (0) 'Stored'\n+C96EE Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C96F2 CRC                   00000000 (0)\n+C96F6 Compressed Size       00000000 (0)\n+C96FA Uncompressed Size     00000000 (0)\n+C96FE Filename Length       0031 (49)\n+C9700 Extra Length          0000 (0)\n+C9702 Comment Length        0000 (0)\n+C9704 Disk Start            0000 (0)\n+C9706 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C90FB Ext File Attributes   41ED0010 (1106051088)\n+C9708 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C90FF Local Header Offset   000037FF (14335)\n-C9103 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C970C Local Header Offset   000037FF (14335)\n+C9710 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC9103: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC9710: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC9103: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC9710: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC90DB: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC96E8: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C9134 CENTRAL HEADER #131   02014B50 (33639248)\n-C9138 Created Zip Spec      14 (20) '2.0'\n-C9139 Created OS            03 (3) 'Unix'\n-C913A Extract Zip Spec      0A (10) '1.0'\n-C913B Extract OS            00 (0) 'MS-DOS'\n-C913C General Purpose Flag  0800 (2048)\n+C9741 CENTRAL HEADER #131   02014B50 (33639248)\n+C9745 Created Zip Spec      14 (20) '2.0'\n+C9746 Created OS            03 (3) 'Unix'\n+C9747 Extract Zip Spec      0A (10) '1.0'\n+C9748 Extract OS            00 (0) 'MS-DOS'\n+C9749 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C913E Compression Method    0000 (0) 'Stored'\n-C9140 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C9144 CRC                   00000000 (0)\n-C9148 Compressed Size       00000000 (0)\n-C914C Uncompressed Size     00000000 (0)\n-C9150 Filename Length       003A (58)\n-C9152 Extra Length          0000 (0)\n-C9154 Comment Length        0000 (0)\n-C9156 Disk Start            0000 (0)\n-C9158 Int File Attributes   0000 (0)\n+C974B Compression Method    0000 (0) 'Stored'\n+C974D Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C9751 CRC                   00000000 (0)\n+C9755 Compressed Size       00000000 (0)\n+C9759 Uncompressed Size     00000000 (0)\n+C975D Filename Length       003A (58)\n+C975F Extra Length          0000 (0)\n+C9761 Comment Length        0000 (0)\n+C9763 Disk Start            0000 (0)\n+C9765 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C915A Ext File Attributes   41ED0010 (1106051088)\n+C9767 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C915E Local Header Offset   0000384E (14414)\n-C9162 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C976B Local Header Offset   0000384E (14414)\n+C976F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC9162: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC976F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC9162: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC976F: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC913A: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC9747: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C919C CENTRAL HEADER #132   02014B50 (33639248)\n-C91A0 Created Zip Spec      14 (20) '2.0'\n-C91A1 Created OS            03 (3) 'Unix'\n-C91A2 Extract Zip Spec      0A (10) '1.0'\n-C91A3 Extract OS            00 (0) 'MS-DOS'\n-C91A4 General Purpose Flag  0800 (2048)\n+C97A9 CENTRAL HEADER #132   02014B50 (33639248)\n+C97AD Created Zip Spec      14 (20) '2.0'\n+C97AE Created OS            03 (3) 'Unix'\n+C97AF Extract Zip Spec      0A (10) '1.0'\n+C97B0 Extract OS            00 (0) 'MS-DOS'\n+C97B1 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C91A6 Compression Method    0000 (0) 'Stored'\n-C91A8 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C91AC CRC                   00000000 (0)\n-C91B0 Compressed Size       00000000 (0)\n-C91B4 Uncompressed Size     00000000 (0)\n-C91B8 Filename Length       006C (108)\n-C91BA Extra Length          0000 (0)\n-C91BC Comment Length        0000 (0)\n-C91BE Disk Start            0000 (0)\n-C91C0 Int File Attributes   0000 (0)\n+C97B3 Compression Method    0000 (0) 'Stored'\n+C97B5 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C97B9 CRC                   00000000 (0)\n+C97BD Compressed Size       00000000 (0)\n+C97C1 Uncompressed Size     00000000 (0)\n+C97C5 Filename Length       006C (108)\n+C97C7 Extra Length          0000 (0)\n+C97C9 Comment Length        0000 (0)\n+C97CB Disk Start            0000 (0)\n+C97CD Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C91C2 Ext File Attributes   41ED0010 (1106051088)\n+C97CF Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C91C6 Local Header Offset   000038A6 (14502)\n-C91CA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C97D3 Local Header Offset   000038A6 (14502)\n+C97D7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC91CA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC97D7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC91CA: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC97D7: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC91A2: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC97AF: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C9236 CENTRAL HEADER #133   02014B50 (33639248)\n-C923A Created Zip Spec      14 (20) '2.0'\n-C923B Created OS            03 (3) 'Unix'\n-C923C Extract Zip Spec      0A (10) '1.0'\n-C923D Extract OS            00 (0) 'MS-DOS'\n-C923E General Purpose Flag  0800 (2048)\n+C9843 CENTRAL HEADER #133   02014B50 (33639248)\n+C9847 Created Zip Spec      14 (20) '2.0'\n+C9848 Created OS            03 (3) 'Unix'\n+C9849 Extract Zip Spec      0A (10) '1.0'\n+C984A Extract OS            00 (0) 'MS-DOS'\n+C984B General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C9240 Compression Method    0000 (0) 'Stored'\n-C9242 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C9246 CRC                   00000000 (0)\n-C924A Compressed Size       00000000 (0)\n-C924E Uncompressed Size     00000000 (0)\n-C9252 Filename Length       0022 (34)\n-C9254 Extra Length          0000 (0)\n-C9256 Comment Length        0000 (0)\n-C9258 Disk Start            0000 (0)\n-C925A Int File Attributes   0000 (0)\n+C984D Compression Method    0000 (0) 'Stored'\n+C984F Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C9853 CRC                   00000000 (0)\n+C9857 Compressed Size       00000000 (0)\n+C985B Uncompressed Size     00000000 (0)\n+C985F Filename Length       0022 (34)\n+C9861 Extra Length          0000 (0)\n+C9863 Comment Length        0000 (0)\n+C9865 Disk Start            0000 (0)\n+C9867 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C925C Ext File Attributes   41ED0010 (1106051088)\n+C9869 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C9260 Local Header Offset   00003930 (14640)\n-C9264 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C986D Local Header Offset   00003930 (14640)\n+C9871 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC9264: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC9871: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC9264: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC9871: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC923C: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC9849: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C9286 CENTRAL HEADER #134   02014B50 (33639248)\n-C928A Created Zip Spec      14 (20) '2.0'\n-C928B Created OS            03 (3) 'Unix'\n-C928C Extract Zip Spec      0A (10) '1.0'\n-C928D Extract OS            00 (0) 'MS-DOS'\n-C928E General Purpose Flag  0800 (2048)\n+C9893 CENTRAL HEADER #134   02014B50 (33639248)\n+C9897 Created Zip Spec      14 (20) '2.0'\n+C9898 Created OS            03 (3) 'Unix'\n+C9899 Extract Zip Spec      0A (10) '1.0'\n+C989A Extract OS            00 (0) 'MS-DOS'\n+C989B General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C9290 Compression Method    0000 (0) 'Stored'\n-C9292 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C9296 CRC                   00000000 (0)\n-C929A Compressed Size       00000000 (0)\n-C929E Uncompressed Size     00000000 (0)\n-C92A2 Filename Length       002B (43)\n-C92A4 Extra Length          0000 (0)\n-C92A6 Comment Length        0000 (0)\n-C92A8 Disk Start            0000 (0)\n-C92AA Int File Attributes   0000 (0)\n+C989D Compression Method    0000 (0) 'Stored'\n+C989F Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C98A3 CRC                   00000000 (0)\n+C98A7 Compressed Size       00000000 (0)\n+C98AB Uncompressed Size     00000000 (0)\n+C98AF Filename Length       002B (43)\n+C98B1 Extra Length          0000 (0)\n+C98B3 Comment Length        0000 (0)\n+C98B5 Disk Start            0000 (0)\n+C98B7 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C92AC Ext File Attributes   41ED0010 (1106051088)\n+C98B9 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C92B0 Local Header Offset   00003970 (14704)\n-C92B4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C98BD Local Header Offset   00003970 (14704)\n+C98C1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC92B4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC98C1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC92B4: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC98C1: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC928C: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC9899: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C92DF CENTRAL HEADER #135   02014B50 (33639248)\n-C92E3 Created Zip Spec      14 (20) '2.0'\n-C92E4 Created OS            03 (3) 'Unix'\n-C92E5 Extract Zip Spec      0A (10) '1.0'\n-C92E6 Extract OS            00 (0) 'MS-DOS'\n-C92E7 General Purpose Flag  0800 (2048)\n+C98EC CENTRAL HEADER #135   02014B50 (33639248)\n+C98F0 Created Zip Spec      14 (20) '2.0'\n+C98F1 Created OS            03 (3) 'Unix'\n+C98F2 Extract Zip Spec      0A (10) '1.0'\n+C98F3 Extract OS            00 (0) 'MS-DOS'\n+C98F4 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C92E9 Compression Method    0000 (0) 'Stored'\n-C92EB Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C92EF CRC                   00000000 (0)\n-C92F3 Compressed Size       00000000 (0)\n-C92F7 Uncompressed Size     00000000 (0)\n-C92FB Filename Length       004D (77)\n-C92FD Extra Length          0000 (0)\n-C92FF Comment Length        0000 (0)\n-C9301 Disk Start            0000 (0)\n-C9303 Int File Attributes   0000 (0)\n+C98F6 Compression Method    0000 (0) 'Stored'\n+C98F8 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C98FC CRC                   00000000 (0)\n+C9900 Compressed Size       00000000 (0)\n+C9904 Uncompressed Size     00000000 (0)\n+C9908 Filename Length       004D (77)\n+C990A Extra Length          0000 (0)\n+C990C Comment Length        0000 (0)\n+C990E Disk Start            0000 (0)\n+C9910 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C9305 Ext File Attributes   41ED0010 (1106051088)\n+C9912 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C9309 Local Header Offset   000039B9 (14777)\n-C930D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C9916 Local Header Offset   000039B9 (14777)\n+C991A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC930D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC991A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC930D: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC991A: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC92E5: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC98F2: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C935A CENTRAL HEADER #136   02014B50 (33639248)\n-C935E Created Zip Spec      14 (20) '2.0'\n-C935F Created OS            03 (3) 'Unix'\n-C9360 Extract Zip Spec      0A (10) '1.0'\n-C9361 Extract OS            00 (0) 'MS-DOS'\n-C9362 General Purpose Flag  0800 (2048)\n+C9967 CENTRAL HEADER #136   02014B50 (33639248)\n+C996B Created Zip Spec      14 (20) '2.0'\n+C996C Created OS            03 (3) 'Unix'\n+C996D Extract Zip Spec      0A (10) '1.0'\n+C996E Extract OS            00 (0) 'MS-DOS'\n+C996F General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C9364 Compression Method    0000 (0) 'Stored'\n-C9366 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C936A CRC                   00000000 (0)\n-C936E Compressed Size       00000000 (0)\n-C9372 Uncompressed Size     00000000 (0)\n-C9376 Filename Length       0030 (48)\n-C9378 Extra Length          0000 (0)\n-C937A Comment Length        0000 (0)\n-C937C Disk Start            0000 (0)\n-C937E Int File Attributes   0000 (0)\n+C9971 Compression Method    0000 (0) 'Stored'\n+C9973 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C9977 CRC                   00000000 (0)\n+C997B Compressed Size       00000000 (0)\n+C997F Uncompressed Size     00000000 (0)\n+C9983 Filename Length       0030 (48)\n+C9985 Extra Length          0000 (0)\n+C9987 Comment Length        0000 (0)\n+C9989 Disk Start            0000 (0)\n+C998B Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C9380 Ext File Attributes   41ED0010 (1106051088)\n+C998D Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C9384 Local Header Offset   00003A24 (14884)\n-C9388 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C9991 Local Header Offset   00003A24 (14884)\n+C9995 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC9388: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC9995: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC9388: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC9995: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC9360: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC996D: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C93B8 CENTRAL HEADER #137   02014B50 (33639248)\n-C93BC Created Zip Spec      14 (20) '2.0'\n-C93BD Created OS            03 (3) 'Unix'\n-C93BE Extract Zip Spec      0A (10) '1.0'\n-C93BF Extract OS            00 (0) 'MS-DOS'\n-C93C0 General Purpose Flag  0800 (2048)\n+C99C5 CENTRAL HEADER #137   02014B50 (33639248)\n+C99C9 Created Zip Spec      14 (20) '2.0'\n+C99CA Created OS            03 (3) 'Unix'\n+C99CB Extract Zip Spec      0A (10) '1.0'\n+C99CC Extract OS            00 (0) 'MS-DOS'\n+C99CD General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C93C2 Compression Method    0000 (0) 'Stored'\n-C93C4 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C93C8 CRC                   00000000 (0)\n-C93CC Compressed Size       00000000 (0)\n-C93D0 Uncompressed Size     00000000 (0)\n-C93D4 Filename Length       0039 (57)\n-C93D6 Extra Length          0000 (0)\n-C93D8 Comment Length        0000 (0)\n-C93DA Disk Start            0000 (0)\n-C93DC Int File Attributes   0000 (0)\n+C99CF Compression Method    0000 (0) 'Stored'\n+C99D1 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C99D5 CRC                   00000000 (0)\n+C99D9 Compressed Size       00000000 (0)\n+C99DD Uncompressed Size     00000000 (0)\n+C99E1 Filename Length       0039 (57)\n+C99E3 Extra Length          0000 (0)\n+C99E5 Comment Length        0000 (0)\n+C99E7 Disk Start            0000 (0)\n+C99E9 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C93DE Ext File Attributes   41ED0010 (1106051088)\n+C99EB Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C93E2 Local Header Offset   00003A72 (14962)\n-C93E6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C99EF Local Header Offset   00003A72 (14962)\n+C99F3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC93E6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC99F3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC93E6: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC99F3: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC93BE: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC99CB: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C941F CENTRAL HEADER #138   02014B50 (33639248)\n-C9423 Created Zip Spec      14 (20) '2.0'\n-C9424 Created OS            03 (3) 'Unix'\n-C9425 Extract Zip Spec      0A (10) '1.0'\n-C9426 Extract OS            00 (0) 'MS-DOS'\n-C9427 General Purpose Flag  0800 (2048)\n+C9A2C CENTRAL HEADER #138   02014B50 (33639248)\n+C9A30 Created Zip Spec      14 (20) '2.0'\n+C9A31 Created OS            03 (3) 'Unix'\n+C9A32 Extract Zip Spec      0A (10) '1.0'\n+C9A33 Extract OS            00 (0) 'MS-DOS'\n+C9A34 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C9429 Compression Method    0000 (0) 'Stored'\n-C942B Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C942F CRC                   00000000 (0)\n-C9433 Compressed Size       00000000 (0)\n-C9437 Uncompressed Size     00000000 (0)\n-C943B Filename Length       006A (106)\n-C943D Extra Length          0000 (0)\n-C943F Comment Length        0000 (0)\n-C9441 Disk Start            0000 (0)\n-C9443 Int File Attributes   0000 (0)\n+C9A36 Compression Method    0000 (0) 'Stored'\n+C9A38 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C9A3C CRC                   00000000 (0)\n+C9A40 Compressed Size       00000000 (0)\n+C9A44 Uncompressed Size     00000000 (0)\n+C9A48 Filename Length       006A (106)\n+C9A4A Extra Length          0000 (0)\n+C9A4C Comment Length        0000 (0)\n+C9A4E Disk Start            0000 (0)\n+C9A50 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C9445 Ext File Attributes   41ED0010 (1106051088)\n+C9A52 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C9449 Local Header Offset   00003AC9 (15049)\n-C944D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C9A56 Local Header Offset   00003AC9 (15049)\n+C9A5A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC944D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC9A5A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC944D: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC9A5A: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC9425: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC9A32: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C94B7 CENTRAL HEADER #139   02014B50 (33639248)\n-C94BB Created Zip Spec      14 (20) '2.0'\n-C94BC Created OS            03 (3) 'Unix'\n-C94BD Extract Zip Spec      0A (10) '1.0'\n-C94BE Extract OS            00 (0) 'MS-DOS'\n-C94BF General Purpose Flag  0800 (2048)\n+C9AC4 CENTRAL HEADER #139   02014B50 (33639248)\n+C9AC8 Created Zip Spec      14 (20) '2.0'\n+C9AC9 Created OS            03 (3) 'Unix'\n+C9ACA Extract Zip Spec      0A (10) '1.0'\n+C9ACB Extract OS            00 (0) 'MS-DOS'\n+C9ACC General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C94C1 Compression Method    0000 (0) 'Stored'\n-C94C3 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C94C7 CRC                   00000000 (0)\n-C94CB Compressed Size       00000000 (0)\n-C94CF Uncompressed Size     00000000 (0)\n-C94D3 Filename Length       003C (60)\n-C94D5 Extra Length          0000 (0)\n-C94D7 Comment Length        0000 (0)\n-C94D9 Disk Start            0000 (0)\n-C94DB Int File Attributes   0000 (0)\n+C9ACE Compression Method    0000 (0) 'Stored'\n+C9AD0 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C9AD4 CRC                   00000000 (0)\n+C9AD8 Compressed Size       00000000 (0)\n+C9ADC Uncompressed Size     00000000 (0)\n+C9AE0 Filename Length       003C (60)\n+C9AE2 Extra Length          0000 (0)\n+C9AE4 Comment Length        0000 (0)\n+C9AE6 Disk Start            0000 (0)\n+C9AE8 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C94DD Ext File Attributes   41ED0010 (1106051088)\n+C9AEA Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C94E1 Local Header Offset   00003B51 (15185)\n-C94E5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C9AEE Local Header Offset   00003B51 (15185)\n+C9AF2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC94E5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC9AF2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC94E5: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC9AF2: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC94BD: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC9ACA: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C9521 CENTRAL HEADER #140   02014B50 (33639248)\n-C9525 Created Zip Spec      14 (20) '2.0'\n-C9526 Created OS            03 (3) 'Unix'\n-C9527 Extract Zip Spec      0A (10) '1.0'\n-C9528 Extract OS            00 (0) 'MS-DOS'\n-C9529 General Purpose Flag  0800 (2048)\n+C9B2E CENTRAL HEADER #140   02014B50 (33639248)\n+C9B32 Created Zip Spec      14 (20) '2.0'\n+C9B33 Created OS            03 (3) 'Unix'\n+C9B34 Extract Zip Spec      0A (10) '1.0'\n+C9B35 Extract OS            00 (0) 'MS-DOS'\n+C9B36 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C952B Compression Method    0000 (0) 'Stored'\n-C952D Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C9531 CRC                   00000000 (0)\n-C9535 Compressed Size       00000000 (0)\n-C9539 Uncompressed Size     00000000 (0)\n-C953D Filename Length       0045 (69)\n-C953F Extra Length          0000 (0)\n-C9541 Comment Length        0000 (0)\n-C9543 Disk Start            0000 (0)\n-C9545 Int File Attributes   0000 (0)\n+C9B38 Compression Method    0000 (0) 'Stored'\n+C9B3A Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C9B3E CRC                   00000000 (0)\n+C9B42 Compressed Size       00000000 (0)\n+C9B46 Uncompressed Size     00000000 (0)\n+C9B4A Filename Length       0045 (69)\n+C9B4C Extra Length          0000 (0)\n+C9B4E Comment Length        0000 (0)\n+C9B50 Disk Start            0000 (0)\n+C9B52 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C9547 Ext File Attributes   41ED0010 (1106051088)\n+C9B54 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C954B Local Header Offset   00003BAB (15275)\n-C954F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C9B58 Local Header Offset   00003BAB (15275)\n+C9B5C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC954F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC9B5C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC954F: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC9B5C: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC9527: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC9B34: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C9594 CENTRAL HEADER #141   02014B50 (33639248)\n-C9598 Created Zip Spec      14 (20) '2.0'\n-C9599 Created OS            03 (3) 'Unix'\n-C959A Extract Zip Spec      0A (10) '1.0'\n-C959B Extract OS            00 (0) 'MS-DOS'\n-C959C General Purpose Flag  0800 (2048)\n+C9BA1 CENTRAL HEADER #141   02014B50 (33639248)\n+C9BA5 Created Zip Spec      14 (20) '2.0'\n+C9BA6 Created OS            03 (3) 'Unix'\n+C9BA7 Extract Zip Spec      0A (10) '1.0'\n+C9BA8 Extract OS            00 (0) 'MS-DOS'\n+C9BA9 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C959E Compression Method    0000 (0) 'Stored'\n-C95A0 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C95A4 CRC                   00000000 (0)\n-C95A8 Compressed Size       00000000 (0)\n-C95AC Uncompressed Size     00000000 (0)\n-C95B0 Filename Length       0063 (99)\n-C95B2 Extra Length          0000 (0)\n-C95B4 Comment Length        0000 (0)\n-C95B6 Disk Start            0000 (0)\n-C95B8 Int File Attributes   0000 (0)\n+C9BAB Compression Method    0000 (0) 'Stored'\n+C9BAD Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C9BB1 CRC                   00000000 (0)\n+C9BB5 Compressed Size       00000000 (0)\n+C9BB9 Uncompressed Size     00000000 (0)\n+C9BBD Filename Length       0063 (99)\n+C9BBF Extra Length          0000 (0)\n+C9BC1 Comment Length        0000 (0)\n+C9BC3 Disk Start            0000 (0)\n+C9BC5 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C95BA Ext File Attributes   41ED0010 (1106051088)\n+C9BC7 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C95BE Local Header Offset   00003C0E (15374)\n-C95C2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C9BCB Local Header Offset   00003C0E (15374)\n+C9BCF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC95C2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC9BCF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC95C2: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC9BCF: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC959A: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC9BA7: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C9625 CENTRAL HEADER #142   02014B50 (33639248)\n-C9629 Created Zip Spec      14 (20) '2.0'\n-C962A Created OS            03 (3) 'Unix'\n-C962B Extract Zip Spec      0A (10) '1.0'\n-C962C Extract OS            00 (0) 'MS-DOS'\n-C962D General Purpose Flag  0800 (2048)\n+C9C32 CENTRAL HEADER #142   02014B50 (33639248)\n+C9C36 Created Zip Spec      14 (20) '2.0'\n+C9C37 Created OS            03 (3) 'Unix'\n+C9C38 Extract Zip Spec      0A (10) '1.0'\n+C9C39 Extract OS            00 (0) 'MS-DOS'\n+C9C3A General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C962F Compression Method    0000 (0) 'Stored'\n-C9631 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C9635 CRC                   00000000 (0)\n-C9639 Compressed Size       00000000 (0)\n-C963D Uncompressed Size     00000000 (0)\n-C9641 Filename Length       0063 (99)\n-C9643 Extra Length          0000 (0)\n-C9645 Comment Length        0000 (0)\n-C9647 Disk Start            0000 (0)\n-C9649 Int File Attributes   0000 (0)\n+C9C3C Compression Method    0000 (0) 'Stored'\n+C9C3E Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C9C42 CRC                   00000000 (0)\n+C9C46 Compressed Size       00000000 (0)\n+C9C4A Uncompressed Size     00000000 (0)\n+C9C4E Filename Length       0063 (99)\n+C9C50 Extra Length          0000 (0)\n+C9C52 Comment Length        0000 (0)\n+C9C54 Disk Start            0000 (0)\n+C9C56 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C964B Ext File Attributes   41ED0010 (1106051088)\n+C9C58 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C964F Local Header Offset   00003C8F (15503)\n-C9653 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C9C5C Local Header Offset   00003C8F (15503)\n+C9C60 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC9653: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC9C60: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC9653: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC9C60: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC962B: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC9C38: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C96B6 CENTRAL HEADER #143   02014B50 (33639248)\n-C96BA Created Zip Spec      14 (20) '2.0'\n-C96BB Created OS            03 (3) 'Unix'\n-C96BC Extract Zip Spec      0A (10) '1.0'\n-C96BD Extract OS            00 (0) 'MS-DOS'\n-C96BE General Purpose Flag  0800 (2048)\n+C9CC3 CENTRAL HEADER #143   02014B50 (33639248)\n+C9CC7 Created Zip Spec      14 (20) '2.0'\n+C9CC8 Created OS            03 (3) 'Unix'\n+C9CC9 Extract Zip Spec      0A (10) '1.0'\n+C9CCA Extract OS            00 (0) 'MS-DOS'\n+C9CCB General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C96C0 Compression Method    0000 (0) 'Stored'\n-C96C2 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C96C6 CRC                   00000000 (0)\n-C96CA Compressed Size       00000000 (0)\n-C96CE Uncompressed Size     00000000 (0)\n-C96D2 Filename Length       0065 (101)\n-C96D4 Extra Length          0000 (0)\n-C96D6 Comment Length        0000 (0)\n-C96D8 Disk Start            0000 (0)\n-C96DA Int File Attributes   0000 (0)\n+C9CCD Compression Method    0000 (0) 'Stored'\n+C9CCF Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C9CD3 CRC                   00000000 (0)\n+C9CD7 Compressed Size       00000000 (0)\n+C9CDB Uncompressed Size     00000000 (0)\n+C9CDF Filename Length       0065 (101)\n+C9CE1 Extra Length          0000 (0)\n+C9CE3 Comment Length        0000 (0)\n+C9CE5 Disk Start            0000 (0)\n+C9CE7 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C96DC Ext File Attributes   41ED0010 (1106051088)\n+C9CE9 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C96E0 Local Header Offset   00003D10 (15632)\n-C96E4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C9CED Local Header Offset   00003D10 (15632)\n+C9CF1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC96E4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC9CF1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC96E4: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC9CF1: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC96BC: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC9CC9: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C9749 CENTRAL HEADER #144   02014B50 (33639248)\n-C974D Created Zip Spec      14 (20) '2.0'\n-C974E Created OS            03 (3) 'Unix'\n-C974F Extract Zip Spec      0A (10) '1.0'\n-C9750 Extract OS            00 (0) 'MS-DOS'\n-C9751 General Purpose Flag  0800 (2048)\n+C9D56 CENTRAL HEADER #144   02014B50 (33639248)\n+C9D5A Created Zip Spec      14 (20) '2.0'\n+C9D5B Created OS            03 (3) 'Unix'\n+C9D5C Extract Zip Spec      0A (10) '1.0'\n+C9D5D Extract OS            00 (0) 'MS-DOS'\n+C9D5E General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C9753 Compression Method    0000 (0) 'Stored'\n-C9755 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C9759 CRC                   00000000 (0)\n-C975D Compressed Size       00000000 (0)\n-C9761 Uncompressed Size     00000000 (0)\n-C9765 Filename Length       0069 (105)\n-C9767 Extra Length          0000 (0)\n-C9769 Comment Length        0000 (0)\n-C976B Disk Start            0000 (0)\n-C976D Int File Attributes   0000 (0)\n+C9D60 Compression Method    0000 (0) 'Stored'\n+C9D62 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C9D66 CRC                   00000000 (0)\n+C9D6A Compressed Size       00000000 (0)\n+C9D6E Uncompressed Size     00000000 (0)\n+C9D72 Filename Length       0069 (105)\n+C9D74 Extra Length          0000 (0)\n+C9D76 Comment Length        0000 (0)\n+C9D78 Disk Start            0000 (0)\n+C9D7A Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C976F Ext File Attributes   41ED0010 (1106051088)\n+C9D7C Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C9773 Local Header Offset   00003D93 (15763)\n-C9777 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C9D80 Local Header Offset   00003D93 (15763)\n+C9D84 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC9777: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC9D84: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC9777: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC9D84: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC974F: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC9D5C: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C97E0 CENTRAL HEADER #145   02014B50 (33639248)\n-C97E4 Created Zip Spec      14 (20) '2.0'\n-C97E5 Created OS            03 (3) 'Unix'\n-C97E6 Extract Zip Spec      0A (10) '1.0'\n-C97E7 Extract OS            00 (0) 'MS-DOS'\n-C97E8 General Purpose Flag  0800 (2048)\n+C9DED CENTRAL HEADER #145   02014B50 (33639248)\n+C9DF1 Created Zip Spec      14 (20) '2.0'\n+C9DF2 Created OS            03 (3) 'Unix'\n+C9DF3 Extract Zip Spec      0A (10) '1.0'\n+C9DF4 Extract OS            00 (0) 'MS-DOS'\n+C9DF5 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C97EA Compression Method    0000 (0) 'Stored'\n-C97EC Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C97F0 CRC                   00000000 (0)\n-C97F4 Compressed Size       00000000 (0)\n-C97F8 Uncompressed Size     00000000 (0)\n-C97FC Filename Length       0069 (105)\n-C97FE Extra Length          0000 (0)\n-C9800 Comment Length        0000 (0)\n-C9802 Disk Start            0000 (0)\n-C9804 Int File Attributes   0000 (0)\n+C9DF7 Compression Method    0000 (0) 'Stored'\n+C9DF9 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C9DFD CRC                   00000000 (0)\n+C9E01 Compressed Size       00000000 (0)\n+C9E05 Uncompressed Size     00000000 (0)\n+C9E09 Filename Length       0069 (105)\n+C9E0B Extra Length          0000 (0)\n+C9E0D Comment Length        0000 (0)\n+C9E0F Disk Start            0000 (0)\n+C9E11 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C9806 Ext File Attributes   41ED0010 (1106051088)\n+C9E13 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C980A Local Header Offset   00003E1A (15898)\n-C980E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C9E17 Local Header Offset   00003E1A (15898)\n+C9E1B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC980E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC9E1B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC980E: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC9E1B: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC97E6: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC9DF3: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C9877 CENTRAL HEADER #146   02014B50 (33639248)\n-C987B Created Zip Spec      14 (20) '2.0'\n-C987C Created OS            03 (3) 'Unix'\n-C987D Extract Zip Spec      0A (10) '1.0'\n-C987E Extract OS            00 (0) 'MS-DOS'\n-C987F General Purpose Flag  0800 (2048)\n+C9E84 CENTRAL HEADER #146   02014B50 (33639248)\n+C9E88 Created Zip Spec      14 (20) '2.0'\n+C9E89 Created OS            03 (3) 'Unix'\n+C9E8A Extract Zip Spec      0A (10) '1.0'\n+C9E8B Extract OS            00 (0) 'MS-DOS'\n+C9E8C General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C9881 Compression Method    0000 (0) 'Stored'\n-C9883 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C9887 CRC                   00000000 (0)\n-C988B Compressed Size       00000000 (0)\n-C988F Uncompressed Size     00000000 (0)\n-C9893 Filename Length       006D (109)\n-C9895 Extra Length          0000 (0)\n-C9897 Comment Length        0000 (0)\n-C9899 Disk Start            0000 (0)\n-C989B Int File Attributes   0000 (0)\n+C9E8E Compression Method    0000 (0) 'Stored'\n+C9E90 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C9E94 CRC                   00000000 (0)\n+C9E98 Compressed Size       00000000 (0)\n+C9E9C Uncompressed Size     00000000 (0)\n+C9EA0 Filename Length       006D (109)\n+C9EA2 Extra Length          0000 (0)\n+C9EA4 Comment Length        0000 (0)\n+C9EA6 Disk Start            0000 (0)\n+C9EA8 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C989D Ext File Attributes   41ED0010 (1106051088)\n+C9EAA Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C98A1 Local Header Offset   00003EA1 (16033)\n-C98A5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C9EAE Local Header Offset   00003EA1 (16033)\n+C9EB2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC98A5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC9EB2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC98A5: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC9EB2: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC987D: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC9E8A: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C9912 CENTRAL HEADER #147   02014B50 (33639248)\n-C9916 Created Zip Spec      14 (20) '2.0'\n-C9917 Created OS            03 (3) 'Unix'\n-C9918 Extract Zip Spec      0A (10) '1.0'\n-C9919 Extract OS            00 (0) 'MS-DOS'\n-C991A General Purpose Flag  0800 (2048)\n+C9F1F CENTRAL HEADER #147   02014B50 (33639248)\n+C9F23 Created Zip Spec      14 (20) '2.0'\n+C9F24 Created OS            03 (3) 'Unix'\n+C9F25 Extract Zip Spec      0A (10) '1.0'\n+C9F26 Extract OS            00 (0) 'MS-DOS'\n+C9F27 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C991C Compression Method    0000 (0) 'Stored'\n-C991E Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C9922 CRC                   00000000 (0)\n-C9926 Compressed Size       00000000 (0)\n-C992A Uncompressed Size     00000000 (0)\n-C992E Filename Length       0069 (105)\n-C9930 Extra Length          0000 (0)\n-C9932 Comment Length        0000 (0)\n-C9934 Disk Start            0000 (0)\n-C9936 Int File Attributes   0000 (0)\n+C9F29 Compression Method    0000 (0) 'Stored'\n+C9F2B Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C9F2F CRC                   00000000 (0)\n+C9F33 Compressed Size       00000000 (0)\n+C9F37 Uncompressed Size     00000000 (0)\n+C9F3B Filename Length       0069 (105)\n+C9F3D Extra Length          0000 (0)\n+C9F3F Comment Length        0000 (0)\n+C9F41 Disk Start            0000 (0)\n+C9F43 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C9938 Ext File Attributes   41ED0010 (1106051088)\n+C9F45 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C993C Local Header Offset   00003F2C (16172)\n-C9940 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C9F49 Local Header Offset   00003F2C (16172)\n+C9F4D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC9940: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC9F4D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC9940: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC9F4D: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC9918: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC9F25: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C99A9 CENTRAL HEADER #148   02014B50 (33639248)\n-C99AD Created Zip Spec      14 (20) '2.0'\n-C99AE Created OS            03 (3) 'Unix'\n-C99AF Extract Zip Spec      0A (10) '1.0'\n-C99B0 Extract OS            00 (0) 'MS-DOS'\n-C99B1 General Purpose Flag  0800 (2048)\n+C9FB6 CENTRAL HEADER #148   02014B50 (33639248)\n+C9FBA Created Zip Spec      14 (20) '2.0'\n+C9FBB Created OS            03 (3) 'Unix'\n+C9FBC Extract Zip Spec      0A (10) '1.0'\n+C9FBD Extract OS            00 (0) 'MS-DOS'\n+C9FBE General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C99B3 Compression Method    0000 (0) 'Stored'\n-C99B5 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C99B9 CRC                   00000000 (0)\n-C99BD Compressed Size       00000000 (0)\n-C99C1 Uncompressed Size     00000000 (0)\n-C99C5 Filename Length       0078 (120)\n-C99C7 Extra Length          0000 (0)\n-C99C9 Comment Length        0000 (0)\n-C99CB Disk Start            0000 (0)\n-C99CD Int File Attributes   0000 (0)\n+C9FC0 Compression Method    0000 (0) 'Stored'\n+C9FC2 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+C9FC6 CRC                   00000000 (0)\n+C9FCA Compressed Size       00000000 (0)\n+C9FCE Uncompressed Size     00000000 (0)\n+C9FD2 Filename Length       0078 (120)\n+C9FD4 Extra Length          0000 (0)\n+C9FD6 Comment Length        0000 (0)\n+C9FD8 Disk Start            0000 (0)\n+C9FDA Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C99CF Ext File Attributes   41ED0010 (1106051088)\n+C9FDC Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C99D3 Local Header Offset   00003FB3 (16307)\n-C99D7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+C9FE0 Local Header Offset   00003FB3 (16307)\n+C9FE4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC99D7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC9FE4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC99D7: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xC9FE4: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC99AF: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC9FBC: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C9A4F CENTRAL HEADER #149   02014B50 (33639248)\n-C9A53 Created Zip Spec      14 (20) '2.0'\n-C9A54 Created OS            03 (3) 'Unix'\n-C9A55 Extract Zip Spec      0A (10) '1.0'\n-C9A56 Extract OS            00 (0) 'MS-DOS'\n-C9A57 General Purpose Flag  0800 (2048)\n+CA05C CENTRAL HEADER #149   02014B50 (33639248)\n+CA060 Created Zip Spec      14 (20) '2.0'\n+CA061 Created OS            03 (3) 'Unix'\n+CA062 Extract Zip Spec      0A (10) '1.0'\n+CA063 Extract OS            00 (0) 'MS-DOS'\n+CA064 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C9A59 Compression Method    0000 (0) 'Stored'\n-C9A5B Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C9A5F CRC                   00000000 (0)\n-C9A63 Compressed Size       00000000 (0)\n-C9A67 Uncompressed Size     00000000 (0)\n-C9A6B Filename Length       0063 (99)\n-C9A6D Extra Length          0000 (0)\n-C9A6F Comment Length        0000 (0)\n-C9A71 Disk Start            0000 (0)\n-C9A73 Int File Attributes   0000 (0)\n+CA066 Compression Method    0000 (0) 'Stored'\n+CA068 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CA06C CRC                   00000000 (0)\n+CA070 Compressed Size       00000000 (0)\n+CA074 Uncompressed Size     00000000 (0)\n+CA078 Filename Length       0063 (99)\n+CA07A Extra Length          0000 (0)\n+CA07C Comment Length        0000 (0)\n+CA07E Disk Start            0000 (0)\n+CA080 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C9A75 Ext File Attributes   41ED0010 (1106051088)\n+CA082 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C9A79 Local Header Offset   00004049 (16457)\n-C9A7D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CA086 Local Header Offset   00004049 (16457)\n+CA08A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC9A7D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCA08A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC9A7D: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xCA08A: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC9A55: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCA062: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C9AE0 CENTRAL HEADER #150   02014B50 (33639248)\n-C9AE4 Created Zip Spec      14 (20) '2.0'\n-C9AE5 Created OS            03 (3) 'Unix'\n-C9AE6 Extract Zip Spec      0A (10) '1.0'\n-C9AE7 Extract OS            00 (0) 'MS-DOS'\n-C9AE8 General Purpose Flag  0800 (2048)\n+CA0ED CENTRAL HEADER #150   02014B50 (33639248)\n+CA0F1 Created Zip Spec      14 (20) '2.0'\n+CA0F2 Created OS            03 (3) 'Unix'\n+CA0F3 Extract Zip Spec      0A (10) '1.0'\n+CA0F4 Extract OS            00 (0) 'MS-DOS'\n+CA0F5 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C9AEA Compression Method    0000 (0) 'Stored'\n-C9AEC Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C9AF0 CRC                   00000000 (0)\n-C9AF4 Compressed Size       00000000 (0)\n-C9AF8 Uncompressed Size     00000000 (0)\n-C9AFC Filename Length       006C (108)\n-C9AFE Extra Length          0000 (0)\n-C9B00 Comment Length        0000 (0)\n-C9B02 Disk Start            0000 (0)\n-C9B04 Int File Attributes   0000 (0)\n+CA0F7 Compression Method    0000 (0) 'Stored'\n+CA0F9 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CA0FD CRC                   00000000 (0)\n+CA101 Compressed Size       00000000 (0)\n+CA105 Uncompressed Size     00000000 (0)\n+CA109 Filename Length       006C (108)\n+CA10B Extra Length          0000 (0)\n+CA10D Comment Length        0000 (0)\n+CA10F Disk Start            0000 (0)\n+CA111 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C9B06 Ext File Attributes   41ED0010 (1106051088)\n+CA113 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C9B0A Local Header Offset   000040CA (16586)\n-C9B0E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CA117 Local Header Offset   000040CA (16586)\n+CA11B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC9B0E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCA11B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC9B0E: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xCA11B: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC9AE6: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCA0F3: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C9B7A CENTRAL HEADER #151   02014B50 (33639248)\n-C9B7E Created Zip Spec      14 (20) '2.0'\n-C9B7F Created OS            03 (3) 'Unix'\n-C9B80 Extract Zip Spec      0A (10) '1.0'\n-C9B81 Extract OS            00 (0) 'MS-DOS'\n-C9B82 General Purpose Flag  0800 (2048)\n+CA187 CENTRAL HEADER #151   02014B50 (33639248)\n+CA18B Created Zip Spec      14 (20) '2.0'\n+CA18C Created OS            03 (3) 'Unix'\n+CA18D Extract Zip Spec      0A (10) '1.0'\n+CA18E Extract OS            00 (0) 'MS-DOS'\n+CA18F General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C9B84 Compression Method    0000 (0) 'Stored'\n-C9B86 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C9B8A CRC                   00000000 (0)\n-C9B8E Compressed Size       00000000 (0)\n-C9B92 Uncompressed Size     00000000 (0)\n-C9B96 Filename Length       0069 (105)\n-C9B98 Extra Length          0000 (0)\n-C9B9A Comment Length        0000 (0)\n-C9B9C Disk Start            0000 (0)\n-C9B9E Int File Attributes   0000 (0)\n+CA191 Compression Method    0000 (0) 'Stored'\n+CA193 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CA197 CRC                   00000000 (0)\n+CA19B Compressed Size       00000000 (0)\n+CA19F Uncompressed Size     00000000 (0)\n+CA1A3 Filename Length       0069 (105)\n+CA1A5 Extra Length          0000 (0)\n+CA1A7 Comment Length        0000 (0)\n+CA1A9 Disk Start            0000 (0)\n+CA1AB Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C9BA0 Ext File Attributes   41ED0010 (1106051088)\n+CA1AD Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C9BA4 Local Header Offset   00004154 (16724)\n-C9BA8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CA1B1 Local Header Offset   00004154 (16724)\n+CA1B5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC9BA8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCA1B5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC9BA8: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xCA1B5: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC9B80: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCA18D: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C9C11 CENTRAL HEADER #152   02014B50 (33639248)\n-C9C15 Created Zip Spec      14 (20) '2.0'\n-C9C16 Created OS            03 (3) 'Unix'\n-C9C17 Extract Zip Spec      0A (10) '1.0'\n-C9C18 Extract OS            00 (0) 'MS-DOS'\n-C9C19 General Purpose Flag  0800 (2048)\n+CA21E CENTRAL HEADER #152   02014B50 (33639248)\n+CA222 Created Zip Spec      14 (20) '2.0'\n+CA223 Created OS            03 (3) 'Unix'\n+CA224 Extract Zip Spec      0A (10) '1.0'\n+CA225 Extract OS            00 (0) 'MS-DOS'\n+CA226 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C9C1B Compression Method    0000 (0) 'Stored'\n-C9C1D Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C9C21 CRC                   00000000 (0)\n-C9C25 Compressed Size       00000000 (0)\n-C9C29 Uncompressed Size     00000000 (0)\n-C9C2D Filename Length       0029 (41)\n-C9C2F Extra Length          0000 (0)\n-C9C31 Comment Length        0000 (0)\n-C9C33 Disk Start            0000 (0)\n-C9C35 Int File Attributes   0000 (0)\n+CA228 Compression Method    0000 (0) 'Stored'\n+CA22A Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CA22E CRC                   00000000 (0)\n+CA232 Compressed Size       00000000 (0)\n+CA236 Uncompressed Size     00000000 (0)\n+CA23A Filename Length       0029 (41)\n+CA23C Extra Length          0000 (0)\n+CA23E Comment Length        0000 (0)\n+CA240 Disk Start            0000 (0)\n+CA242 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C9C37 Ext File Attributes   41ED0010 (1106051088)\n+CA244 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C9C3B Local Header Offset   000041DB (16859)\n-C9C3F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CA248 Local Header Offset   000041DB (16859)\n+CA24C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC9C3F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCA24C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC9C3F: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xCA24C: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC9C17: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCA224: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C9C68 CENTRAL HEADER #153   02014B50 (33639248)\n-C9C6C Created Zip Spec      14 (20) '2.0'\n-C9C6D Created OS            03 (3) 'Unix'\n-C9C6E Extract Zip Spec      0A (10) '1.0'\n-C9C6F Extract OS            00 (0) 'MS-DOS'\n-C9C70 General Purpose Flag  0800 (2048)\n+CA275 CENTRAL HEADER #153   02014B50 (33639248)\n+CA279 Created Zip Spec      14 (20) '2.0'\n+CA27A Created OS            03 (3) 'Unix'\n+CA27B Extract Zip Spec      0A (10) '1.0'\n+CA27C Extract OS            00 (0) 'MS-DOS'\n+CA27D General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C9C72 Compression Method    0000 (0) 'Stored'\n-C9C74 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C9C78 CRC                   00000000 (0)\n-C9C7C Compressed Size       00000000 (0)\n-C9C80 Uncompressed Size     00000000 (0)\n-C9C84 Filename Length       0032 (50)\n-C9C86 Extra Length          0000 (0)\n-C9C88 Comment Length        0000 (0)\n-C9C8A Disk Start            0000 (0)\n-C9C8C Int File Attributes   0000 (0)\n+CA27F Compression Method    0000 (0) 'Stored'\n+CA281 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CA285 CRC                   00000000 (0)\n+CA289 Compressed Size       00000000 (0)\n+CA28D Uncompressed Size     00000000 (0)\n+CA291 Filename Length       0032 (50)\n+CA293 Extra Length          0000 (0)\n+CA295 Comment Length        0000 (0)\n+CA297 Disk Start            0000 (0)\n+CA299 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C9C8E Ext File Attributes   41ED0010 (1106051088)\n+CA29B Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C9C92 Local Header Offset   00004222 (16930)\n-C9C96 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CA29F Local Header Offset   00004222 (16930)\n+CA2A3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC9C96: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCA2A3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC9C96: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xCA2A3: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC9C6E: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCA27B: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C9CC8 CENTRAL HEADER #154   02014B50 (33639248)\n-C9CCC Created Zip Spec      14 (20) '2.0'\n-C9CCD Created OS            03 (3) 'Unix'\n-C9CCE Extract Zip Spec      0A (10) '1.0'\n-C9CCF Extract OS            00 (0) 'MS-DOS'\n-C9CD0 General Purpose Flag  0800 (2048)\n+CA2D5 CENTRAL HEADER #154   02014B50 (33639248)\n+CA2D9 Created Zip Spec      14 (20) '2.0'\n+CA2DA Created OS            03 (3) 'Unix'\n+CA2DB Extract Zip Spec      0A (10) '1.0'\n+CA2DC Extract OS            00 (0) 'MS-DOS'\n+CA2DD General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C9CD2 Compression Method    0000 (0) 'Stored'\n-C9CD4 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C9CD8 CRC                   00000000 (0)\n-C9CDC Compressed Size       00000000 (0)\n-C9CE0 Uncompressed Size     00000000 (0)\n-C9CE4 Filename Length       006C (108)\n-C9CE6 Extra Length          0000 (0)\n-C9CE8 Comment Length        0000 (0)\n-C9CEA Disk Start            0000 (0)\n-C9CEC Int File Attributes   0000 (0)\n+CA2DF Compression Method    0000 (0) 'Stored'\n+CA2E1 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CA2E5 CRC                   00000000 (0)\n+CA2E9 Compressed Size       00000000 (0)\n+CA2ED Uncompressed Size     00000000 (0)\n+CA2F1 Filename Length       006C (108)\n+CA2F3 Extra Length          0000 (0)\n+CA2F5 Comment Length        0000 (0)\n+CA2F7 Disk Start            0000 (0)\n+CA2F9 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C9CEE Ext File Attributes   41ED0010 (1106051088)\n+CA2FB Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C9CF2 Local Header Offset   00004272 (17010)\n-C9CF6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CA2FF Local Header Offset   00004272 (17010)\n+CA303 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC9CF6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCA303: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC9CF6: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xCA303: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC9CCE: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCA2DB: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C9D62 CENTRAL HEADER #155   02014B50 (33639248)\n-C9D66 Created Zip Spec      14 (20) '2.0'\n-C9D67 Created OS            03 (3) 'Unix'\n-C9D68 Extract Zip Spec      0A (10) '1.0'\n-C9D69 Extract OS            00 (0) 'MS-DOS'\n-C9D6A General Purpose Flag  0800 (2048)\n+CA36F CENTRAL HEADER #155   02014B50 (33639248)\n+CA373 Created Zip Spec      14 (20) '2.0'\n+CA374 Created OS            03 (3) 'Unix'\n+CA375 Extract Zip Spec      0A (10) '1.0'\n+CA376 Extract OS            00 (0) 'MS-DOS'\n+CA377 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C9D6C Compression Method    0000 (0) 'Stored'\n-C9D6E Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C9D72 CRC                   00000000 (0)\n-C9D76 Compressed Size       00000000 (0)\n-C9D7A Uncompressed Size     00000000 (0)\n-C9D7E Filename Length       006E (110)\n-C9D80 Extra Length          0000 (0)\n-C9D82 Comment Length        0000 (0)\n-C9D84 Disk Start            0000 (0)\n-C9D86 Int File Attributes   0000 (0)\n+CA379 Compression Method    0000 (0) 'Stored'\n+CA37B Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CA37F CRC                   00000000 (0)\n+CA383 Compressed Size       00000000 (0)\n+CA387 Uncompressed Size     00000000 (0)\n+CA38B Filename Length       006E (110)\n+CA38D Extra Length          0000 (0)\n+CA38F Comment Length        0000 (0)\n+CA391 Disk Start            0000 (0)\n+CA393 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C9D88 Ext File Attributes   41ED0010 (1106051088)\n+CA395 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C9D8C Local Header Offset   000042FC (17148)\n-C9D90 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CA399 Local Header Offset   000042FC (17148)\n+CA39D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC9D90: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCA39D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC9D90: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xCA39D: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC9D68: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCA375: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C9DFE CENTRAL HEADER #156   02014B50 (33639248)\n-C9E02 Created Zip Spec      14 (20) '2.0'\n-C9E03 Created OS            03 (3) 'Unix'\n-C9E04 Extract Zip Spec      0A (10) '1.0'\n-C9E05 Extract OS            00 (0) 'MS-DOS'\n-C9E06 General Purpose Flag  0800 (2048)\n+CA40B CENTRAL HEADER #156   02014B50 (33639248)\n+CA40F Created Zip Spec      14 (20) '2.0'\n+CA410 Created OS            03 (3) 'Unix'\n+CA411 Extract Zip Spec      0A (10) '1.0'\n+CA412 Extract OS            00 (0) 'MS-DOS'\n+CA413 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C9E08 Compression Method    0000 (0) 'Stored'\n-C9E0A Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C9E0E CRC                   00000000 (0)\n-C9E12 Compressed Size       00000000 (0)\n-C9E16 Uncompressed Size     00000000 (0)\n-C9E1A Filename Length       0028 (40)\n-C9E1C Extra Length          0000 (0)\n-C9E1E Comment Length        0000 (0)\n-C9E20 Disk Start            0000 (0)\n-C9E22 Int File Attributes   0000 (0)\n+CA415 Compression Method    0000 (0) 'Stored'\n+CA417 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CA41B CRC                   00000000 (0)\n+CA41F Compressed Size       00000000 (0)\n+CA423 Uncompressed Size     00000000 (0)\n+CA427 Filename Length       0028 (40)\n+CA429 Extra Length          0000 (0)\n+CA42B Comment Length        0000 (0)\n+CA42D Disk Start            0000 (0)\n+CA42F Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C9E24 Ext File Attributes   41ED0010 (1106051088)\n+CA431 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C9E28 Local Header Offset   00004388 (17288)\n-C9E2C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CA435 Local Header Offset   00004388 (17288)\n+CA439 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC9E2C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCA439: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC9E2C: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xCA439: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC9E04: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCA411: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C9E54 CENTRAL HEADER #157   02014B50 (33639248)\n-C9E58 Created Zip Spec      14 (20) '2.0'\n-C9E59 Created OS            03 (3) 'Unix'\n-C9E5A Extract Zip Spec      0A (10) '1.0'\n-C9E5B Extract OS            00 (0) 'MS-DOS'\n-C9E5C General Purpose Flag  0800 (2048)\n+CA461 CENTRAL HEADER #157   02014B50 (33639248)\n+CA465 Created Zip Spec      14 (20) '2.0'\n+CA466 Created OS            03 (3) 'Unix'\n+CA467 Extract Zip Spec      0A (10) '1.0'\n+CA468 Extract OS            00 (0) 'MS-DOS'\n+CA469 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C9E5E Compression Method    0000 (0) 'Stored'\n-C9E60 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C9E64 CRC                   00000000 (0)\n-C9E68 Compressed Size       00000000 (0)\n-C9E6C Uncompressed Size     00000000 (0)\n-C9E70 Filename Length       0031 (49)\n-C9E72 Extra Length          0000 (0)\n-C9E74 Comment Length        0000 (0)\n-C9E76 Disk Start            0000 (0)\n-C9E78 Int File Attributes   0000 (0)\n+CA46B Compression Method    0000 (0) 'Stored'\n+CA46D Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CA471 CRC                   00000000 (0)\n+CA475 Compressed Size       00000000 (0)\n+CA479 Uncompressed Size     00000000 (0)\n+CA47D Filename Length       0031 (49)\n+CA47F Extra Length          0000 (0)\n+CA481 Comment Length        0000 (0)\n+CA483 Disk Start            0000 (0)\n+CA485 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C9E7A Ext File Attributes   41ED0010 (1106051088)\n+CA487 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C9E7E Local Header Offset   000043CE (17358)\n-C9E82 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CA48B Local Header Offset   000043CE (17358)\n+CA48F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC9E82: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCA48F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC9E82: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xCA48F: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC9E5A: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCA467: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C9EB3 CENTRAL HEADER #158   02014B50 (33639248)\n-C9EB7 Created Zip Spec      14 (20) '2.0'\n-C9EB8 Created OS            03 (3) 'Unix'\n-C9EB9 Extract Zip Spec      0A (10) '1.0'\n-C9EBA Extract OS            00 (0) 'MS-DOS'\n-C9EBB General Purpose Flag  0800 (2048)\n+CA4C0 CENTRAL HEADER #158   02014B50 (33639248)\n+CA4C4 Created Zip Spec      14 (20) '2.0'\n+CA4C5 Created OS            03 (3) 'Unix'\n+CA4C6 Extract Zip Spec      0A (10) '1.0'\n+CA4C7 Extract OS            00 (0) 'MS-DOS'\n+CA4C8 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C9EBD Compression Method    0000 (0) 'Stored'\n-C9EBF Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C9EC3 CRC                   00000000 (0)\n-C9EC7 Compressed Size       00000000 (0)\n-C9ECB Uncompressed Size     00000000 (0)\n-C9ECF Filename Length       0061 (97)\n-C9ED1 Extra Length          0000 (0)\n-C9ED3 Comment Length        0000 (0)\n-C9ED5 Disk Start            0000 (0)\n-C9ED7 Int File Attributes   0000 (0)\n+CA4CA Compression Method    0000 (0) 'Stored'\n+CA4CC Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CA4D0 CRC                   00000000 (0)\n+CA4D4 Compressed Size       00000000 (0)\n+CA4D8 Uncompressed Size     00000000 (0)\n+CA4DC Filename Length       0061 (97)\n+CA4DE Extra Length          0000 (0)\n+CA4E0 Comment Length        0000 (0)\n+CA4E2 Disk Start            0000 (0)\n+CA4E4 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C9ED9 Ext File Attributes   41ED0010 (1106051088)\n+CA4E6 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C9EDD Local Header Offset   0000441D (17437)\n-C9EE1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CA4EA Local Header Offset   0000441D (17437)\n+CA4EE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC9EE1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCA4EE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC9EE1: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xCA4EE: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC9EB9: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCA4C6: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C9F42 CENTRAL HEADER #159   02014B50 (33639248)\n-C9F46 Created Zip Spec      14 (20) '2.0'\n-C9F47 Created OS            03 (3) 'Unix'\n-C9F48 Extract Zip Spec      0A (10) '1.0'\n-C9F49 Extract OS            00 (0) 'MS-DOS'\n-C9F4A General Purpose Flag  0800 (2048)\n+CA54F CENTRAL HEADER #159   02014B50 (33639248)\n+CA553 Created Zip Spec      14 (20) '2.0'\n+CA554 Created OS            03 (3) 'Unix'\n+CA555 Extract Zip Spec      0A (10) '1.0'\n+CA556 Extract OS            00 (0) 'MS-DOS'\n+CA557 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C9F4C Compression Method    0000 (0) 'Stored'\n-C9F4E Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C9F52 CRC                   00000000 (0)\n-C9F56 Compressed Size       00000000 (0)\n-C9F5A Uncompressed Size     00000000 (0)\n-C9F5E Filename Length       0068 (104)\n-C9F60 Extra Length          0000 (0)\n-C9F62 Comment Length        0000 (0)\n-C9F64 Disk Start            0000 (0)\n-C9F66 Int File Attributes   0000 (0)\n+CA559 Compression Method    0000 (0) 'Stored'\n+CA55B Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CA55F CRC                   00000000 (0)\n+CA563 Compressed Size       00000000 (0)\n+CA567 Uncompressed Size     00000000 (0)\n+CA56B Filename Length       0068 (104)\n+CA56D Extra Length          0000 (0)\n+CA56F Comment Length        0000 (0)\n+CA571 Disk Start            0000 (0)\n+CA573 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C9F68 Ext File Attributes   41ED0010 (1106051088)\n+CA575 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-C9F6C Local Header Offset   0000449C (17564)\n-C9F70 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CA579 Local Header Offset   0000449C (17564)\n+CA57D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC9F70: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCA57D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xC9F70: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xCA57D: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC9F48: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCA555: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-C9FD8 CENTRAL HEADER #160   02014B50 (33639248)\n-C9FDC Created Zip Spec      14 (20) '2.0'\n-C9FDD Created OS            03 (3) 'Unix'\n-C9FDE Extract Zip Spec      0A (10) '1.0'\n-C9FDF Extract OS            00 (0) 'MS-DOS'\n-C9FE0 General Purpose Flag  0800 (2048)\n+CA5E5 CENTRAL HEADER #160   02014B50 (33639248)\n+CA5E9 Created Zip Spec      14 (20) '2.0'\n+CA5EA Created OS            03 (3) 'Unix'\n+CA5EB Extract Zip Spec      0A (10) '1.0'\n+CA5EC Extract OS            00 (0) 'MS-DOS'\n+CA5ED General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-C9FE2 Compression Method    0000 (0) 'Stored'\n-C9FE4 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-C9FE8 CRC                   00000000 (0)\n-C9FEC Compressed Size       00000000 (0)\n-C9FF0 Uncompressed Size     00000000 (0)\n-C9FF4 Filename Length       006B (107)\n-C9FF6 Extra Length          0000 (0)\n-C9FF8 Comment Length        0000 (0)\n-C9FFA Disk Start            0000 (0)\n-C9FFC Int File Attributes   0000 (0)\n+CA5EF Compression Method    0000 (0) 'Stored'\n+CA5F1 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CA5F5 CRC                   00000000 (0)\n+CA5F9 Compressed Size       00000000 (0)\n+CA5FD Uncompressed Size     00000000 (0)\n+CA601 Filename Length       006B (107)\n+CA603 Extra Length          0000 (0)\n+CA605 Comment Length        0000 (0)\n+CA607 Disk Start            0000 (0)\n+CA609 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-C9FFE Ext File Attributes   41ED0010 (1106051088)\n+CA60B Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-CA002 Local Header Offset   00004522 (17698)\n-CA006 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CA60F Local Header Offset   00004522 (17698)\n+CA613 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCA006: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCA613: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xCA006: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xCA613: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xC9FDE: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCA5EB: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-CA071 CENTRAL HEADER #161   02014B50 (33639248)\n-CA075 Created Zip Spec      14 (20) '2.0'\n-CA076 Created OS            03 (3) 'Unix'\n-CA077 Extract Zip Spec      0A (10) '1.0'\n-CA078 Extract OS            00 (0) 'MS-DOS'\n-CA079 General Purpose Flag  0800 (2048)\n+CA67E CENTRAL HEADER #161   02014B50 (33639248)\n+CA682 Created Zip Spec      14 (20) '2.0'\n+CA683 Created OS            03 (3) 'Unix'\n+CA684 Extract Zip Spec      0A (10) '1.0'\n+CA685 Extract OS            00 (0) 'MS-DOS'\n+CA686 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-CA07B Compression Method    0000 (0) 'Stored'\n-CA07D Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CA081 CRC                   00000000 (0)\n-CA085 Compressed Size       00000000 (0)\n-CA089 Uncompressed Size     00000000 (0)\n-CA08D Filename Length       006B (107)\n-CA08F Extra Length          0000 (0)\n-CA091 Comment Length        0000 (0)\n-CA093 Disk Start            0000 (0)\n-CA095 Int File Attributes   0000 (0)\n+CA688 Compression Method    0000 (0) 'Stored'\n+CA68A Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CA68E CRC                   00000000 (0)\n+CA692 Compressed Size       00000000 (0)\n+CA696 Uncompressed Size     00000000 (0)\n+CA69A Filename Length       006B (107)\n+CA69C Extra Length          0000 (0)\n+CA69E Comment Length        0000 (0)\n+CA6A0 Disk Start            0000 (0)\n+CA6A2 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CA097 Ext File Attributes   41ED0010 (1106051088)\n+CA6A4 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-CA09B Local Header Offset   000045AB (17835)\n-CA09F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CA6A8 Local Header Offset   000045AB (17835)\n+CA6AC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCA09F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCA6AC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xCA09F: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xCA6AC: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xCA077: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCA684: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-CA10A CENTRAL HEADER #162   02014B50 (33639248)\n-CA10E Created Zip Spec      14 (20) '2.0'\n-CA10F Created OS            03 (3) 'Unix'\n-CA110 Extract Zip Spec      0A (10) '1.0'\n-CA111 Extract OS            00 (0) 'MS-DOS'\n-CA112 General Purpose Flag  0800 (2048)\n+CA717 CENTRAL HEADER #162   02014B50 (33639248)\n+CA71B Created Zip Spec      14 (20) '2.0'\n+CA71C Created OS            03 (3) 'Unix'\n+CA71D Extract Zip Spec      0A (10) '1.0'\n+CA71E Extract OS            00 (0) 'MS-DOS'\n+CA71F General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-CA114 Compression Method    0000 (0) 'Stored'\n-CA116 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CA11A CRC                   00000000 (0)\n-CA11E Compressed Size       00000000 (0)\n-CA122 Uncompressed Size     00000000 (0)\n-CA126 Filename Length       006A (106)\n-CA128 Extra Length          0000 (0)\n-CA12A Comment Length        0000 (0)\n-CA12C Disk Start            0000 (0)\n-CA12E Int File Attributes   0000 (0)\n+CA721 Compression Method    0000 (0) 'Stored'\n+CA723 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CA727 CRC                   00000000 (0)\n+CA72B Compressed Size       00000000 (0)\n+CA72F Uncompressed Size     00000000 (0)\n+CA733 Filename Length       006A (106)\n+CA735 Extra Length          0000 (0)\n+CA737 Comment Length        0000 (0)\n+CA739 Disk Start            0000 (0)\n+CA73B Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CA130 Ext File Attributes   41ED0010 (1106051088)\n+CA73D Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-CA134 Local Header Offset   00004634 (17972)\n-CA138 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CA741 Local Header Offset   00004634 (17972)\n+CA745 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCA138: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCA745: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xCA138: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xCA745: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xCA110: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCA71D: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-CA1A2 CENTRAL HEADER #163   02014B50 (33639248)\n-CA1A6 Created Zip Spec      14 (20) '2.0'\n-CA1A7 Created OS            03 (3) 'Unix'\n-CA1A8 Extract Zip Spec      0A (10) '1.0'\n-CA1A9 Extract OS            00 (0) 'MS-DOS'\n-CA1AA General Purpose Flag  0800 (2048)\n+CA7AF CENTRAL HEADER #163   02014B50 (33639248)\n+CA7B3 Created Zip Spec      14 (20) '2.0'\n+CA7B4 Created OS            03 (3) 'Unix'\n+CA7B5 Extract Zip Spec      0A (10) '1.0'\n+CA7B6 Extract OS            00 (0) 'MS-DOS'\n+CA7B7 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-CA1AC Compression Method    0000 (0) 'Stored'\n-CA1AE Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CA1B2 CRC                   00000000 (0)\n-CA1B6 Compressed Size       00000000 (0)\n-CA1BA Uncompressed Size     00000000 (0)\n-CA1BE Filename Length       0026 (38)\n-CA1C0 Extra Length          0000 (0)\n-CA1C2 Comment Length        0000 (0)\n-CA1C4 Disk Start            0000 (0)\n-CA1C6 Int File Attributes   0000 (0)\n+CA7B9 Compression Method    0000 (0) 'Stored'\n+CA7BB Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CA7BF CRC                   00000000 (0)\n+CA7C3 Compressed Size       00000000 (0)\n+CA7C7 Uncompressed Size     00000000 (0)\n+CA7CB Filename Length       0026 (38)\n+CA7CD Extra Length          0000 (0)\n+CA7CF Comment Length        0000 (0)\n+CA7D1 Disk Start            0000 (0)\n+CA7D3 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CA1C8 Ext File Attributes   41ED0010 (1106051088)\n+CA7D5 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-CA1CC Local Header Offset   000046BC (18108)\n-CA1D0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CA7D9 Local Header Offset   000046BC (18108)\n+CA7DD Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCA1D0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCA7DD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xCA1D0: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xCA7DD: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xCA1A8: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCA7B5: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-CA1F6 CENTRAL HEADER #164   02014B50 (33639248)\n-CA1FA Created Zip Spec      14 (20) '2.0'\n-CA1FB Created OS            03 (3) 'Unix'\n-CA1FC Extract Zip Spec      0A (10) '1.0'\n-CA1FD Extract OS            00 (0) 'MS-DOS'\n-CA1FE General Purpose Flag  0800 (2048)\n+CA803 CENTRAL HEADER #164   02014B50 (33639248)\n+CA807 Created Zip Spec      14 (20) '2.0'\n+CA808 Created OS            03 (3) 'Unix'\n+CA809 Extract Zip Spec      0A (10) '1.0'\n+CA80A Extract OS            00 (0) 'MS-DOS'\n+CA80B General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-CA200 Compression Method    0000 (0) 'Stored'\n-CA202 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CA206 CRC                   00000000 (0)\n-CA20A Compressed Size       00000000 (0)\n-CA20E Uncompressed Size     00000000 (0)\n-CA212 Filename Length       002F (47)\n-CA214 Extra Length          0000 (0)\n-CA216 Comment Length        0000 (0)\n-CA218 Disk Start            0000 (0)\n-CA21A Int File Attributes   0000 (0)\n+CA80D Compression Method    0000 (0) 'Stored'\n+CA80F Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CA813 CRC                   00000000 (0)\n+CA817 Compressed Size       00000000 (0)\n+CA81B Uncompressed Size     00000000 (0)\n+CA81F Filename Length       002F (47)\n+CA821 Extra Length          0000 (0)\n+CA823 Comment Length        0000 (0)\n+CA825 Disk Start            0000 (0)\n+CA827 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CA21C Ext File Attributes   41ED0010 (1106051088)\n+CA829 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-CA220 Local Header Offset   00004700 (18176)\n-CA224 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CA82D Local Header Offset   00004700 (18176)\n+CA831 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCA224: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCA831: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xCA224: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xCA831: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xCA1FC: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCA809: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-CA253 CENTRAL HEADER #165   02014B50 (33639248)\n-CA257 Created Zip Spec      14 (20) '2.0'\n-CA258 Created OS            03 (3) 'Unix'\n-CA259 Extract Zip Spec      0A (10) '1.0'\n-CA25A Extract OS            00 (0) 'MS-DOS'\n-CA25B General Purpose Flag  0800 (2048)\n+CA860 CENTRAL HEADER #165   02014B50 (33639248)\n+CA864 Created Zip Spec      14 (20) '2.0'\n+CA865 Created OS            03 (3) 'Unix'\n+CA866 Extract Zip Spec      0A (10) '1.0'\n+CA867 Extract OS            00 (0) 'MS-DOS'\n+CA868 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-CA25D Compression Method    0000 (0) 'Stored'\n-CA25F Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CA263 CRC                   00000000 (0)\n-CA267 Compressed Size       00000000 (0)\n-CA26B Uncompressed Size     00000000 (0)\n-CA26F Filename Length       005D (93)\n-CA271 Extra Length          0000 (0)\n-CA273 Comment Length        0000 (0)\n-CA275 Disk Start            0000 (0)\n-CA277 Int File Attributes   0000 (0)\n+CA86A Compression Method    0000 (0) 'Stored'\n+CA86C Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CA870 CRC                   00000000 (0)\n+CA874 Compressed Size       00000000 (0)\n+CA878 Uncompressed Size     00000000 (0)\n+CA87C Filename Length       005D (93)\n+CA87E Extra Length          0000 (0)\n+CA880 Comment Length        0000 (0)\n+CA882 Disk Start            0000 (0)\n+CA884 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CA279 Ext File Attributes   41ED0010 (1106051088)\n+CA886 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-CA27D Local Header Offset   0000474D (18253)\n-CA281 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CA88A Local Header Offset   0000474D (18253)\n+CA88E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCA281: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCA88E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xCA281: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xCA88E: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xCA259: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCA866: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-CA2DE CENTRAL HEADER #166   02014B50 (33639248)\n-CA2E2 Created Zip Spec      14 (20) '2.0'\n-CA2E3 Created OS            03 (3) 'Unix'\n-CA2E4 Extract Zip Spec      0A (10) '1.0'\n-CA2E5 Extract OS            00 (0) 'MS-DOS'\n-CA2E6 General Purpose Flag  0800 (2048)\n+CA8EB CENTRAL HEADER #166   02014B50 (33639248)\n+CA8EF Created Zip Spec      14 (20) '2.0'\n+CA8F0 Created OS            03 (3) 'Unix'\n+CA8F1 Extract Zip Spec      0A (10) '1.0'\n+CA8F2 Extract OS            00 (0) 'MS-DOS'\n+CA8F3 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-CA2E8 Compression Method    0000 (0) 'Stored'\n-CA2EA Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CA2EE CRC                   00000000 (0)\n-CA2F2 Compressed Size       00000000 (0)\n-CA2F6 Uncompressed Size     00000000 (0)\n-CA2FA Filename Length       0035 (53)\n-CA2FC Extra Length          0000 (0)\n-CA2FE Comment Length        0000 (0)\n-CA300 Disk Start            0000 (0)\n-CA302 Int File Attributes   0000 (0)\n+CA8F5 Compression Method    0000 (0) 'Stored'\n+CA8F7 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CA8FB CRC                   00000000 (0)\n+CA8FF Compressed Size       00000000 (0)\n+CA903 Uncompressed Size     00000000 (0)\n+CA907 Filename Length       0035 (53)\n+CA909 Extra Length          0000 (0)\n+CA90B Comment Length        0000 (0)\n+CA90D Disk Start            0000 (0)\n+CA90F Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CA304 Ext File Attributes   41ED0010 (1106051088)\n+CA911 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-CA308 Local Header Offset   000047C8 (18376)\n-CA30C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CA915 Local Header Offset   000047C8 (18376)\n+CA919 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCA30C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCA919: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xCA30C: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xCA919: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xCA2E4: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCA8F1: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-CA341 CENTRAL HEADER #167   02014B50 (33639248)\n-CA345 Created Zip Spec      14 (20) '2.0'\n-CA346 Created OS            03 (3) 'Unix'\n-CA347 Extract Zip Spec      0A (10) '1.0'\n-CA348 Extract OS            00 (0) 'MS-DOS'\n-CA349 General Purpose Flag  0800 (2048)\n+CA94E CENTRAL HEADER #167   02014B50 (33639248)\n+CA952 Created Zip Spec      14 (20) '2.0'\n+CA953 Created OS            03 (3) 'Unix'\n+CA954 Extract Zip Spec      0A (10) '1.0'\n+CA955 Extract OS            00 (0) 'MS-DOS'\n+CA956 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-CA34B Compression Method    0000 (0) 'Stored'\n-CA34D Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CA351 CRC                   00000000 (0)\n-CA355 Compressed Size       00000000 (0)\n-CA359 Uncompressed Size     00000000 (0)\n-CA35D Filename Length       003E (62)\n-CA35F Extra Length          0000 (0)\n-CA361 Comment Length        0000 (0)\n-CA363 Disk Start            0000 (0)\n-CA365 Int File Attributes   0000 (0)\n+CA958 Compression Method    0000 (0) 'Stored'\n+CA95A Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CA95E CRC                   00000000 (0)\n+CA962 Compressed Size       00000000 (0)\n+CA966 Uncompressed Size     00000000 (0)\n+CA96A Filename Length       003E (62)\n+CA96C Extra Length          0000 (0)\n+CA96E Comment Length        0000 (0)\n+CA970 Disk Start            0000 (0)\n+CA972 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CA367 Ext File Attributes   41ED0010 (1106051088)\n+CA974 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-CA36B Local Header Offset   0000481B (18459)\n-CA36F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CA978 Local Header Offset   0000481B (18459)\n+CA97C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCA36F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCA97C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xCA36F: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xCA97C: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xCA347: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCA954: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-CA3AD CENTRAL HEADER #168   02014B50 (33639248)\n-CA3B1 Created Zip Spec      14 (20) '2.0'\n-CA3B2 Created OS            03 (3) 'Unix'\n-CA3B3 Extract Zip Spec      0A (10) '1.0'\n-CA3B4 Extract OS            00 (0) 'MS-DOS'\n-CA3B5 General Purpose Flag  0800 (2048)\n+CA9BA CENTRAL HEADER #168   02014B50 (33639248)\n+CA9BE Created Zip Spec      14 (20) '2.0'\n+CA9BF Created OS            03 (3) 'Unix'\n+CA9C0 Extract Zip Spec      0A (10) '1.0'\n+CA9C1 Extract OS            00 (0) 'MS-DOS'\n+CA9C2 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-CA3B7 Compression Method    0000 (0) 'Stored'\n-CA3B9 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CA3BD CRC                   00000000 (0)\n-CA3C1 Compressed Size       00000000 (0)\n-CA3C5 Uncompressed Size     00000000 (0)\n-CA3C9 Filename Length       0078 (120)\n-CA3CB Extra Length          0000 (0)\n-CA3CD Comment Length        0000 (0)\n-CA3CF Disk Start            0000 (0)\n-CA3D1 Int File Attributes   0000 (0)\n+CA9C4 Compression Method    0000 (0) 'Stored'\n+CA9C6 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CA9CA CRC                   00000000 (0)\n+CA9CE Compressed Size       00000000 (0)\n+CA9D2 Uncompressed Size     00000000 (0)\n+CA9D6 Filename Length       0078 (120)\n+CA9D8 Extra Length          0000 (0)\n+CA9DA Comment Length        0000 (0)\n+CA9DC Disk Start            0000 (0)\n+CA9DE Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CA3D3 Ext File Attributes   41ED0010 (1106051088)\n+CA9E0 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-CA3D7 Local Header Offset   00004877 (18551)\n-CA3DB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CA9E4 Local Header Offset   00004877 (18551)\n+CA9E8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCA3DB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCA9E8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xCA3DB: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xCA9E8: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xCA3B3: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCA9C0: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-CA453 CENTRAL HEADER #169   02014B50 (33639248)\n-CA457 Created Zip Spec      14 (20) '2.0'\n-CA458 Created OS            03 (3) 'Unix'\n-CA459 Extract Zip Spec      0A (10) '1.0'\n-CA45A Extract OS            00 (0) 'MS-DOS'\n-CA45B General Purpose Flag  0800 (2048)\n+CAA60 CENTRAL HEADER #169   02014B50 (33639248)\n+CAA64 Created Zip Spec      14 (20) '2.0'\n+CAA65 Created OS            03 (3) 'Unix'\n+CAA66 Extract Zip Spec      0A (10) '1.0'\n+CAA67 Extract OS            00 (0) 'MS-DOS'\n+CAA68 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-CA45D Compression Method    0000 (0) 'Stored'\n-CA45F Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CA463 CRC                   00000000 (0)\n-CA467 Compressed Size       00000000 (0)\n-CA46B Uncompressed Size     00000000 (0)\n-CA46F Filename Length       0077 (119)\n-CA471 Extra Length          0000 (0)\n-CA473 Comment Length        0000 (0)\n-CA475 Disk Start            0000 (0)\n-CA477 Int File Attributes   0000 (0)\n+CAA6A Compression Method    0000 (0) 'Stored'\n+CAA6C Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CAA70 CRC                   00000000 (0)\n+CAA74 Compressed Size       00000000 (0)\n+CAA78 Uncompressed Size     00000000 (0)\n+CAA7C Filename Length       0077 (119)\n+CAA7E Extra Length          0000 (0)\n+CAA80 Comment Length        0000 (0)\n+CAA82 Disk Start            0000 (0)\n+CAA84 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CA479 Ext File Attributes   41ED0010 (1106051088)\n+CAA86 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-CA47D Local Header Offset   0000490D (18701)\n-CA481 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CAA8A Local Header Offset   0000490D (18701)\n+CAA8E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCA481: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCAA8E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xCA481: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xCAA8E: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xCA459: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCAA66: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-CA4F8 CENTRAL HEADER #170   02014B50 (33639248)\n-CA4FC Created Zip Spec      14 (20) '2.0'\n-CA4FD Created OS            03 (3) 'Unix'\n-CA4FE Extract Zip Spec      0A (10) '1.0'\n-CA4FF Extract OS            00 (0) 'MS-DOS'\n-CA500 General Purpose Flag  0800 (2048)\n+CAB05 CENTRAL HEADER #170   02014B50 (33639248)\n+CAB09 Created Zip Spec      14 (20) '2.0'\n+CAB0A Created OS            03 (3) 'Unix'\n+CAB0B Extract Zip Spec      0A (10) '1.0'\n+CAB0C Extract OS            00 (0) 'MS-DOS'\n+CAB0D General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-CA502 Compression Method    0000 (0) 'Stored'\n-CA504 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CA508 CRC                   00000000 (0)\n-CA50C Compressed Size       00000000 (0)\n-CA510 Uncompressed Size     00000000 (0)\n-CA514 Filename Length       007A (122)\n-CA516 Extra Length          0000 (0)\n-CA518 Comment Length        0000 (0)\n-CA51A Disk Start            0000 (0)\n-CA51C Int File Attributes   0000 (0)\n+CAB0F Compression Method    0000 (0) 'Stored'\n+CAB11 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CAB15 CRC                   00000000 (0)\n+CAB19 Compressed Size       00000000 (0)\n+CAB1D Uncompressed Size     00000000 (0)\n+CAB21 Filename Length       007A (122)\n+CAB23 Extra Length          0000 (0)\n+CAB25 Comment Length        0000 (0)\n+CAB27 Disk Start            0000 (0)\n+CAB29 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CA51E Ext File Attributes   41ED0010 (1106051088)\n+CAB2B Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-CA522 Local Header Offset   000049A2 (18850)\n-CA526 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CAB2F Local Header Offset   000049A2 (18850)\n+CAB33 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCA526: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCAB33: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xCA526: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xCAB33: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xCA4FE: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCAB0B: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-CA5A0 CENTRAL HEADER #171   02014B50 (33639248)\n-CA5A4 Created Zip Spec      14 (20) '2.0'\n-CA5A5 Created OS            03 (3) 'Unix'\n-CA5A6 Extract Zip Spec      0A (10) '1.0'\n-CA5A7 Extract OS            00 (0) 'MS-DOS'\n-CA5A8 General Purpose Flag  0800 (2048)\n+CABAD CENTRAL HEADER #171   02014B50 (33639248)\n+CABB1 Created Zip Spec      14 (20) '2.0'\n+CABB2 Created OS            03 (3) 'Unix'\n+CABB3 Extract Zip Spec      0A (10) '1.0'\n+CABB4 Extract OS            00 (0) 'MS-DOS'\n+CABB5 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-CA5AA Compression Method    0000 (0) 'Stored'\n-CA5AC Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CA5B0 CRC                   00000000 (0)\n-CA5B4 Compressed Size       00000000 (0)\n-CA5B8 Uncompressed Size     00000000 (0)\n-CA5BC Filename Length       0076 (118)\n-CA5BE Extra Length          0000 (0)\n-CA5C0 Comment Length        0000 (0)\n-CA5C2 Disk Start            0000 (0)\n-CA5C4 Int File Attributes   0000 (0)\n+CABB7 Compression Method    0000 (0) 'Stored'\n+CABB9 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CABBD CRC                   00000000 (0)\n+CABC1 Compressed Size       00000000 (0)\n+CABC5 Uncompressed Size     00000000 (0)\n+CABC9 Filename Length       0076 (118)\n+CABCB Extra Length          0000 (0)\n+CABCD Comment Length        0000 (0)\n+CABCF Disk Start            0000 (0)\n+CABD1 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CA5C6 Ext File Attributes   41ED0010 (1106051088)\n+CABD3 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-CA5CA Local Header Offset   00004A3A (19002)\n-CA5CE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CABD7 Local Header Offset   00004A3A (19002)\n+CABDB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCA5CE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCABDB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xCA5CE: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xCABDB: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xCA5A6: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCABB3: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-CA644 CENTRAL HEADER #172   02014B50 (33639248)\n-CA648 Created Zip Spec      14 (20) '2.0'\n-CA649 Created OS            03 (3) 'Unix'\n-CA64A Extract Zip Spec      0A (10) '1.0'\n-CA64B Extract OS            00 (0) 'MS-DOS'\n-CA64C General Purpose Flag  0800 (2048)\n+CAC51 CENTRAL HEADER #172   02014B50 (33639248)\n+CAC55 Created Zip Spec      14 (20) '2.0'\n+CAC56 Created OS            03 (3) 'Unix'\n+CAC57 Extract Zip Spec      0A (10) '1.0'\n+CAC58 Extract OS            00 (0) 'MS-DOS'\n+CAC59 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-CA64E Compression Method    0000 (0) 'Stored'\n-CA650 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CA654 CRC                   00000000 (0)\n-CA658 Compressed Size       00000000 (0)\n-CA65C Uncompressed Size     00000000 (0)\n-CA660 Filename Length       0024 (36)\n-CA662 Extra Length          0000 (0)\n-CA664 Comment Length        0000 (0)\n-CA666 Disk Start            0000 (0)\n-CA668 Int File Attributes   0000 (0)\n+CAC5B Compression Method    0000 (0) 'Stored'\n+CAC5D Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CAC61 CRC                   00000000 (0)\n+CAC65 Compressed Size       00000000 (0)\n+CAC69 Uncompressed Size     00000000 (0)\n+CAC6D Filename Length       0024 (36)\n+CAC6F Extra Length          0000 (0)\n+CAC71 Comment Length        0000 (0)\n+CAC73 Disk Start            0000 (0)\n+CAC75 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CA66A Ext File Attributes   41ED0010 (1106051088)\n+CAC77 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-CA66E Local Header Offset   00004ACE (19150)\n-CA672 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CAC7B Local Header Offset   00004ACE (19150)\n+CAC7F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCA672: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCAC7F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xCA672: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xCAC7F: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xCA64A: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCAC57: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-CA696 CENTRAL HEADER #173   02014B50 (33639248)\n-CA69A Created Zip Spec      14 (20) '2.0'\n-CA69B Created OS            03 (3) 'Unix'\n-CA69C Extract Zip Spec      0A (10) '1.0'\n-CA69D Extract OS            00 (0) 'MS-DOS'\n-CA69E General Purpose Flag  0800 (2048)\n+CACA3 CENTRAL HEADER #173   02014B50 (33639248)\n+CACA7 Created Zip Spec      14 (20) '2.0'\n+CACA8 Created OS            03 (3) 'Unix'\n+CACA9 Extract Zip Spec      0A (10) '1.0'\n+CACAA Extract OS            00 (0) 'MS-DOS'\n+CACAB General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-CA6A0 Compression Method    0000 (0) 'Stored'\n-CA6A2 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CA6A6 CRC                   00000000 (0)\n-CA6AA Compressed Size       00000000 (0)\n-CA6AE Uncompressed Size     00000000 (0)\n-CA6B2 Filename Length       002D (45)\n-CA6B4 Extra Length          0000 (0)\n-CA6B6 Comment Length        0000 (0)\n-CA6B8 Disk Start            0000 (0)\n-CA6BA Int File Attributes   0000 (0)\n+CACAD Compression Method    0000 (0) 'Stored'\n+CACAF Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CACB3 CRC                   00000000 (0)\n+CACB7 Compressed Size       00000000 (0)\n+CACBB Uncompressed Size     00000000 (0)\n+CACBF Filename Length       002D (45)\n+CACC1 Extra Length          0000 (0)\n+CACC3 Comment Length        0000 (0)\n+CACC5 Disk Start            0000 (0)\n+CACC7 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CA6BC Ext File Attributes   41ED0010 (1106051088)\n+CACC9 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-CA6C0 Local Header Offset   00004B10 (19216)\n-CA6C4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CACCD Local Header Offset   00004B10 (19216)\n+CACD1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCA6C4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCACD1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xCA6C4: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xCACD1: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xCA69C: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCACA9: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-CA6F1 CENTRAL HEADER #174   02014B50 (33639248)\n-CA6F5 Created Zip Spec      14 (20) '2.0'\n-CA6F6 Created OS            03 (3) 'Unix'\n-CA6F7 Extract Zip Spec      0A (10) '1.0'\n-CA6F8 Extract OS            00 (0) 'MS-DOS'\n-CA6F9 General Purpose Flag  0800 (2048)\n+CACFE CENTRAL HEADER #174   02014B50 (33639248)\n+CAD02 Created Zip Spec      14 (20) '2.0'\n+CAD03 Created OS            03 (3) 'Unix'\n+CAD04 Extract Zip Spec      0A (10) '1.0'\n+CAD05 Extract OS            00 (0) 'MS-DOS'\n+CAD06 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-CA6FB Compression Method    0000 (0) 'Stored'\n-CA6FD Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CA701 CRC                   00000000 (0)\n-CA705 Compressed Size       00000000 (0)\n-CA709 Uncompressed Size     00000000 (0)\n-CA70D Filename Length       005B (91)\n-CA70F Extra Length          0000 (0)\n-CA711 Comment Length        0000 (0)\n-CA713 Disk Start            0000 (0)\n-CA715 Int File Attributes   0000 (0)\n+CAD08 Compression Method    0000 (0) 'Stored'\n+CAD0A Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CAD0E CRC                   00000000 (0)\n+CAD12 Compressed Size       00000000 (0)\n+CAD16 Uncompressed Size     00000000 (0)\n+CAD1A Filename Length       005B (91)\n+CAD1C Extra Length          0000 (0)\n+CAD1E Comment Length        0000 (0)\n+CAD20 Disk Start            0000 (0)\n+CAD22 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CA717 Ext File Attributes   41ED0010 (1106051088)\n+CAD24 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-CA71B Local Header Offset   00004B5B (19291)\n-CA71F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CAD28 Local Header Offset   00004B5B (19291)\n+CAD2C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCA71F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCAD2C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xCA71F: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xCAD2C: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xCA6F7: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCAD04: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-CA77A CENTRAL HEADER #175   02014B50 (33639248)\n-CA77E Created Zip Spec      14 (20) '2.0'\n-CA77F Created OS            03 (3) 'Unix'\n-CA780 Extract Zip Spec      0A (10) '1.0'\n-CA781 Extract OS            00 (0) 'MS-DOS'\n-CA782 General Purpose Flag  0800 (2048)\n+CAD87 CENTRAL HEADER #175   02014B50 (33639248)\n+CAD8B Created Zip Spec      14 (20) '2.0'\n+CAD8C Created OS            03 (3) 'Unix'\n+CAD8D Extract Zip Spec      0A (10) '1.0'\n+CAD8E Extract OS            00 (0) 'MS-DOS'\n+CAD8F General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-CA784 Compression Method    0000 (0) 'Stored'\n-CA786 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CA78A CRC                   00000000 (0)\n-CA78E Compressed Size       00000000 (0)\n-CA792 Uncompressed Size     00000000 (0)\n-CA796 Filename Length       005A (90)\n-CA798 Extra Length          0000 (0)\n-CA79A Comment Length        0000 (0)\n-CA79C Disk Start            0000 (0)\n-CA79E Int File Attributes   0000 (0)\n+CAD91 Compression Method    0000 (0) 'Stored'\n+CAD93 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CAD97 CRC                   00000000 (0)\n+CAD9B Compressed Size       00000000 (0)\n+CAD9F Uncompressed Size     00000000 (0)\n+CADA3 Filename Length       005A (90)\n+CADA5 Extra Length          0000 (0)\n+CADA7 Comment Length        0000 (0)\n+CADA9 Disk Start            0000 (0)\n+CADAB Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CA7A0 Ext File Attributes   41ED0010 (1106051088)\n+CADAD Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-CA7A4 Local Header Offset   00004BD4 (19412)\n-CA7A8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CADB1 Local Header Offset   00004BD4 (19412)\n+CADB5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCA7A8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCADB5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xCA7A8: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xCADB5: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xCA780: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCAD8D: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-CA802 CENTRAL HEADER #176   02014B50 (33639248)\n-CA806 Created Zip Spec      14 (20) '2.0'\n-CA807 Created OS            03 (3) 'Unix'\n-CA808 Extract Zip Spec      0A (10) '1.0'\n-CA809 Extract OS            00 (0) 'MS-DOS'\n-CA80A General Purpose Flag  0800 (2048)\n+CAE0F CENTRAL HEADER #176   02014B50 (33639248)\n+CAE13 Created Zip Spec      14 (20) '2.0'\n+CAE14 Created OS            03 (3) 'Unix'\n+CAE15 Extract Zip Spec      0A (10) '1.0'\n+CAE16 Extract OS            00 (0) 'MS-DOS'\n+CAE17 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-CA80C Compression Method    0000 (0) 'Stored'\n-CA80E Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CA812 CRC                   00000000 (0)\n-CA816 Compressed Size       00000000 (0)\n-CA81A Uncompressed Size     00000000 (0)\n-CA81E Filename Length       005B (91)\n-CA820 Extra Length          0000 (0)\n-CA822 Comment Length        0000 (0)\n-CA824 Disk Start            0000 (0)\n-CA826 Int File Attributes   0000 (0)\n+CAE19 Compression Method    0000 (0) 'Stored'\n+CAE1B Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CAE1F CRC                   00000000 (0)\n+CAE23 Compressed Size       00000000 (0)\n+CAE27 Uncompressed Size     00000000 (0)\n+CAE2B Filename Length       005B (91)\n+CAE2D Extra Length          0000 (0)\n+CAE2F Comment Length        0000 (0)\n+CAE31 Disk Start            0000 (0)\n+CAE33 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CA828 Ext File Attributes   41ED0010 (1106051088)\n+CAE35 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-CA82C Local Header Offset   00004C4C (19532)\n-CA830 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CAE39 Local Header Offset   00004C4C (19532)\n+CAE3D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCA830: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCAE3D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xCA830: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xCAE3D: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xCA808: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCAE15: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-CA88B CENTRAL HEADER #177   02014B50 (33639248)\n-CA88F Created Zip Spec      14 (20) '2.0'\n-CA890 Created OS            03 (3) 'Unix'\n-CA891 Extract Zip Spec      0A (10) '1.0'\n-CA892 Extract OS            00 (0) 'MS-DOS'\n-CA893 General Purpose Flag  0800 (2048)\n+CAE98 CENTRAL HEADER #177   02014B50 (33639248)\n+CAE9C Created Zip Spec      14 (20) '2.0'\n+CAE9D Created OS            03 (3) 'Unix'\n+CAE9E Extract Zip Spec      0A (10) '1.0'\n+CAE9F Extract OS            00 (0) 'MS-DOS'\n+CAEA0 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-CA895 Compression Method    0000 (0) 'Stored'\n-CA897 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CA89B CRC                   00000000 (0)\n-CA89F Compressed Size       00000000 (0)\n-CA8A3 Uncompressed Size     00000000 (0)\n-CA8A7 Filename Length       0023 (35)\n-CA8A9 Extra Length          0000 (0)\n-CA8AB Comment Length        0000 (0)\n-CA8AD Disk Start            0000 (0)\n-CA8AF Int File Attributes   0000 (0)\n+CAEA2 Compression Method    0000 (0) 'Stored'\n+CAEA4 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CAEA8 CRC                   00000000 (0)\n+CAEAC Compressed Size       00000000 (0)\n+CAEB0 Uncompressed Size     00000000 (0)\n+CAEB4 Filename Length       0023 (35)\n+CAEB6 Extra Length          0000 (0)\n+CAEB8 Comment Length        0000 (0)\n+CAEBA Disk Start            0000 (0)\n+CAEBC Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CA8B1 Ext File Attributes   41ED0010 (1106051088)\n+CAEBE Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-CA8B5 Local Header Offset   00004CC5 (19653)\n-CA8B9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CAEC2 Local Header Offset   00004CC5 (19653)\n+CAEC6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCA8B9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCAEC6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xCA8B9: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xCAEC6: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xCA891: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCAE9E: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-CA8DC CENTRAL HEADER #178   02014B50 (33639248)\n-CA8E0 Created Zip Spec      14 (20) '2.0'\n-CA8E1 Created OS            03 (3) 'Unix'\n-CA8E2 Extract Zip Spec      0A (10) '1.0'\n-CA8E3 Extract OS            00 (0) 'MS-DOS'\n-CA8E4 General Purpose Flag  0800 (2048)\n+CAEE9 CENTRAL HEADER #178   02014B50 (33639248)\n+CAEED Created Zip Spec      14 (20) '2.0'\n+CAEEE Created OS            03 (3) 'Unix'\n+CAEEF Extract Zip Spec      0A (10) '1.0'\n+CAEF0 Extract OS            00 (0) 'MS-DOS'\n+CAEF1 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-CA8E6 Compression Method    0000 (0) 'Stored'\n-CA8E8 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CA8EC CRC                   00000000 (0)\n-CA8F0 Compressed Size       00000000 (0)\n-CA8F4 Uncompressed Size     00000000 (0)\n-CA8F8 Filename Length       002C (44)\n-CA8FA Extra Length          0000 (0)\n-CA8FC Comment Length        0000 (0)\n-CA8FE Disk Start            0000 (0)\n-CA900 Int File Attributes   0000 (0)\n+CAEF3 Compression Method    0000 (0) 'Stored'\n+CAEF5 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CAEF9 CRC                   00000000 (0)\n+CAEFD Compressed Size       00000000 (0)\n+CAF01 Uncompressed Size     00000000 (0)\n+CAF05 Filename Length       002C (44)\n+CAF07 Extra Length          0000 (0)\n+CAF09 Comment Length        0000 (0)\n+CAF0B Disk Start            0000 (0)\n+CAF0D Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CA902 Ext File Attributes   41ED0010 (1106051088)\n+CAF0F Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-CA906 Local Header Offset   00004D06 (19718)\n-CA90A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CAF13 Local Header Offset   00004D06 (19718)\n+CAF17 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCA90A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCAF17: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xCA90A: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xCAF17: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xCA8E2: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCAEEF: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-CA936 CENTRAL HEADER #179   02014B50 (33639248)\n-CA93A Created Zip Spec      14 (20) '2.0'\n-CA93B Created OS            03 (3) 'Unix'\n-CA93C Extract Zip Spec      0A (10) '1.0'\n-CA93D Extract OS            00 (0) 'MS-DOS'\n-CA93E General Purpose Flag  0800 (2048)\n+CAF43 CENTRAL HEADER #179   02014B50 (33639248)\n+CAF47 Created Zip Spec      14 (20) '2.0'\n+CAF48 Created OS            03 (3) 'Unix'\n+CAF49 Extract Zip Spec      0A (10) '1.0'\n+CAF4A Extract OS            00 (0) 'MS-DOS'\n+CAF4B General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-CA940 Compression Method    0000 (0) 'Stored'\n-CA942 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CA946 CRC                   00000000 (0)\n-CA94A Compressed Size       00000000 (0)\n-CA94E Uncompressed Size     00000000 (0)\n-CA952 Filename Length       0054 (84)\n-CA954 Extra Length          0000 (0)\n-CA956 Comment Length        0000 (0)\n-CA958 Disk Start            0000 (0)\n-CA95A Int File Attributes   0000 (0)\n+CAF4D Compression Method    0000 (0) 'Stored'\n+CAF4F Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CAF53 CRC                   00000000 (0)\n+CAF57 Compressed Size       00000000 (0)\n+CAF5B Uncompressed Size     00000000 (0)\n+CAF5F Filename Length       0054 (84)\n+CAF61 Extra Length          0000 (0)\n+CAF63 Comment Length        0000 (0)\n+CAF65 Disk Start            0000 (0)\n+CAF67 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CA95C Ext File Attributes   41ED0010 (1106051088)\n+CAF69 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-CA960 Local Header Offset   00004D50 (19792)\n-CA964 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CAF6D Local Header Offset   00004D50 (19792)\n+CAF71 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCA964: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCAF71: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xCA964: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xCAF71: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xCA93C: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCAF49: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-CA9B8 CENTRAL HEADER #180   02014B50 (33639248)\n-CA9BC Created Zip Spec      14 (20) '2.0'\n-CA9BD Created OS            03 (3) 'Unix'\n-CA9BE Extract Zip Spec      0A (10) '1.0'\n-CA9BF Extract OS            00 (0) 'MS-DOS'\n-CA9C0 General Purpose Flag  0800 (2048)\n+CAFC5 CENTRAL HEADER #180   02014B50 (33639248)\n+CAFC9 Created Zip Spec      14 (20) '2.0'\n+CAFCA Created OS            03 (3) 'Unix'\n+CAFCB Extract Zip Spec      0A (10) '1.0'\n+CAFCC Extract OS            00 (0) 'MS-DOS'\n+CAFCD General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-CA9C2 Compression Method    0000 (0) 'Stored'\n-CA9C4 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CA9C8 CRC                   00000000 (0)\n-CA9CC Compressed Size       00000000 (0)\n-CA9D0 Uncompressed Size     00000000 (0)\n-CA9D4 Filename Length       005B (91)\n-CA9D6 Extra Length          0000 (0)\n-CA9D8 Comment Length        0000 (0)\n-CA9DA Disk Start            0000 (0)\n-CA9DC Int File Attributes   0000 (0)\n+CAFCF Compression Method    0000 (0) 'Stored'\n+CAFD1 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CAFD5 CRC                   00000000 (0)\n+CAFD9 Compressed Size       00000000 (0)\n+CAFDD Uncompressed Size     00000000 (0)\n+CAFE1 Filename Length       005B (91)\n+CAFE3 Extra Length          0000 (0)\n+CAFE5 Comment Length        0000 (0)\n+CAFE7 Disk Start            0000 (0)\n+CAFE9 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CA9DE Ext File Attributes   41ED0010 (1106051088)\n+CAFEB Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-CA9E2 Local Header Offset   00004DC2 (19906)\n-CA9E6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CAFEF Local Header Offset   00004DC2 (19906)\n+CAFF3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCA9E6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCAFF3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xCA9E6: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xCAFF3: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xCA9BE: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCAFCB: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-CAA41 CENTRAL HEADER #181   02014B50 (33639248)\n-CAA45 Created Zip Spec      14 (20) '2.0'\n-CAA46 Created OS            03 (3) 'Unix'\n-CAA47 Extract Zip Spec      0A (10) '1.0'\n-CAA48 Extract OS            00 (0) 'MS-DOS'\n-CAA49 General Purpose Flag  0800 (2048)\n+CB04E CENTRAL HEADER #181   02014B50 (33639248)\n+CB052 Created Zip Spec      14 (20) '2.0'\n+CB053 Created OS            03 (3) 'Unix'\n+CB054 Extract Zip Spec      0A (10) '1.0'\n+CB055 Extract OS            00 (0) 'MS-DOS'\n+CB056 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-CAA4B Compression Method    0000 (0) 'Stored'\n-CAA4D Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CAA51 CRC                   00000000 (0)\n-CAA55 Compressed Size       00000000 (0)\n-CAA59 Uncompressed Size     00000000 (0)\n-CAA5D Filename Length       0059 (89)\n-CAA5F Extra Length          0000 (0)\n-CAA61 Comment Length        0000 (0)\n-CAA63 Disk Start            0000 (0)\n-CAA65 Int File Attributes   0000 (0)\n+CB058 Compression Method    0000 (0) 'Stored'\n+CB05A Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CB05E CRC                   00000000 (0)\n+CB062 Compressed Size       00000000 (0)\n+CB066 Uncompressed Size     00000000 (0)\n+CB06A Filename Length       0059 (89)\n+CB06C Extra Length          0000 (0)\n+CB06E Comment Length        0000 (0)\n+CB070 Disk Start            0000 (0)\n+CB072 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CAA67 Ext File Attributes   41ED0010 (1106051088)\n+CB074 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-CAA6B Local Header Offset   00004E3B (20027)\n-CAA6F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CB078 Local Header Offset   00004E3B (20027)\n+CB07C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCAA6F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCB07C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xCAA6F: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xCB07C: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xCAA47: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCB054: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-CAAC8 CENTRAL HEADER #182   02014B50 (33639248)\n-CAACC Created Zip Spec      14 (20) '2.0'\n-CAACD Created OS            03 (3) 'Unix'\n-CAACE Extract Zip Spec      0A (10) '1.0'\n-CAACF Extract OS            00 (0) 'MS-DOS'\n-CAAD0 General Purpose Flag  0800 (2048)\n+CB0D5 CENTRAL HEADER #182   02014B50 (33639248)\n+CB0D9 Created Zip Spec      14 (20) '2.0'\n+CB0DA Created OS            03 (3) 'Unix'\n+CB0DB Extract Zip Spec      0A (10) '1.0'\n+CB0DC Extract OS            00 (0) 'MS-DOS'\n+CB0DD General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-CAAD2 Compression Method    0000 (0) 'Stored'\n-CAAD4 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CAAD8 CRC                   00000000 (0)\n-CAADC Compressed Size       00000000 (0)\n-CAAE0 Uncompressed Size     00000000 (0)\n-CAAE4 Filename Length       0054 (84)\n-CAAE6 Extra Length          0000 (0)\n-CAAE8 Comment Length        0000 (0)\n-CAAEA Disk Start            0000 (0)\n-CAAEC Int File Attributes   0000 (0)\n+CB0DF Compression Method    0000 (0) 'Stored'\n+CB0E1 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CB0E5 CRC                   00000000 (0)\n+CB0E9 Compressed Size       00000000 (0)\n+CB0ED Uncompressed Size     00000000 (0)\n+CB0F1 Filename Length       0054 (84)\n+CB0F3 Extra Length          0000 (0)\n+CB0F5 Comment Length        0000 (0)\n+CB0F7 Disk Start            0000 (0)\n+CB0F9 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CAAEE Ext File Attributes   41ED0010 (1106051088)\n+CB0FB Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-CAAF2 Local Header Offset   00004EB2 (20146)\n-CAAF6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CB0FF Local Header Offset   00004EB2 (20146)\n+CB103 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCAAF6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCB103: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xCAAF6: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xCB103: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xCAACE: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCB0DB: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-CAB4A CENTRAL HEADER #183   02014B50 (33639248)\n-CAB4E Created Zip Spec      14 (20) '2.0'\n-CAB4F Created OS            03 (3) 'Unix'\n-CAB50 Extract Zip Spec      0A (10) '1.0'\n-CAB51 Extract OS            00 (0) 'MS-DOS'\n-CAB52 General Purpose Flag  0800 (2048)\n+CB157 CENTRAL HEADER #183   02014B50 (33639248)\n+CB15B Created Zip Spec      14 (20) '2.0'\n+CB15C Created OS            03 (3) 'Unix'\n+CB15D Extract Zip Spec      0A (10) '1.0'\n+CB15E Extract OS            00 (0) 'MS-DOS'\n+CB15F General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-CAB54 Compression Method    0000 (0) 'Stored'\n-CAB56 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CAB5A CRC                   00000000 (0)\n-CAB5E Compressed Size       00000000 (0)\n-CAB62 Uncompressed Size     00000000 (0)\n-CAB66 Filename Length       0025 (37)\n-CAB68 Extra Length          0000 (0)\n-CAB6A Comment Length        0000 (0)\n-CAB6C Disk Start            0000 (0)\n-CAB6E Int File Attributes   0000 (0)\n+CB161 Compression Method    0000 (0) 'Stored'\n+CB163 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CB167 CRC                   00000000 (0)\n+CB16B Compressed Size       00000000 (0)\n+CB16F Uncompressed Size     00000000 (0)\n+CB173 Filename Length       0025 (37)\n+CB175 Extra Length          0000 (0)\n+CB177 Comment Length        0000 (0)\n+CB179 Disk Start            0000 (0)\n+CB17B Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CAB70 Ext File Attributes   41ED0010 (1106051088)\n+CB17D Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-CAB74 Local Header Offset   00004F24 (20260)\n-CAB78 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CB181 Local Header Offset   00004F24 (20260)\n+CB185 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCAB78: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCB185: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xCAB78: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xCB185: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xCAB50: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCB15D: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-CAB9D CENTRAL HEADER #184   02014B50 (33639248)\n-CABA1 Created Zip Spec      14 (20) '2.0'\n-CABA2 Created OS            03 (3) 'Unix'\n-CABA3 Extract Zip Spec      0A (10) '1.0'\n-CABA4 Extract OS            00 (0) 'MS-DOS'\n-CABA5 General Purpose Flag  0800 (2048)\n+CB1AA CENTRAL HEADER #184   02014B50 (33639248)\n+CB1AE Created Zip Spec      14 (20) '2.0'\n+CB1AF Created OS            03 (3) 'Unix'\n+CB1B0 Extract Zip Spec      0A (10) '1.0'\n+CB1B1 Extract OS            00 (0) 'MS-DOS'\n+CB1B2 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-CABA7 Compression Method    0000 (0) 'Stored'\n-CABA9 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CABAD CRC                   00000000 (0)\n-CABB1 Compressed Size       00000000 (0)\n-CABB5 Uncompressed Size     00000000 (0)\n-CABB9 Filename Length       002E (46)\n-CABBB Extra Length          0000 (0)\n-CABBD Comment Length        0000 (0)\n-CABBF Disk Start            0000 (0)\n-CABC1 Int File Attributes   0000 (0)\n+CB1B4 Compression Method    0000 (0) 'Stored'\n+CB1B6 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CB1BA CRC                   00000000 (0)\n+CB1BE Compressed Size       00000000 (0)\n+CB1C2 Uncompressed Size     00000000 (0)\n+CB1C6 Filename Length       002E (46)\n+CB1C8 Extra Length          0000 (0)\n+CB1CA Comment Length        0000 (0)\n+CB1CC Disk Start            0000 (0)\n+CB1CE Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CABC3 Ext File Attributes   41ED0010 (1106051088)\n+CB1D0 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-CABC7 Local Header Offset   00004F67 (20327)\n-CABCB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CB1D4 Local Header Offset   00004F67 (20327)\n+CB1D8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCABCB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCB1D8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xCABCB: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xCB1D8: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xCABA3: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCB1B0: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-CABF9 CENTRAL HEADER #185   02014B50 (33639248)\n-CABFD Created Zip Spec      14 (20) '2.0'\n-CABFE Created OS            03 (3) 'Unix'\n-CABFF Extract Zip Spec      0A (10) '1.0'\n-CAC00 Extract OS            00 (0) 'MS-DOS'\n-CAC01 General Purpose Flag  0800 (2048)\n+CB206 CENTRAL HEADER #185   02014B50 (33639248)\n+CB20A Created Zip Spec      14 (20) '2.0'\n+CB20B Created OS            03 (3) 'Unix'\n+CB20C Extract Zip Spec      0A (10) '1.0'\n+CB20D Extract OS            00 (0) 'MS-DOS'\n+CB20E General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-CAC03 Compression Method    0000 (0) 'Stored'\n-CAC05 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CAC09 CRC                   00000000 (0)\n-CAC0D Compressed Size       00000000 (0)\n-CAC11 Uncompressed Size     00000000 (0)\n-CAC15 Filename Length       005E (94)\n-CAC17 Extra Length          0000 (0)\n-CAC19 Comment Length        0000 (0)\n-CAC1B Disk Start            0000 (0)\n-CAC1D Int File Attributes   0000 (0)\n+CB210 Compression Method    0000 (0) 'Stored'\n+CB212 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CB216 CRC                   00000000 (0)\n+CB21A Compressed Size       00000000 (0)\n+CB21E Uncompressed Size     00000000 (0)\n+CB222 Filename Length       005E (94)\n+CB224 Extra Length          0000 (0)\n+CB226 Comment Length        0000 (0)\n+CB228 Disk Start            0000 (0)\n+CB22A Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CAC1F Ext File Attributes   41ED0010 (1106051088)\n+CB22C Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-CAC23 Local Header Offset   00004FB3 (20403)\n-CAC27 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CB230 Local Header Offset   00004FB3 (20403)\n+CB234 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCAC27: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCB234: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xCAC27: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xCB234: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xCABFF: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCB20C: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-CAC85 CENTRAL HEADER #186   02014B50 (33639248)\n-CAC89 Created Zip Spec      14 (20) '2.0'\n-CAC8A Created OS            03 (3) 'Unix'\n-CAC8B Extract Zip Spec      0A (10) '1.0'\n-CAC8C Extract OS            00 (0) 'MS-DOS'\n-CAC8D General Purpose Flag  0800 (2048)\n+CB292 CENTRAL HEADER #186   02014B50 (33639248)\n+CB296 Created Zip Spec      14 (20) '2.0'\n+CB297 Created OS            03 (3) 'Unix'\n+CB298 Extract Zip Spec      0A (10) '1.0'\n+CB299 Extract OS            00 (0) 'MS-DOS'\n+CB29A General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-CAC8F Compression Method    0000 (0) 'Stored'\n-CAC91 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CAC95 CRC                   00000000 (0)\n-CAC99 Compressed Size       00000000 (0)\n-CAC9D Uncompressed Size     00000000 (0)\n-CACA1 Filename Length       006A (106)\n-CACA3 Extra Length          0000 (0)\n-CACA5 Comment Length        0000 (0)\n-CACA7 Disk Start            0000 (0)\n-CACA9 Int File Attributes   0000 (0)\n+CB29C Compression Method    0000 (0) 'Stored'\n+CB29E Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CB2A2 CRC                   00000000 (0)\n+CB2A6 Compressed Size       00000000 (0)\n+CB2AA Uncompressed Size     00000000 (0)\n+CB2AE Filename Length       006A (106)\n+CB2B0 Extra Length          0000 (0)\n+CB2B2 Comment Length        0000 (0)\n+CB2B4 Disk Start            0000 (0)\n+CB2B6 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CACAB Ext File Attributes   41ED0010 (1106051088)\n+CB2B8 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-CACAF Local Header Offset   0000502F (20527)\n-CACB3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CB2BC Local Header Offset   0000502F (20527)\n+CB2C0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCACB3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCB2C0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xCACB3: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xCB2C0: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xCAC8B: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCB298: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-CAD1D CENTRAL HEADER #187   02014B50 (33639248)\n-CAD21 Created Zip Spec      14 (20) '2.0'\n-CAD22 Created OS            03 (3) 'Unix'\n-CAD23 Extract Zip Spec      0A (10) '1.0'\n-CAD24 Extract OS            00 (0) 'MS-DOS'\n-CAD25 General Purpose Flag  0800 (2048)\n+CB32A CENTRAL HEADER #187   02014B50 (33639248)\n+CB32E Created Zip Spec      14 (20) '2.0'\n+CB32F Created OS            03 (3) 'Unix'\n+CB330 Extract Zip Spec      0A (10) '1.0'\n+CB331 Extract OS            00 (0) 'MS-DOS'\n+CB332 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-CAD27 Compression Method    0000 (0) 'Stored'\n-CAD29 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CAD2D CRC                   00000000 (0)\n-CAD31 Compressed Size       00000000 (0)\n-CAD35 Uncompressed Size     00000000 (0)\n-CAD39 Filename Length       0027 (39)\n-CAD3B Extra Length          0000 (0)\n-CAD3D Comment Length        0000 (0)\n-CAD3F Disk Start            0000 (0)\n-CAD41 Int File Attributes   0000 (0)\n+CB334 Compression Method    0000 (0) 'Stored'\n+CB336 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CB33A CRC                   00000000 (0)\n+CB33E Compressed Size       00000000 (0)\n+CB342 Uncompressed Size     00000000 (0)\n+CB346 Filename Length       0027 (39)\n+CB348 Extra Length          0000 (0)\n+CB34A Comment Length        0000 (0)\n+CB34C Disk Start            0000 (0)\n+CB34E Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CAD43 Ext File Attributes   41ED0010 (1106051088)\n+CB350 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-CAD47 Local Header Offset   000050B7 (20663)\n-CAD4B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CB354 Local Header Offset   000050B7 (20663)\n+CB358 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCAD4B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCB358: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xCAD4B: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xCB358: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xCAD23: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCB330: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-CAD72 CENTRAL HEADER #188   02014B50 (33639248)\n-CAD76 Created Zip Spec      14 (20) '2.0'\n-CAD77 Created OS            03 (3) 'Unix'\n-CAD78 Extract Zip Spec      0A (10) '1.0'\n-CAD79 Extract OS            00 (0) 'MS-DOS'\n-CAD7A General Purpose Flag  0800 (2048)\n+CB37F CENTRAL HEADER #188   02014B50 (33639248)\n+CB383 Created Zip Spec      14 (20) '2.0'\n+CB384 Created OS            03 (3) 'Unix'\n+CB385 Extract Zip Spec      0A (10) '1.0'\n+CB386 Extract OS            00 (0) 'MS-DOS'\n+CB387 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-CAD7C Compression Method    0000 (0) 'Stored'\n-CAD7E Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CAD82 CRC                   00000000 (0)\n-CAD86 Compressed Size       00000000 (0)\n-CAD8A Uncompressed Size     00000000 (0)\n-CAD8E Filename Length       0030 (48)\n-CAD90 Extra Length          0000 (0)\n-CAD92 Comment Length        0000 (0)\n-CAD94 Disk Start            0000 (0)\n-CAD96 Int File Attributes   0000 (0)\n+CB389 Compression Method    0000 (0) 'Stored'\n+CB38B Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CB38F CRC                   00000000 (0)\n+CB393 Compressed Size       00000000 (0)\n+CB397 Uncompressed Size     00000000 (0)\n+CB39B Filename Length       0030 (48)\n+CB39D Extra Length          0000 (0)\n+CB39F Comment Length        0000 (0)\n+CB3A1 Disk Start            0000 (0)\n+CB3A3 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CAD98 Ext File Attributes   41ED0010 (1106051088)\n+CB3A5 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-CAD9C Local Header Offset   000050FC (20732)\n-CADA0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CB3A9 Local Header Offset   000050FC (20732)\n+CB3AD Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCADA0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCB3AD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xCADA0: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xCB3AD: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xCAD78: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCB385: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-CADD0 CENTRAL HEADER #189   02014B50 (33639248)\n-CADD4 Created Zip Spec      14 (20) '2.0'\n-CADD5 Created OS            03 (3) 'Unix'\n-CADD6 Extract Zip Spec      0A (10) '1.0'\n-CADD7 Extract OS            00 (0) 'MS-DOS'\n-CADD8 General Purpose Flag  0800 (2048)\n+CB3DD CENTRAL HEADER #189   02014B50 (33639248)\n+CB3E1 Created Zip Spec      14 (20) '2.0'\n+CB3E2 Created OS            03 (3) 'Unix'\n+CB3E3 Extract Zip Spec      0A (10) '1.0'\n+CB3E4 Extract OS            00 (0) 'MS-DOS'\n+CB3E5 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-CADDA Compression Method    0000 (0) 'Stored'\n-CADDC Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CADE0 CRC                   00000000 (0)\n-CADE4 Compressed Size       00000000 (0)\n-CADE8 Uncompressed Size     00000000 (0)\n-CADEC Filename Length       0069 (105)\n-CADEE Extra Length          0000 (0)\n-CADF0 Comment Length        0000 (0)\n-CADF2 Disk Start            0000 (0)\n-CADF4 Int File Attributes   0000 (0)\n+CB3E7 Compression Method    0000 (0) 'Stored'\n+CB3E9 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CB3ED CRC                   00000000 (0)\n+CB3F1 Compressed Size       00000000 (0)\n+CB3F5 Uncompressed Size     00000000 (0)\n+CB3F9 Filename Length       0069 (105)\n+CB3FB Extra Length          0000 (0)\n+CB3FD Comment Length        0000 (0)\n+CB3FF Disk Start            0000 (0)\n+CB401 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CADF6 Ext File Attributes   41ED0010 (1106051088)\n+CB403 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-CADFA Local Header Offset   0000514A (20810)\n-CADFE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CB407 Local Header Offset   0000514A (20810)\n+CB40B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCADFE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCB40B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xCADFE: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xCB40B: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xCADD6: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCB3E3: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-CAE67 CENTRAL HEADER #190   02014B50 (33639248)\n-CAE6B Created Zip Spec      14 (20) '2.0'\n-CAE6C Created OS            03 (3) 'Unix'\n-CAE6D Extract Zip Spec      0A (10) '1.0'\n-CAE6E Extract OS            00 (0) 'MS-DOS'\n-CAE6F General Purpose Flag  0800 (2048)\n+CB474 CENTRAL HEADER #190   02014B50 (33639248)\n+CB478 Created Zip Spec      14 (20) '2.0'\n+CB479 Created OS            03 (3) 'Unix'\n+CB47A Extract Zip Spec      0A (10) '1.0'\n+CB47B Extract OS            00 (0) 'MS-DOS'\n+CB47C General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-CAE71 Compression Method    0000 (0) 'Stored'\n-CAE73 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CAE77 CRC                   00000000 (0)\n-CAE7B Compressed Size       00000000 (0)\n-CAE7F Uncompressed Size     00000000 (0)\n-CAE83 Filename Length       0069 (105)\n-CAE85 Extra Length          0000 (0)\n-CAE87 Comment Length        0000 (0)\n-CAE89 Disk Start            0000 (0)\n-CAE8B Int File Attributes   0000 (0)\n+CB47E Compression Method    0000 (0) 'Stored'\n+CB480 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CB484 CRC                   00000000 (0)\n+CB488 Compressed Size       00000000 (0)\n+CB48C Uncompressed Size     00000000 (0)\n+CB490 Filename Length       0069 (105)\n+CB492 Extra Length          0000 (0)\n+CB494 Comment Length        0000 (0)\n+CB496 Disk Start            0000 (0)\n+CB498 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CAE8D Ext File Attributes   41ED0010 (1106051088)\n+CB49A Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-CAE91 Local Header Offset   000051D1 (20945)\n-CAE95 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CB49E Local Header Offset   000051D1 (20945)\n+CB4A2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCAE95: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCB4A2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xCAE95: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xCB4A2: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xCAE6D: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCB47A: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-CAEFE CENTRAL HEADER #191   02014B50 (33639248)\n-CAF02 Created Zip Spec      14 (20) '2.0'\n-CAF03 Created OS            03 (3) 'Unix'\n-CAF04 Extract Zip Spec      0A (10) '1.0'\n-CAF05 Extract OS            00 (0) 'MS-DOS'\n-CAF06 General Purpose Flag  0800 (2048)\n+CB50B CENTRAL HEADER #191   02014B50 (33639248)\n+CB50F Created Zip Spec      14 (20) '2.0'\n+CB510 Created OS            03 (3) 'Unix'\n+CB511 Extract Zip Spec      0A (10) '1.0'\n+CB512 Extract OS            00 (0) 'MS-DOS'\n+CB513 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-CAF08 Compression Method    0000 (0) 'Stored'\n-CAF0A Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CAF0E CRC                   00000000 (0)\n-CAF12 Compressed Size       00000000 (0)\n-CAF16 Uncompressed Size     00000000 (0)\n-CAF1A Filename Length       0060 (96)\n-CAF1C Extra Length          0000 (0)\n-CAF1E Comment Length        0000 (0)\n-CAF20 Disk Start            0000 (0)\n-CAF22 Int File Attributes   0000 (0)\n+CB515 Compression Method    0000 (0) 'Stored'\n+CB517 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CB51B CRC                   00000000 (0)\n+CB51F Compressed Size       00000000 (0)\n+CB523 Uncompressed Size     00000000 (0)\n+CB527 Filename Length       0060 (96)\n+CB529 Extra Length          0000 (0)\n+CB52B Comment Length        0000 (0)\n+CB52D Disk Start            0000 (0)\n+CB52F Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CAF24 Ext File Attributes   41ED0010 (1106051088)\n+CB531 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-CAF28 Local Header Offset   00005258 (21080)\n-CAF2C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CB535 Local Header Offset   00005258 (21080)\n+CB539 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCAF2C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCB539: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xCAF2C: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xCB539: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xCAF04: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCB511: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-CAF8C CENTRAL HEADER #192   02014B50 (33639248)\n-CAF90 Created Zip Spec      14 (20) '2.0'\n-CAF91 Created OS            03 (3) 'Unix'\n-CAF92 Extract Zip Spec      0A (10) '1.0'\n-CAF93 Extract OS            00 (0) 'MS-DOS'\n-CAF94 General Purpose Flag  0800 (2048)\n+CB599 CENTRAL HEADER #192   02014B50 (33639248)\n+CB59D Created Zip Spec      14 (20) '2.0'\n+CB59E Created OS            03 (3) 'Unix'\n+CB59F Extract Zip Spec      0A (10) '1.0'\n+CB5A0 Extract OS            00 (0) 'MS-DOS'\n+CB5A1 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-CAF96 Compression Method    0000 (0) 'Stored'\n-CAF98 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CAF9C CRC                   00000000 (0)\n-CAFA0 Compressed Size       00000000 (0)\n-CAFA4 Uncompressed Size     00000000 (0)\n-CAFA8 Filename Length       005E (94)\n-CAFAA Extra Length          0000 (0)\n-CAFAC Comment Length        0000 (0)\n-CAFAE Disk Start            0000 (0)\n-CAFB0 Int File Attributes   0000 (0)\n+CB5A3 Compression Method    0000 (0) 'Stored'\n+CB5A5 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CB5A9 CRC                   00000000 (0)\n+CB5AD Compressed Size       00000000 (0)\n+CB5B1 Uncompressed Size     00000000 (0)\n+CB5B5 Filename Length       005E (94)\n+CB5B7 Extra Length          0000 (0)\n+CB5B9 Comment Length        0000 (0)\n+CB5BB Disk Start            0000 (0)\n+CB5BD Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CAFB2 Ext File Attributes   41ED0010 (1106051088)\n+CB5BF Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-CAFB6 Local Header Offset   000052D6 (21206)\n-CAFBA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CB5C3 Local Header Offset   000052D6 (21206)\n+CB5C7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCAFBA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCB5C7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xCAFBA: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xCB5C7: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xCAF92: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCB59F: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-CB018 CENTRAL HEADER #193   02014B50 (33639248)\n-CB01C Created Zip Spec      14 (20) '2.0'\n-CB01D Created OS            03 (3) 'Unix'\n-CB01E Extract Zip Spec      0A (10) '1.0'\n-CB01F Extract OS            00 (0) 'MS-DOS'\n-CB020 General Purpose Flag  0800 (2048)\n+CB625 CENTRAL HEADER #193   02014B50 (33639248)\n+CB629 Created Zip Spec      14 (20) '2.0'\n+CB62A Created OS            03 (3) 'Unix'\n+CB62B Extract Zip Spec      0A (10) '1.0'\n+CB62C Extract OS            00 (0) 'MS-DOS'\n+CB62D General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-CB022 Compression Method    0000 (0) 'Stored'\n-CB024 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CB028 CRC                   00000000 (0)\n-CB02C Compressed Size       00000000 (0)\n-CB030 Uncompressed Size     00000000 (0)\n-CB034 Filename Length       0065 (101)\n-CB036 Extra Length          0000 (0)\n-CB038 Comment Length        0000 (0)\n-CB03A Disk Start            0000 (0)\n-CB03C Int File Attributes   0000 (0)\n+CB62F Compression Method    0000 (0) 'Stored'\n+CB631 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CB635 CRC                   00000000 (0)\n+CB639 Compressed Size       00000000 (0)\n+CB63D Uncompressed Size     00000000 (0)\n+CB641 Filename Length       0065 (101)\n+CB643 Extra Length          0000 (0)\n+CB645 Comment Length        0000 (0)\n+CB647 Disk Start            0000 (0)\n+CB649 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CB03E Ext File Attributes   41ED0010 (1106051088)\n+CB64B Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-CB042 Local Header Offset   00005352 (21330)\n-CB046 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CB64F Local Header Offset   00005352 (21330)\n+CB653 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCB046: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCB653: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xCB046: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xCB653: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xCB01E: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCB62B: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-CB0AB CENTRAL HEADER #194   02014B50 (33639248)\n-CB0AF Created Zip Spec      14 (20) '2.0'\n-CB0B0 Created OS            03 (3) 'Unix'\n-CB0B1 Extract Zip Spec      0A (10) '1.0'\n-CB0B2 Extract OS            00 (0) 'MS-DOS'\n-CB0B3 General Purpose Flag  0800 (2048)\n+CB6B8 CENTRAL HEADER #194   02014B50 (33639248)\n+CB6BC Created Zip Spec      14 (20) '2.0'\n+CB6BD Created OS            03 (3) 'Unix'\n+CB6BE Extract Zip Spec      0A (10) '1.0'\n+CB6BF Extract OS            00 (0) 'MS-DOS'\n+CB6C0 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-CB0B5 Compression Method    0000 (0) 'Stored'\n-CB0B7 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CB0BB CRC                   00000000 (0)\n-CB0BF Compressed Size       00000000 (0)\n-CB0C3 Uncompressed Size     00000000 (0)\n-CB0C7 Filename Length       0063 (99)\n-CB0C9 Extra Length          0000 (0)\n-CB0CB Comment Length        0000 (0)\n-CB0CD Disk Start            0000 (0)\n-CB0CF Int File Attributes   0000 (0)\n+CB6C2 Compression Method    0000 (0) 'Stored'\n+CB6C4 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CB6C8 CRC                   00000000 (0)\n+CB6CC Compressed Size       00000000 (0)\n+CB6D0 Uncompressed Size     00000000 (0)\n+CB6D4 Filename Length       0063 (99)\n+CB6D6 Extra Length          0000 (0)\n+CB6D8 Comment Length        0000 (0)\n+CB6DA Disk Start            0000 (0)\n+CB6DC Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CB0D1 Ext File Attributes   41ED0010 (1106051088)\n+CB6DE Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-CB0D5 Local Header Offset   000053D5 (21461)\n-CB0D9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CB6E2 Local Header Offset   000053D5 (21461)\n+CB6E6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCB0D9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCB6E6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xCB0D9: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xCB6E6: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xCB0B1: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCB6BE: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-CB13C CENTRAL HEADER #195   02014B50 (33639248)\n-CB140 Created Zip Spec      14 (20) '2.0'\n-CB141 Created OS            03 (3) 'Unix'\n-CB142 Extract Zip Spec      0A (10) '1.0'\n-CB143 Extract OS            00 (0) 'MS-DOS'\n-CB144 General Purpose Flag  0800 (2048)\n+CB749 CENTRAL HEADER #195   02014B50 (33639248)\n+CB74D Created Zip Spec      14 (20) '2.0'\n+CB74E Created OS            03 (3) 'Unix'\n+CB74F Extract Zip Spec      0A (10) '1.0'\n+CB750 Extract OS            00 (0) 'MS-DOS'\n+CB751 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-CB146 Compression Method    0000 (0) 'Stored'\n-CB148 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CB14C CRC                   00000000 (0)\n-CB150 Compressed Size       00000000 (0)\n-CB154 Uncompressed Size     00000000 (0)\n-CB158 Filename Length       0069 (105)\n-CB15A Extra Length          0000 (0)\n-CB15C Comment Length        0000 (0)\n-CB15E Disk Start            0000 (0)\n-CB160 Int File Attributes   0000 (0)\n+CB753 Compression Method    0000 (0) 'Stored'\n+CB755 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CB759 CRC                   00000000 (0)\n+CB75D Compressed Size       00000000 (0)\n+CB761 Uncompressed Size     00000000 (0)\n+CB765 Filename Length       0069 (105)\n+CB767 Extra Length          0000 (0)\n+CB769 Comment Length        0000 (0)\n+CB76B Disk Start            0000 (0)\n+CB76D Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CB162 Ext File Attributes   41ED0010 (1106051088)\n+CB76F Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-CB166 Local Header Offset   00005456 (21590)\n-CB16A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CB773 Local Header Offset   00005456 (21590)\n+CB777 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCB16A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCB777: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xCB16A: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xCB777: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xCB142: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCB74F: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-CB1D3 CENTRAL HEADER #196   02014B50 (33639248)\n-CB1D7 Created Zip Spec      14 (20) '2.0'\n-CB1D8 Created OS            03 (3) 'Unix'\n-CB1D9 Extract Zip Spec      0A (10) '1.0'\n-CB1DA Extract OS            00 (0) 'MS-DOS'\n-CB1DB General Purpose Flag  0800 (2048)\n+CB7E0 CENTRAL HEADER #196   02014B50 (33639248)\n+CB7E4 Created Zip Spec      14 (20) '2.0'\n+CB7E5 Created OS            03 (3) 'Unix'\n+CB7E6 Extract Zip Spec      0A (10) '1.0'\n+CB7E7 Extract OS            00 (0) 'MS-DOS'\n+CB7E8 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-CB1DD Compression Method    0000 (0) 'Stored'\n-CB1DF Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CB1E3 CRC                   00000000 (0)\n-CB1E7 Compressed Size       00000000 (0)\n-CB1EB Uncompressed Size     00000000 (0)\n-CB1EF Filename Length       0060 (96)\n-CB1F1 Extra Length          0000 (0)\n-CB1F3 Comment Length        0000 (0)\n-CB1F5 Disk Start            0000 (0)\n-CB1F7 Int File Attributes   0000 (0)\n+CB7EA Compression Method    0000 (0) 'Stored'\n+CB7EC Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CB7F0 CRC                   00000000 (0)\n+CB7F4 Compressed Size       00000000 (0)\n+CB7F8 Uncompressed Size     00000000 (0)\n+CB7FC Filename Length       0060 (96)\n+CB7FE Extra Length          0000 (0)\n+CB800 Comment Length        0000 (0)\n+CB802 Disk Start            0000 (0)\n+CB804 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CB1F9 Ext File Attributes   41ED0010 (1106051088)\n+CB806 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-CB1FD Local Header Offset   000054DD (21725)\n-CB201 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CB80A Local Header Offset   000054DD (21725)\n+CB80E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCB201: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCB80E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xCB201: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xCB80E: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xCB1D9: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCB7E6: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-CB261 CENTRAL HEADER #197   02014B50 (33639248)\n-CB265 Created Zip Spec      14 (20) '2.0'\n-CB266 Created OS            03 (3) 'Unix'\n-CB267 Extract Zip Spec      0A (10) '1.0'\n-CB268 Extract OS            00 (0) 'MS-DOS'\n-CB269 General Purpose Flag  0800 (2048)\n+CB86E CENTRAL HEADER #197   02014B50 (33639248)\n+CB872 Created Zip Spec      14 (20) '2.0'\n+CB873 Created OS            03 (3) 'Unix'\n+CB874 Extract Zip Spec      0A (10) '1.0'\n+CB875 Extract OS            00 (0) 'MS-DOS'\n+CB876 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-CB26B Compression Method    0000 (0) 'Stored'\n-CB26D Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CB271 CRC                   00000000 (0)\n-CB275 Compressed Size       00000000 (0)\n-CB279 Uncompressed Size     00000000 (0)\n-CB27D Filename Length       0063 (99)\n-CB27F Extra Length          0000 (0)\n-CB281 Comment Length        0000 (0)\n-CB283 Disk Start            0000 (0)\n-CB285 Int File Attributes   0000 (0)\n+CB878 Compression Method    0000 (0) 'Stored'\n+CB87A Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CB87E CRC                   00000000 (0)\n+CB882 Compressed Size       00000000 (0)\n+CB886 Uncompressed Size     00000000 (0)\n+CB88A Filename Length       0063 (99)\n+CB88C Extra Length          0000 (0)\n+CB88E Comment Length        0000 (0)\n+CB890 Disk Start            0000 (0)\n+CB892 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CB287 Ext File Attributes   41ED0010 (1106051088)\n+CB894 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-CB28B Local Header Offset   0000555B (21851)\n-CB28F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CB898 Local Header Offset   0000555B (21851)\n+CB89C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCB28F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCB89C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xCB28F: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xCB89C: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xCB267: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCB874: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-CB2F2 CENTRAL HEADER #198   02014B50 (33639248)\n-CB2F6 Created Zip Spec      14 (20) '2.0'\n-CB2F7 Created OS            03 (3) 'Unix'\n-CB2F8 Extract Zip Spec      0A (10) '1.0'\n-CB2F9 Extract OS            00 (0) 'MS-DOS'\n-CB2FA General Purpose Flag  0800 (2048)\n+CB8FF CENTRAL HEADER #198   02014B50 (33639248)\n+CB903 Created Zip Spec      14 (20) '2.0'\n+CB904 Created OS            03 (3) 'Unix'\n+CB905 Extract Zip Spec      0A (10) '1.0'\n+CB906 Extract OS            00 (0) 'MS-DOS'\n+CB907 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-CB2FC Compression Method    0000 (0) 'Stored'\n-CB2FE Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CB302 CRC                   00000000 (0)\n-CB306 Compressed Size       00000000 (0)\n-CB30A Uncompressed Size     00000000 (0)\n-CB30E Filename Length       005F (95)\n-CB310 Extra Length          0000 (0)\n-CB312 Comment Length        0000 (0)\n-CB314 Disk Start            0000 (0)\n-CB316 Int File Attributes   0000 (0)\n+CB909 Compression Method    0000 (0) 'Stored'\n+CB90B Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CB90F CRC                   00000000 (0)\n+CB913 Compressed Size       00000000 (0)\n+CB917 Uncompressed Size     00000000 (0)\n+CB91B Filename Length       005F (95)\n+CB91D Extra Length          0000 (0)\n+CB91F Comment Length        0000 (0)\n+CB921 Disk Start            0000 (0)\n+CB923 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CB318 Ext File Attributes   41ED0010 (1106051088)\n+CB925 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-CB31C Local Header Offset   000055DC (21980)\n-CB320 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CB929 Local Header Offset   000055DC (21980)\n+CB92D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCB320: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCB92D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xCB320: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xCB92D: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xCB2F8: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCB905: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-CB37F CENTRAL HEADER #199   02014B50 (33639248)\n-CB383 Created Zip Spec      14 (20) '2.0'\n-CB384 Created OS            03 (3) 'Unix'\n-CB385 Extract Zip Spec      0A (10) '1.0'\n-CB386 Extract OS            00 (0) 'MS-DOS'\n-CB387 General Purpose Flag  0800 (2048)\n+CB98C CENTRAL HEADER #199   02014B50 (33639248)\n+CB990 Created Zip Spec      14 (20) '2.0'\n+CB991 Created OS            03 (3) 'Unix'\n+CB992 Extract Zip Spec      0A (10) '1.0'\n+CB993 Extract OS            00 (0) 'MS-DOS'\n+CB994 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-CB389 Compression Method    0000 (0) 'Stored'\n-CB38B Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CB38F CRC                   00000000 (0)\n-CB393 Compressed Size       00000000 (0)\n-CB397 Uncompressed Size     00000000 (0)\n-CB39B Filename Length       0067 (103)\n-CB39D Extra Length          0000 (0)\n-CB39F Comment Length        0000 (0)\n-CB3A1 Disk Start            0000 (0)\n-CB3A3 Int File Attributes   0000 (0)\n+CB996 Compression Method    0000 (0) 'Stored'\n+CB998 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CB99C CRC                   00000000 (0)\n+CB9A0 Compressed Size       00000000 (0)\n+CB9A4 Uncompressed Size     00000000 (0)\n+CB9A8 Filename Length       0067 (103)\n+CB9AA Extra Length          0000 (0)\n+CB9AC Comment Length        0000 (0)\n+CB9AE Disk Start            0000 (0)\n+CB9B0 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CB3A5 Ext File Attributes   41ED0010 (1106051088)\n+CB9B2 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-CB3A9 Local Header Offset   00005659 (22105)\n-CB3AD Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CB9B6 Local Header Offset   00005659 (22105)\n+CB9BA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCB3AD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCB9BA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xCB3AD: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xCB9BA: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xCB385: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCB992: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-CB414 CENTRAL HEADER #200   02014B50 (33639248)\n-CB418 Created Zip Spec      14 (20) '2.0'\n-CB419 Created OS            03 (3) 'Unix'\n-CB41A Extract Zip Spec      0A (10) '1.0'\n-CB41B Extract OS            00 (0) 'MS-DOS'\n-CB41C General Purpose Flag  0800 (2048)\n+CBA21 CENTRAL HEADER #200   02014B50 (33639248)\n+CBA25 Created Zip Spec      14 (20) '2.0'\n+CBA26 Created OS            03 (3) 'Unix'\n+CBA27 Extract Zip Spec      0A (10) '1.0'\n+CBA28 Extract OS            00 (0) 'MS-DOS'\n+CBA29 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-CB41E Compression Method    0000 (0) 'Stored'\n-CB420 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CB424 CRC                   00000000 (0)\n-CB428 Compressed Size       00000000 (0)\n-CB42C Uncompressed Size     00000000 (0)\n-CB430 Filename Length       0066 (102)\n-CB432 Extra Length          0000 (0)\n-CB434 Comment Length        0000 (0)\n-CB436 Disk Start            0000 (0)\n-CB438 Int File Attributes   0000 (0)\n+CBA2B Compression Method    0000 (0) 'Stored'\n+CBA2D Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CBA31 CRC                   00000000 (0)\n+CBA35 Compressed Size       00000000 (0)\n+CBA39 Uncompressed Size     00000000 (0)\n+CBA3D Filename Length       0066 (102)\n+CBA3F Extra Length          0000 (0)\n+CBA41 Comment Length        0000 (0)\n+CBA43 Disk Start            0000 (0)\n+CBA45 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CB43A Ext File Attributes   41ED0010 (1106051088)\n+CBA47 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-CB43E Local Header Offset   000056DE (22238)\n-CB442 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CBA4B Local Header Offset   000056DE (22238)\n+CBA4F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCB442: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCBA4F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xCB442: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xCBA4F: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xCB41A: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCBA27: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-CB4A8 CENTRAL HEADER #201   02014B50 (33639248)\n-CB4AC Created Zip Spec      14 (20) '2.0'\n-CB4AD Created OS            03 (3) 'Unix'\n-CB4AE Extract Zip Spec      0A (10) '1.0'\n-CB4AF Extract OS            00 (0) 'MS-DOS'\n-CB4B0 General Purpose Flag  0800 (2048)\n+CBAB5 CENTRAL HEADER #201   02014B50 (33639248)\n+CBAB9 Created Zip Spec      14 (20) '2.0'\n+CBABA Created OS            03 (3) 'Unix'\n+CBABB Extract Zip Spec      0A (10) '1.0'\n+CBABC Extract OS            00 (0) 'MS-DOS'\n+CBABD General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-CB4B2 Compression Method    0000 (0) 'Stored'\n-CB4B4 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CB4B8 CRC                   00000000 (0)\n-CB4BC Compressed Size       00000000 (0)\n-CB4C0 Uncompressed Size     00000000 (0)\n-CB4C4 Filename Length       0067 (103)\n-CB4C6 Extra Length          0000 (0)\n-CB4C8 Comment Length        0000 (0)\n-CB4CA Disk Start            0000 (0)\n-CB4CC Int File Attributes   0000 (0)\n+CBABF Compression Method    0000 (0) 'Stored'\n+CBAC1 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CBAC5 CRC                   00000000 (0)\n+CBAC9 Compressed Size       00000000 (0)\n+CBACD Uncompressed Size     00000000 (0)\n+CBAD1 Filename Length       0067 (103)\n+CBAD3 Extra Length          0000 (0)\n+CBAD5 Comment Length        0000 (0)\n+CBAD7 Disk Start            0000 (0)\n+CBAD9 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CB4CE Ext File Attributes   41ED0010 (1106051088)\n+CBADB Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-CB4D2 Local Header Offset   00005762 (22370)\n-CB4D6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CBADF Local Header Offset   00005762 (22370)\n+CBAE3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCB4D6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCBAE3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xCB4D6: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xCBAE3: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xCB4AE: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCBABB: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-CB53D CENTRAL HEADER #202   02014B50 (33639248)\n-CB541 Created Zip Spec      14 (20) '2.0'\n-CB542 Created OS            03 (3) 'Unix'\n-CB543 Extract Zip Spec      0A (10) '1.0'\n-CB544 Extract OS            00 (0) 'MS-DOS'\n-CB545 General Purpose Flag  0800 (2048)\n+CBB4A CENTRAL HEADER #202   02014B50 (33639248)\n+CBB4E Created Zip Spec      14 (20) '2.0'\n+CBB4F Created OS            03 (3) 'Unix'\n+CBB50 Extract Zip Spec      0A (10) '1.0'\n+CBB51 Extract OS            00 (0) 'MS-DOS'\n+CBB52 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-CB547 Compression Method    0000 (0) 'Stored'\n-CB549 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CB54D CRC                   00000000 (0)\n-CB551 Compressed Size       00000000 (0)\n-CB555 Uncompressed Size     00000000 (0)\n-CB559 Filename Length       0065 (101)\n-CB55B Extra Length          0000 (0)\n-CB55D Comment Length        0000 (0)\n-CB55F Disk Start            0000 (0)\n-CB561 Int File Attributes   0000 (0)\n+CBB54 Compression Method    0000 (0) 'Stored'\n+CBB56 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CBB5A CRC                   00000000 (0)\n+CBB5E Compressed Size       00000000 (0)\n+CBB62 Uncompressed Size     00000000 (0)\n+CBB66 Filename Length       0065 (101)\n+CBB68 Extra Length          0000 (0)\n+CBB6A Comment Length        0000 (0)\n+CBB6C Disk Start            0000 (0)\n+CBB6E Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CB563 Ext File Attributes   41ED0010 (1106051088)\n+CBB70 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-CB567 Local Header Offset   000057E7 (22503)\n-CB56B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CBB74 Local Header Offset   000057E7 (22503)\n+CBB78 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCB56B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCBB78: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xCB56B: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xCBB78: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xCB543: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCBB50: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-CB5D0 CENTRAL HEADER #203   02014B50 (33639248)\n-CB5D4 Created Zip Spec      14 (20) '2.0'\n-CB5D5 Created OS            03 (3) 'Unix'\n-CB5D6 Extract Zip Spec      0A (10) '1.0'\n-CB5D7 Extract OS            00 (0) 'MS-DOS'\n-CB5D8 General Purpose Flag  0800 (2048)\n+CBBDD CENTRAL HEADER #203   02014B50 (33639248)\n+CBBE1 Created Zip Spec      14 (20) '2.0'\n+CBBE2 Created OS            03 (3) 'Unix'\n+CBBE3 Extract Zip Spec      0A (10) '1.0'\n+CBBE4 Extract OS            00 (0) 'MS-DOS'\n+CBBE5 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-CB5DA Compression Method    0000 (0) 'Stored'\n-CB5DC Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CB5E0 CRC                   00000000 (0)\n-CB5E4 Compressed Size       00000000 (0)\n-CB5E8 Uncompressed Size     00000000 (0)\n-CB5EC Filename Length       0063 (99)\n-CB5EE Extra Length          0000 (0)\n-CB5F0 Comment Length        0000 (0)\n-CB5F2 Disk Start            0000 (0)\n-CB5F4 Int File Attributes   0000 (0)\n+CBBE7 Compression Method    0000 (0) 'Stored'\n+CBBE9 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CBBED CRC                   00000000 (0)\n+CBBF1 Compressed Size       00000000 (0)\n+CBBF5 Uncompressed Size     00000000 (0)\n+CBBF9 Filename Length       0063 (99)\n+CBBFB Extra Length          0000 (0)\n+CBBFD Comment Length        0000 (0)\n+CBBFF Disk Start            0000 (0)\n+CBC01 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CB5F6 Ext File Attributes   41ED0010 (1106051088)\n+CBC03 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-CB5FA Local Header Offset   0000586A (22634)\n-CB5FE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CBC07 Local Header Offset   0000586A (22634)\n+CBC0B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCB5FE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCBC0B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xCB5FE: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xCBC0B: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xCB5D6: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCBBE3: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-CB661 CENTRAL HEADER #204   02014B50 (33639248)\n-CB665 Created Zip Spec      14 (20) '2.0'\n-CB666 Created OS            03 (3) 'Unix'\n-CB667 Extract Zip Spec      0A (10) '1.0'\n-CB668 Extract OS            00 (0) 'MS-DOS'\n-CB669 General Purpose Flag  0800 (2048)\n+CBC6E CENTRAL HEADER #204   02014B50 (33639248)\n+CBC72 Created Zip Spec      14 (20) '2.0'\n+CBC73 Created OS            03 (3) 'Unix'\n+CBC74 Extract Zip Spec      0A (10) '1.0'\n+CBC75 Extract OS            00 (0) 'MS-DOS'\n+CBC76 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-CB66B Compression Method    0000 (0) 'Stored'\n-CB66D Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CB671 CRC                   00000000 (0)\n-CB675 Compressed Size       00000000 (0)\n-CB679 Uncompressed Size     00000000 (0)\n-CB67D Filename Length       005C (92)\n-CB67F Extra Length          0000 (0)\n-CB681 Comment Length        0000 (0)\n-CB683 Disk Start            0000 (0)\n-CB685 Int File Attributes   0000 (0)\n+CBC78 Compression Method    0000 (0) 'Stored'\n+CBC7A Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CBC7E CRC                   00000000 (0)\n+CBC82 Compressed Size       00000000 (0)\n+CBC86 Uncompressed Size     00000000 (0)\n+CBC8A Filename Length       005C (92)\n+CBC8C Extra Length          0000 (0)\n+CBC8E Comment Length        0000 (0)\n+CBC90 Disk Start            0000 (0)\n+CBC92 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CB687 Ext File Attributes   41ED0010 (1106051088)\n+CBC94 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-CB68B Local Header Offset   000058EB (22763)\n-CB68F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CBC98 Local Header Offset   000058EB (22763)\n+CBC9C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCB68F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCBC9C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xCB68F: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xCBC9C: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xCB667: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCBC74: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-CB6EB CENTRAL HEADER #205   02014B50 (33639248)\n-CB6EF Created Zip Spec      14 (20) '2.0'\n-CB6F0 Created OS            03 (3) 'Unix'\n-CB6F1 Extract Zip Spec      0A (10) '1.0'\n-CB6F2 Extract OS            00 (0) 'MS-DOS'\n-CB6F3 General Purpose Flag  0800 (2048)\n+CBCF8 CENTRAL HEADER #205   02014B50 (33639248)\n+CBCFC Created Zip Spec      14 (20) '2.0'\n+CBCFD Created OS            03 (3) 'Unix'\n+CBCFE Extract Zip Spec      0A (10) '1.0'\n+CBCFF Extract OS            00 (0) 'MS-DOS'\n+CBD00 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-CB6F5 Compression Method    0000 (0) 'Stored'\n-CB6F7 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CB6FB CRC                   00000000 (0)\n-CB6FF Compressed Size       00000000 (0)\n-CB703 Uncompressed Size     00000000 (0)\n-CB707 Filename Length       005D (93)\n-CB709 Extra Length          0000 (0)\n-CB70B Comment Length        0000 (0)\n-CB70D Disk Start            0000 (0)\n-CB70F Int File Attributes   0000 (0)\n+CBD02 Compression Method    0000 (0) 'Stored'\n+CBD04 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CBD08 CRC                   00000000 (0)\n+CBD0C Compressed Size       00000000 (0)\n+CBD10 Uncompressed Size     00000000 (0)\n+CBD14 Filename Length       005D (93)\n+CBD16 Extra Length          0000 (0)\n+CBD18 Comment Length        0000 (0)\n+CBD1A Disk Start            0000 (0)\n+CBD1C Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CB711 Ext File Attributes   41ED0010 (1106051088)\n+CBD1E Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-CB715 Local Header Offset   00005965 (22885)\n-CB719 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CBD22 Local Header Offset   00005965 (22885)\n+CBD26 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCB719: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCBD26: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xCB719: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xCBD26: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xCB6F1: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCBCFE: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-CB776 CENTRAL HEADER #206   02014B50 (33639248)\n-CB77A Created Zip Spec      14 (20) '2.0'\n-CB77B Created OS            03 (3) 'Unix'\n-CB77C Extract Zip Spec      0A (10) '1.0'\n-CB77D Extract OS            00 (0) 'MS-DOS'\n-CB77E General Purpose Flag  0800 (2048)\n+CBD83 CENTRAL HEADER #206   02014B50 (33639248)\n+CBD87 Created Zip Spec      14 (20) '2.0'\n+CBD88 Created OS            03 (3) 'Unix'\n+CBD89 Extract Zip Spec      0A (10) '1.0'\n+CBD8A Extract OS            00 (0) 'MS-DOS'\n+CBD8B General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-CB780 Compression Method    0000 (0) 'Stored'\n-CB782 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CB786 CRC                   00000000 (0)\n-CB78A Compressed Size       00000000 (0)\n-CB78E Uncompressed Size     00000000 (0)\n-CB792 Filename Length       005D (93)\n-CB794 Extra Length          0000 (0)\n-CB796 Comment Length        0000 (0)\n-CB798 Disk Start            0000 (0)\n-CB79A Int File Attributes   0000 (0)\n+CBD8D Compression Method    0000 (0) 'Stored'\n+CBD8F Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CBD93 CRC                   00000000 (0)\n+CBD97 Compressed Size       00000000 (0)\n+CBD9B Uncompressed Size     00000000 (0)\n+CBD9F Filename Length       005D (93)\n+CBDA1 Extra Length          0000 (0)\n+CBDA3 Comment Length        0000 (0)\n+CBDA5 Disk Start            0000 (0)\n+CBDA7 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CB79C Ext File Attributes   41ED0010 (1106051088)\n+CBDA9 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-CB7A0 Local Header Offset   000059E0 (23008)\n-CB7A4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CBDAD Local Header Offset   000059E0 (23008)\n+CBDB1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCB7A4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCBDB1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xCB7A4: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xCBDB1: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xCB77C: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCBD89: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-CB801 CENTRAL HEADER #207   02014B50 (33639248)\n-CB805 Created Zip Spec      14 (20) '2.0'\n-CB806 Created OS            03 (3) 'Unix'\n-CB807 Extract Zip Spec      0A (10) '1.0'\n-CB808 Extract OS            00 (0) 'MS-DOS'\n-CB809 General Purpose Flag  0800 (2048)\n+CBE0E CENTRAL HEADER #207   02014B50 (33639248)\n+CBE12 Created Zip Spec      14 (20) '2.0'\n+CBE13 Created OS            03 (3) 'Unix'\n+CBE14 Extract Zip Spec      0A (10) '1.0'\n+CBE15 Extract OS            00 (0) 'MS-DOS'\n+CBE16 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-CB80B Compression Method    0000 (0) 'Stored'\n-CB80D Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CB811 CRC                   00000000 (0)\n-CB815 Compressed Size       00000000 (0)\n-CB819 Uncompressed Size     00000000 (0)\n-CB81D Filename Length       005E (94)\n-CB81F Extra Length          0000 (0)\n-CB821 Comment Length        0000 (0)\n-CB823 Disk Start            0000 (0)\n-CB825 Int File Attributes   0000 (0)\n+CBE18 Compression Method    0000 (0) 'Stored'\n+CBE1A Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CBE1E CRC                   00000000 (0)\n+CBE22 Compressed Size       00000000 (0)\n+CBE26 Uncompressed Size     00000000 (0)\n+CBE2A Filename Length       005E (94)\n+CBE2C Extra Length          0000 (0)\n+CBE2E Comment Length        0000 (0)\n+CBE30 Disk Start            0000 (0)\n+CBE32 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CB827 Ext File Attributes   41ED0010 (1106051088)\n+CBE34 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-CB82B Local Header Offset   00005A5B (23131)\n-CB82F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CBE38 Local Header Offset   00005A5B (23131)\n+CBE3C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCB82F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCBE3C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xCB82F: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xCBE3C: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xCB807: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCBE14: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-CB88D CENTRAL HEADER #208   02014B50 (33639248)\n-CB891 Created Zip Spec      14 (20) '2.0'\n-CB892 Created OS            03 (3) 'Unix'\n-CB893 Extract Zip Spec      0A (10) '1.0'\n-CB894 Extract OS            00 (0) 'MS-DOS'\n-CB895 General Purpose Flag  0800 (2048)\n+CBE9A CENTRAL HEADER #208   02014B50 (33639248)\n+CBE9E Created Zip Spec      14 (20) '2.0'\n+CBE9F Created OS            03 (3) 'Unix'\n+CBEA0 Extract Zip Spec      0A (10) '1.0'\n+CBEA1 Extract OS            00 (0) 'MS-DOS'\n+CBEA2 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-CB897 Compression Method    0000 (0) 'Stored'\n-CB899 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CB89D CRC                   00000000 (0)\n-CB8A1 Compressed Size       00000000 (0)\n-CB8A5 Uncompressed Size     00000000 (0)\n-CB8A9 Filename Length       0061 (97)\n-CB8AB Extra Length          0000 (0)\n-CB8AD Comment Length        0000 (0)\n-CB8AF Disk Start            0000 (0)\n-CB8B1 Int File Attributes   0000 (0)\n+CBEA4 Compression Method    0000 (0) 'Stored'\n+CBEA6 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CBEAA CRC                   00000000 (0)\n+CBEAE Compressed Size       00000000 (0)\n+CBEB2 Uncompressed Size     00000000 (0)\n+CBEB6 Filename Length       0061 (97)\n+CBEB8 Extra Length          0000 (0)\n+CBEBA Comment Length        0000 (0)\n+CBEBC Disk Start            0000 (0)\n+CBEBE Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CB8B3 Ext File Attributes   41ED0010 (1106051088)\n+CBEC0 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-CB8B7 Local Header Offset   00005AD7 (23255)\n-CB8BB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CBEC4 Local Header Offset   00005AD7 (23255)\n+CBEC8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCB8BB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCBEC8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xCB8BB: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xCBEC8: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xCB893: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCBEA0: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-CB91C CENTRAL HEADER #209   02014B50 (33639248)\n-CB920 Created Zip Spec      14 (20) '2.0'\n-CB921 Created OS            03 (3) 'Unix'\n-CB922 Extract Zip Spec      0A (10) '1.0'\n-CB923 Extract OS            00 (0) 'MS-DOS'\n-CB924 General Purpose Flag  0800 (2048)\n+CBF29 CENTRAL HEADER #209   02014B50 (33639248)\n+CBF2D Created Zip Spec      14 (20) '2.0'\n+CBF2E Created OS            03 (3) 'Unix'\n+CBF2F Extract Zip Spec      0A (10) '1.0'\n+CBF30 Extract OS            00 (0) 'MS-DOS'\n+CBF31 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-CB926 Compression Method    0000 (0) 'Stored'\n-CB928 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CB92C CRC                   00000000 (0)\n-CB930 Compressed Size       00000000 (0)\n-CB934 Uncompressed Size     00000000 (0)\n-CB938 Filename Length       0061 (97)\n-CB93A Extra Length          0000 (0)\n-CB93C Comment Length        0000 (0)\n-CB93E Disk Start            0000 (0)\n-CB940 Int File Attributes   0000 (0)\n+CBF33 Compression Method    0000 (0) 'Stored'\n+CBF35 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CBF39 CRC                   00000000 (0)\n+CBF3D Compressed Size       00000000 (0)\n+CBF41 Uncompressed Size     00000000 (0)\n+CBF45 Filename Length       0061 (97)\n+CBF47 Extra Length          0000 (0)\n+CBF49 Comment Length        0000 (0)\n+CBF4B Disk Start            0000 (0)\n+CBF4D Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CB942 Ext File Attributes   41ED0010 (1106051088)\n+CBF4F Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-CB946 Local Header Offset   00005B56 (23382)\n-CB94A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CBF53 Local Header Offset   00005B56 (23382)\n+CBF57 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCB94A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCBF57: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xCB94A: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xCBF57: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xCB922: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCBF2F: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-CB9AB CENTRAL HEADER #210   02014B50 (33639248)\n-CB9AF Created Zip Spec      14 (20) '2.0'\n-CB9B0 Created OS            03 (3) 'Unix'\n-CB9B1 Extract Zip Spec      0A (10) '1.0'\n-CB9B2 Extract OS            00 (0) 'MS-DOS'\n-CB9B3 General Purpose Flag  0800 (2048)\n+CBFB8 CENTRAL HEADER #210   02014B50 (33639248)\n+CBFBC Created Zip Spec      14 (20) '2.0'\n+CBFBD Created OS            03 (3) 'Unix'\n+CBFBE Extract Zip Spec      0A (10) '1.0'\n+CBFBF Extract OS            00 (0) 'MS-DOS'\n+CBFC0 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-CB9B5 Compression Method    0000 (0) 'Stored'\n-CB9B7 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CB9BB CRC                   00000000 (0)\n-CB9BF Compressed Size       00000000 (0)\n-CB9C3 Uncompressed Size     00000000 (0)\n-CB9C7 Filename Length       0060 (96)\n-CB9C9 Extra Length          0000 (0)\n-CB9CB Comment Length        0000 (0)\n-CB9CD Disk Start            0000 (0)\n-CB9CF Int File Attributes   0000 (0)\n+CBFC2 Compression Method    0000 (0) 'Stored'\n+CBFC4 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CBFC8 CRC                   00000000 (0)\n+CBFCC Compressed Size       00000000 (0)\n+CBFD0 Uncompressed Size     00000000 (0)\n+CBFD4 Filename Length       0060 (96)\n+CBFD6 Extra Length          0000 (0)\n+CBFD8 Comment Length        0000 (0)\n+CBFDA Disk Start            0000 (0)\n+CBFDC Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CB9D1 Ext File Attributes   41ED0010 (1106051088)\n+CBFDE Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-CB9D5 Local Header Offset   00005BD5 (23509)\n-CB9D9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CBFE2 Local Header Offset   00005BD5 (23509)\n+CBFE6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCB9D9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCBFE6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xCB9D9: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xCBFE6: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xCB9B1: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCBFBE: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-CBA39 CENTRAL HEADER #211   02014B50 (33639248)\n-CBA3D Created Zip Spec      14 (20) '2.0'\n-CBA3E Created OS            03 (3) 'Unix'\n-CBA3F Extract Zip Spec      0A (10) '1.0'\n-CBA40 Extract OS            00 (0) 'MS-DOS'\n-CBA41 General Purpose Flag  0800 (2048)\n+CC046 CENTRAL HEADER #211   02014B50 (33639248)\n+CC04A Created Zip Spec      14 (20) '2.0'\n+CC04B Created OS            03 (3) 'Unix'\n+CC04C Extract Zip Spec      0A (10) '1.0'\n+CC04D Extract OS            00 (0) 'MS-DOS'\n+CC04E General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-CBA43 Compression Method    0000 (0) 'Stored'\n-CBA45 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CBA49 CRC                   00000000 (0)\n-CBA4D Compressed Size       00000000 (0)\n-CBA51 Uncompressed Size     00000000 (0)\n-CBA55 Filename Length       0064 (100)\n-CBA57 Extra Length          0000 (0)\n-CBA59 Comment Length        0000 (0)\n-CBA5B Disk Start            0000 (0)\n-CBA5D Int File Attributes   0000 (0)\n+CC050 Compression Method    0000 (0) 'Stored'\n+CC052 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CC056 CRC                   00000000 (0)\n+CC05A Compressed Size       00000000 (0)\n+CC05E Uncompressed Size     00000000 (0)\n+CC062 Filename Length       0064 (100)\n+CC064 Extra Length          0000 (0)\n+CC066 Comment Length        0000 (0)\n+CC068 Disk Start            0000 (0)\n+CC06A Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CBA5F Ext File Attributes   41ED0010 (1106051088)\n+CC06C Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-CBA63 Local Header Offset   00005C53 (23635)\n-CBA67 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CC070 Local Header Offset   00005C53 (23635)\n+CC074 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCBA67: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCC074: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xCBA67: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xCC074: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xCBA3F: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCC04C: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-CBACB CENTRAL HEADER #212   02014B50 (33639248)\n-CBACF Created Zip Spec      14 (20) '2.0'\n-CBAD0 Created OS            03 (3) 'Unix'\n-CBAD1 Extract Zip Spec      0A (10) '1.0'\n-CBAD2 Extract OS            00 (0) 'MS-DOS'\n-CBAD3 General Purpose Flag  0800 (2048)\n+CC0D8 CENTRAL HEADER #212   02014B50 (33639248)\n+CC0DC Created Zip Spec      14 (20) '2.0'\n+CC0DD Created OS            03 (3) 'Unix'\n+CC0DE Extract Zip Spec      0A (10) '1.0'\n+CC0DF Extract OS            00 (0) 'MS-DOS'\n+CC0E0 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-CBAD5 Compression Method    0000 (0) 'Stored'\n-CBAD7 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CBADB CRC                   00000000 (0)\n-CBADF Compressed Size       00000000 (0)\n-CBAE3 Uncompressed Size     00000000 (0)\n-CBAE7 Filename Length       005D (93)\n-CBAE9 Extra Length          0000 (0)\n-CBAEB Comment Length        0000 (0)\n-CBAED Disk Start            0000 (0)\n-CBAEF Int File Attributes   0000 (0)\n+CC0E2 Compression Method    0000 (0) 'Stored'\n+CC0E4 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CC0E8 CRC                   00000000 (0)\n+CC0EC Compressed Size       00000000 (0)\n+CC0F0 Uncompressed Size     00000000 (0)\n+CC0F4 Filename Length       005D (93)\n+CC0F6 Extra Length          0000 (0)\n+CC0F8 Comment Length        0000 (0)\n+CC0FA Disk Start            0000 (0)\n+CC0FC Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CBAF1 Ext File Attributes   41ED0010 (1106051088)\n+CC0FE Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-CBAF5 Local Header Offset   00005CD5 (23765)\n-CBAF9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CC102 Local Header Offset   00005CD5 (23765)\n+CC106 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCBAF9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCC106: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xCBAF9: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xCC106: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xCBAD1: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCC0DE: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-CBB56 CENTRAL HEADER #213   02014B50 (33639248)\n-CBB5A Created Zip Spec      14 (20) '2.0'\n-CBB5B Created OS            03 (3) 'Unix'\n-CBB5C Extract Zip Spec      0A (10) '1.0'\n-CBB5D Extract OS            00 (0) 'MS-DOS'\n-CBB5E General Purpose Flag  0800 (2048)\n+CC163 CENTRAL HEADER #213   02014B50 (33639248)\n+CC167 Created Zip Spec      14 (20) '2.0'\n+CC168 Created OS            03 (3) 'Unix'\n+CC169 Extract Zip Spec      0A (10) '1.0'\n+CC16A Extract OS            00 (0) 'MS-DOS'\n+CC16B General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-CBB60 Compression Method    0000 (0) 'Stored'\n-CBB62 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CBB66 CRC                   00000000 (0)\n-CBB6A Compressed Size       00000000 (0)\n-CBB6E Uncompressed Size     00000000 (0)\n-CBB72 Filename Length       0060 (96)\n-CBB74 Extra Length          0000 (0)\n-CBB76 Comment Length        0000 (0)\n-CBB78 Disk Start            0000 (0)\n-CBB7A Int File Attributes   0000 (0)\n+CC16D Compression Method    0000 (0) 'Stored'\n+CC16F Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CC173 CRC                   00000000 (0)\n+CC177 Compressed Size       00000000 (0)\n+CC17B Uncompressed Size     00000000 (0)\n+CC17F Filename Length       0060 (96)\n+CC181 Extra Length          0000 (0)\n+CC183 Comment Length        0000 (0)\n+CC185 Disk Start            0000 (0)\n+CC187 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CBB7C Ext File Attributes   41ED0010 (1106051088)\n+CC189 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-CBB80 Local Header Offset   00005D50 (23888)\n-CBB84 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CC18D Local Header Offset   00005D50 (23888)\n+CC191 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCBB84: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCC191: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xCBB84: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xCC191: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xCBB5C: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCC169: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-CBBE4 CENTRAL HEADER #214   02014B50 (33639248)\n-CBBE8 Created Zip Spec      14 (20) '2.0'\n-CBBE9 Created OS            03 (3) 'Unix'\n-CBBEA Extract Zip Spec      0A (10) '1.0'\n-CBBEB Extract OS            00 (0) 'MS-DOS'\n-CBBEC General Purpose Flag  0800 (2048)\n+CC1F1 CENTRAL HEADER #214   02014B50 (33639248)\n+CC1F5 Created Zip Spec      14 (20) '2.0'\n+CC1F6 Created OS            03 (3) 'Unix'\n+CC1F7 Extract Zip Spec      0A (10) '1.0'\n+CC1F8 Extract OS            00 (0) 'MS-DOS'\n+CC1F9 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-CBBEE Compression Method    0000 (0) 'Stored'\n-CBBF0 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CBBF4 CRC                   00000000 (0)\n-CBBF8 Compressed Size       00000000 (0)\n-CBBFC Uncompressed Size     00000000 (0)\n-CBC00 Filename Length       0066 (102)\n-CBC02 Extra Length          0000 (0)\n-CBC04 Comment Length        0000 (0)\n-CBC06 Disk Start            0000 (0)\n-CBC08 Int File Attributes   0000 (0)\n+CC1FB Compression Method    0000 (0) 'Stored'\n+CC1FD Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CC201 CRC                   00000000 (0)\n+CC205 Compressed Size       00000000 (0)\n+CC209 Uncompressed Size     00000000 (0)\n+CC20D Filename Length       0066 (102)\n+CC20F Extra Length          0000 (0)\n+CC211 Comment Length        0000 (0)\n+CC213 Disk Start            0000 (0)\n+CC215 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CBC0A Ext File Attributes   41ED0010 (1106051088)\n+CC217 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-CBC0E Local Header Offset   00005DCE (24014)\n-CBC12 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CC21B Local Header Offset   00005DCE (24014)\n+CC21F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCBC12: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCC21F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xCBC12: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xCC21F: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xCBBEA: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCC1F7: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-CBC78 CENTRAL HEADER #215   02014B50 (33639248)\n-CBC7C Created Zip Spec      14 (20) '2.0'\n-CBC7D Created OS            03 (3) 'Unix'\n-CBC7E Extract Zip Spec      0A (10) '1.0'\n-CBC7F Extract OS            00 (0) 'MS-DOS'\n-CBC80 General Purpose Flag  0800 (2048)\n+CC285 CENTRAL HEADER #215   02014B50 (33639248)\n+CC289 Created Zip Spec      14 (20) '2.0'\n+CC28A Created OS            03 (3) 'Unix'\n+CC28B Extract Zip Spec      0A (10) '1.0'\n+CC28C Extract OS            00 (0) 'MS-DOS'\n+CC28D General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-CBC82 Compression Method    0000 (0) 'Stored'\n-CBC84 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CBC88 CRC                   00000000 (0)\n-CBC8C Compressed Size       00000000 (0)\n-CBC90 Uncompressed Size     00000000 (0)\n-CBC94 Filename Length       0065 (101)\n-CBC96 Extra Length          0000 (0)\n-CBC98 Comment Length        0000 (0)\n-CBC9A Disk Start            0000 (0)\n-CBC9C Int File Attributes   0000 (0)\n+CC28F Compression Method    0000 (0) 'Stored'\n+CC291 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CC295 CRC                   00000000 (0)\n+CC299 Compressed Size       00000000 (0)\n+CC29D Uncompressed Size     00000000 (0)\n+CC2A1 Filename Length       0065 (101)\n+CC2A3 Extra Length          0000 (0)\n+CC2A5 Comment Length        0000 (0)\n+CC2A7 Disk Start            0000 (0)\n+CC2A9 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CBC9E Ext File Attributes   41ED0010 (1106051088)\n+CC2AB Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-CBCA2 Local Header Offset   00005E52 (24146)\n-CBCA6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CC2AF Local Header Offset   00005E52 (24146)\n+CC2B3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCBCA6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCC2B3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xCBCA6: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xCC2B3: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xCBC7E: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCC28B: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-CBD0B CENTRAL HEADER #216   02014B50 (33639248)\n-CBD0F Created Zip Spec      14 (20) '2.0'\n-CBD10 Created OS            03 (3) 'Unix'\n-CBD11 Extract Zip Spec      0A (10) '1.0'\n-CBD12 Extract OS            00 (0) 'MS-DOS'\n-CBD13 General Purpose Flag  0800 (2048)\n+CC318 CENTRAL HEADER #216   02014B50 (33639248)\n+CC31C Created Zip Spec      14 (20) '2.0'\n+CC31D Created OS            03 (3) 'Unix'\n+CC31E Extract Zip Spec      0A (10) '1.0'\n+CC31F Extract OS            00 (0) 'MS-DOS'\n+CC320 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-CBD15 Compression Method    0000 (0) 'Stored'\n-CBD17 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CBD1B CRC                   00000000 (0)\n-CBD1F Compressed Size       00000000 (0)\n-CBD23 Uncompressed Size     00000000 (0)\n-CBD27 Filename Length       0061 (97)\n-CBD29 Extra Length          0000 (0)\n-CBD2B Comment Length        0000 (0)\n-CBD2D Disk Start            0000 (0)\n-CBD2F Int File Attributes   0000 (0)\n+CC322 Compression Method    0000 (0) 'Stored'\n+CC324 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CC328 CRC                   00000000 (0)\n+CC32C Compressed Size       00000000 (0)\n+CC330 Uncompressed Size     00000000 (0)\n+CC334 Filename Length       0061 (97)\n+CC336 Extra Length          0000 (0)\n+CC338 Comment Length        0000 (0)\n+CC33A Disk Start            0000 (0)\n+CC33C Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CBD31 Ext File Attributes   41ED0010 (1106051088)\n+CC33E Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-CBD35 Local Header Offset   00005ED5 (24277)\n-CBD39 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CC342 Local Header Offset   00005ED5 (24277)\n+CC346 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCBD39: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCC346: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xCBD39: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xCC346: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xCBD11: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCC31E: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-CBD9A CENTRAL HEADER #217   02014B50 (33639248)\n-CBD9E Created Zip Spec      14 (20) '2.0'\n-CBD9F Created OS            03 (3) 'Unix'\n-CBDA0 Extract Zip Spec      0A (10) '1.0'\n-CBDA1 Extract OS            00 (0) 'MS-DOS'\n-CBDA2 General Purpose Flag  0800 (2048)\n+CC3A7 CENTRAL HEADER #217   02014B50 (33639248)\n+CC3AB Created Zip Spec      14 (20) '2.0'\n+CC3AC Created OS            03 (3) 'Unix'\n+CC3AD Extract Zip Spec      0A (10) '1.0'\n+CC3AE Extract OS            00 (0) 'MS-DOS'\n+CC3AF General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-CBDA4 Compression Method    0000 (0) 'Stored'\n-CBDA6 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CBDAA CRC                   00000000 (0)\n-CBDAE Compressed Size       00000000 (0)\n-CBDB2 Uncompressed Size     00000000 (0)\n-CBDB6 Filename Length       005D (93)\n-CBDB8 Extra Length          0000 (0)\n-CBDBA Comment Length        0000 (0)\n-CBDBC Disk Start            0000 (0)\n-CBDBE Int File Attributes   0000 (0)\n+CC3B1 Compression Method    0000 (0) 'Stored'\n+CC3B3 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CC3B7 CRC                   00000000 (0)\n+CC3BB Compressed Size       00000000 (0)\n+CC3BF Uncompressed Size     00000000 (0)\n+CC3C3 Filename Length       005D (93)\n+CC3C5 Extra Length          0000 (0)\n+CC3C7 Comment Length        0000 (0)\n+CC3C9 Disk Start            0000 (0)\n+CC3CB Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CBDC0 Ext File Attributes   41ED0010 (1106051088)\n+CC3CD Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-CBDC4 Local Header Offset   00005F54 (24404)\n-CBDC8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CC3D1 Local Header Offset   00005F54 (24404)\n+CC3D5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCBDC8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCC3D5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xCBDC8: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xCC3D5: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xCBDA0: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCC3AD: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-CBE25 CENTRAL HEADER #218   02014B50 (33639248)\n-CBE29 Created Zip Spec      14 (20) '2.0'\n-CBE2A Created OS            03 (3) 'Unix'\n-CBE2B Extract Zip Spec      0A (10) '1.0'\n-CBE2C Extract OS            00 (0) 'MS-DOS'\n-CBE2D General Purpose Flag  0800 (2048)\n+CC432 CENTRAL HEADER #218   02014B50 (33639248)\n+CC436 Created Zip Spec      14 (20) '2.0'\n+CC437 Created OS            03 (3) 'Unix'\n+CC438 Extract Zip Spec      0A (10) '1.0'\n+CC439 Extract OS            00 (0) 'MS-DOS'\n+CC43A General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-CBE2F Compression Method    0000 (0) 'Stored'\n-CBE31 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CBE35 CRC                   00000000 (0)\n-CBE39 Compressed Size       00000000 (0)\n-CBE3D Uncompressed Size     00000000 (0)\n-CBE41 Filename Length       0061 (97)\n-CBE43 Extra Length          0000 (0)\n-CBE45 Comment Length        0000 (0)\n-CBE47 Disk Start            0000 (0)\n-CBE49 Int File Attributes   0000 (0)\n+CC43C Compression Method    0000 (0) 'Stored'\n+CC43E Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CC442 CRC                   00000000 (0)\n+CC446 Compressed Size       00000000 (0)\n+CC44A Uncompressed Size     00000000 (0)\n+CC44E Filename Length       0061 (97)\n+CC450 Extra Length          0000 (0)\n+CC452 Comment Length        0000 (0)\n+CC454 Disk Start            0000 (0)\n+CC456 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CBE4B Ext File Attributes   41ED0010 (1106051088)\n+CC458 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-CBE4F Local Header Offset   00005FCF (24527)\n-CBE53 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CC45C Local Header Offset   00005FCF (24527)\n+CC460 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCBE53: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCC460: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xCBE53: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xCC460: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xCBE2B: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCC438: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-CBEB4 CENTRAL HEADER #219   02014B50 (33639248)\n-CBEB8 Created Zip Spec      14 (20) '2.0'\n-CBEB9 Created OS            03 (3) 'Unix'\n-CBEBA Extract Zip Spec      0A (10) '1.0'\n-CBEBB Extract OS            00 (0) 'MS-DOS'\n-CBEBC General Purpose Flag  0800 (2048)\n+CC4C1 CENTRAL HEADER #219   02014B50 (33639248)\n+CC4C5 Created Zip Spec      14 (20) '2.0'\n+CC4C6 Created OS            03 (3) 'Unix'\n+CC4C7 Extract Zip Spec      0A (10) '1.0'\n+CC4C8 Extract OS            00 (0) 'MS-DOS'\n+CC4C9 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-CBEBE Compression Method    0000 (0) 'Stored'\n-CBEC0 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CBEC4 CRC                   00000000 (0)\n-CBEC8 Compressed Size       00000000 (0)\n-CBECC Uncompressed Size     00000000 (0)\n-CBED0 Filename Length       0060 (96)\n-CBED2 Extra Length          0000 (0)\n-CBED4 Comment Length        0000 (0)\n-CBED6 Disk Start            0000 (0)\n-CBED8 Int File Attributes   0000 (0)\n+CC4CB Compression Method    0000 (0) 'Stored'\n+CC4CD Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CC4D1 CRC                   00000000 (0)\n+CC4D5 Compressed Size       00000000 (0)\n+CC4D9 Uncompressed Size     00000000 (0)\n+CC4DD Filename Length       0060 (96)\n+CC4DF Extra Length          0000 (0)\n+CC4E1 Comment Length        0000 (0)\n+CC4E3 Disk Start            0000 (0)\n+CC4E5 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CBEDA Ext File Attributes   41ED0010 (1106051088)\n+CC4E7 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-CBEDE Local Header Offset   0000604E (24654)\n-CBEE2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CC4EB Local Header Offset   0000604E (24654)\n+CC4EF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCBEE2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCC4EF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xCBEE2: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xCC4EF: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xCBEBA: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCC4C7: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-CBF42 CENTRAL HEADER #220   02014B50 (33639248)\n-CBF46 Created Zip Spec      14 (20) '2.0'\n-CBF47 Created OS            03 (3) 'Unix'\n-CBF48 Extract Zip Spec      0A (10) '1.0'\n-CBF49 Extract OS            00 (0) 'MS-DOS'\n-CBF4A General Purpose Flag  0800 (2048)\n+CC54F CENTRAL HEADER #220   02014B50 (33639248)\n+CC553 Created Zip Spec      14 (20) '2.0'\n+CC554 Created OS            03 (3) 'Unix'\n+CC555 Extract Zip Spec      0A (10) '1.0'\n+CC556 Extract OS            00 (0) 'MS-DOS'\n+CC557 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-CBF4C Compression Method    0000 (0) 'Stored'\n-CBF4E Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CBF52 CRC                   00000000 (0)\n-CBF56 Compressed Size       00000000 (0)\n-CBF5A Uncompressed Size     00000000 (0)\n-CBF5E Filename Length       0063 (99)\n-CBF60 Extra Length          0000 (0)\n-CBF62 Comment Length        0000 (0)\n-CBF64 Disk Start            0000 (0)\n-CBF66 Int File Attributes   0000 (0)\n+CC559 Compression Method    0000 (0) 'Stored'\n+CC55B Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CC55F CRC                   00000000 (0)\n+CC563 Compressed Size       00000000 (0)\n+CC567 Uncompressed Size     00000000 (0)\n+CC56B Filename Length       0063 (99)\n+CC56D Extra Length          0000 (0)\n+CC56F Comment Length        0000 (0)\n+CC571 Disk Start            0000 (0)\n+CC573 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CBF68 Ext File Attributes   41ED0010 (1106051088)\n+CC575 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-CBF6C Local Header Offset   000060CC (24780)\n-CBF70 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CC579 Local Header Offset   000060CC (24780)\n+CC57D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCBF70: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCC57D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xCBF70: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xCC57D: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xCBF48: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCC555: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-CBFD3 CENTRAL HEADER #221   02014B50 (33639248)\n-CBFD7 Created Zip Spec      14 (20) '2.0'\n-CBFD8 Created OS            03 (3) 'Unix'\n-CBFD9 Extract Zip Spec      0A (10) '1.0'\n-CBFDA Extract OS            00 (0) 'MS-DOS'\n-CBFDB General Purpose Flag  0800 (2048)\n+CC5E0 CENTRAL HEADER #221   02014B50 (33639248)\n+CC5E4 Created Zip Spec      14 (20) '2.0'\n+CC5E5 Created OS            03 (3) 'Unix'\n+CC5E6 Extract Zip Spec      0A (10) '1.0'\n+CC5E7 Extract OS            00 (0) 'MS-DOS'\n+CC5E8 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-CBFDD Compression Method    0000 (0) 'Stored'\n-CBFDF Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CBFE3 CRC                   00000000 (0)\n-CBFE7 Compressed Size       00000000 (0)\n-CBFEB Uncompressed Size     00000000 (0)\n-CBFEF Filename Length       0060 (96)\n-CBFF1 Extra Length          0000 (0)\n-CBFF3 Comment Length        0000 (0)\n-CBFF5 Disk Start            0000 (0)\n-CBFF7 Int File Attributes   0000 (0)\n+CC5EA Compression Method    0000 (0) 'Stored'\n+CC5EC Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CC5F0 CRC                   00000000 (0)\n+CC5F4 Compressed Size       00000000 (0)\n+CC5F8 Uncompressed Size     00000000 (0)\n+CC5FC Filename Length       0060 (96)\n+CC5FE Extra Length          0000 (0)\n+CC600 Comment Length        0000 (0)\n+CC602 Disk Start            0000 (0)\n+CC604 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CBFF9 Ext File Attributes   41ED0010 (1106051088)\n+CC606 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-CBFFD Local Header Offset   0000614D (24909)\n-CC001 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CC60A Local Header Offset   0000614D (24909)\n+CC60E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCC001: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCC60E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xCC001: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xCC60E: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xCBFD9: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCC5E6: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-CC061 CENTRAL HEADER #222   02014B50 (33639248)\n-CC065 Created Zip Spec      14 (20) '2.0'\n-CC066 Created OS            03 (3) 'Unix'\n-CC067 Extract Zip Spec      0A (10) '1.0'\n-CC068 Extract OS            00 (0) 'MS-DOS'\n-CC069 General Purpose Flag  0800 (2048)\n+CC66E CENTRAL HEADER #222   02014B50 (33639248)\n+CC672 Created Zip Spec      14 (20) '2.0'\n+CC673 Created OS            03 (3) 'Unix'\n+CC674 Extract Zip Spec      0A (10) '1.0'\n+CC675 Extract OS            00 (0) 'MS-DOS'\n+CC676 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-CC06B Compression Method    0000 (0) 'Stored'\n-CC06D Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CC071 CRC                   00000000 (0)\n-CC075 Compressed Size       00000000 (0)\n-CC079 Uncompressed Size     00000000 (0)\n-CC07D Filename Length       0059 (89)\n-CC07F Extra Length          0000 (0)\n-CC081 Comment Length        0000 (0)\n-CC083 Disk Start            0000 (0)\n-CC085 Int File Attributes   0000 (0)\n+CC678 Compression Method    0000 (0) 'Stored'\n+CC67A Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CC67E CRC                   00000000 (0)\n+CC682 Compressed Size       00000000 (0)\n+CC686 Uncompressed Size     00000000 (0)\n+CC68A Filename Length       0059 (89)\n+CC68C Extra Length          0000 (0)\n+CC68E Comment Length        0000 (0)\n+CC690 Disk Start            0000 (0)\n+CC692 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CC087 Ext File Attributes   41ED0010 (1106051088)\n+CC694 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-CC08B Local Header Offset   000061CB (25035)\n-CC08F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CC698 Local Header Offset   000061CB (25035)\n+CC69C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCC08F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCC69C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xCC08F: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xCC69C: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xCC067: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCC674: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-CC0E8 CENTRAL HEADER #223   02014B50 (33639248)\n-CC0EC Created Zip Spec      14 (20) '2.0'\n-CC0ED Created OS            03 (3) 'Unix'\n-CC0EE Extract Zip Spec      0A (10) '1.0'\n-CC0EF Extract OS            00 (0) 'MS-DOS'\n-CC0F0 General Purpose Flag  0800 (2048)\n+CC6F5 CENTRAL HEADER #223   02014B50 (33639248)\n+CC6F9 Created Zip Spec      14 (20) '2.0'\n+CC6FA Created OS            03 (3) 'Unix'\n+CC6FB Extract Zip Spec      0A (10) '1.0'\n+CC6FC Extract OS            00 (0) 'MS-DOS'\n+CC6FD General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-CC0F2 Compression Method    0000 (0) 'Stored'\n-CC0F4 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CC0F8 CRC                   00000000 (0)\n-CC0FC Compressed Size       00000000 (0)\n-CC100 Uncompressed Size     00000000 (0)\n-CC104 Filename Length       006A (106)\n-CC106 Extra Length          0000 (0)\n-CC108 Comment Length        0000 (0)\n-CC10A Disk Start            0000 (0)\n-CC10C Int File Attributes   0000 (0)\n+CC6FF Compression Method    0000 (0) 'Stored'\n+CC701 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CC705 CRC                   00000000 (0)\n+CC709 Compressed Size       00000000 (0)\n+CC70D Uncompressed Size     00000000 (0)\n+CC711 Filename Length       006A (106)\n+CC713 Extra Length          0000 (0)\n+CC715 Comment Length        0000 (0)\n+CC717 Disk Start            0000 (0)\n+CC719 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CC10E Ext File Attributes   41ED0010 (1106051088)\n+CC71B Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-CC112 Local Header Offset   00006242 (25154)\n-CC116 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CC71F Local Header Offset   00006242 (25154)\n+CC723 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCC116: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCC723: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xCC116: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xCC723: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xCC0EE: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCC6FB: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-CC180 CENTRAL HEADER #224   02014B50 (33639248)\n-CC184 Created Zip Spec      14 (20) '2.0'\n-CC185 Created OS            03 (3) 'Unix'\n-CC186 Extract Zip Spec      0A (10) '1.0'\n-CC187 Extract OS            00 (0) 'MS-DOS'\n-CC188 General Purpose Flag  0800 (2048)\n+CC78D CENTRAL HEADER #224   02014B50 (33639248)\n+CC791 Created Zip Spec      14 (20) '2.0'\n+CC792 Created OS            03 (3) 'Unix'\n+CC793 Extract Zip Spec      0A (10) '1.0'\n+CC794 Extract OS            00 (0) 'MS-DOS'\n+CC795 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-CC18A Compression Method    0000 (0) 'Stored'\n-CC18C Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CC190 CRC                   00000000 (0)\n-CC194 Compressed Size       00000000 (0)\n-CC198 Uncompressed Size     00000000 (0)\n-CC19C Filename Length       002F (47)\n-CC19E Extra Length          0000 (0)\n-CC1A0 Comment Length        0000 (0)\n-CC1A2 Disk Start            0000 (0)\n-CC1A4 Int File Attributes   0000 (0)\n+CC797 Compression Method    0000 (0) 'Stored'\n+CC799 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CC79D CRC                   00000000 (0)\n+CC7A1 Compressed Size       00000000 (0)\n+CC7A5 Uncompressed Size     00000000 (0)\n+CC7A9 Filename Length       002F (47)\n+CC7AB Extra Length          0000 (0)\n+CC7AD Comment Length        0000 (0)\n+CC7AF Disk Start            0000 (0)\n+CC7B1 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CC1A6 Ext File Attributes   41ED0010 (1106051088)\n+CC7B3 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-CC1AA Local Header Offset   000062CA (25290)\n-CC1AE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CC7B7 Local Header Offset   000062CA (25290)\n+CC7BB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCC1AE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCC7BB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xCC1AE: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xCC7BB: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xCC186: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCC793: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-CC1DD CENTRAL HEADER #225   02014B50 (33639248)\n-CC1E1 Created Zip Spec      14 (20) '2.0'\n-CC1E2 Created OS            03 (3) 'Unix'\n-CC1E3 Extract Zip Spec      0A (10) '1.0'\n-CC1E4 Extract OS            00 (0) 'MS-DOS'\n-CC1E5 General Purpose Flag  0800 (2048)\n+CC7EA CENTRAL HEADER #225   02014B50 (33639248)\n+CC7EE Created Zip Spec      14 (20) '2.0'\n+CC7EF Created OS            03 (3) 'Unix'\n+CC7F0 Extract Zip Spec      0A (10) '1.0'\n+CC7F1 Extract OS            00 (0) 'MS-DOS'\n+CC7F2 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-CC1E7 Compression Method    0000 (0) 'Stored'\n-CC1E9 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CC1ED CRC                   00000000 (0)\n-CC1F1 Compressed Size       00000000 (0)\n-CC1F5 Uncompressed Size     00000000 (0)\n-CC1F9 Filename Length       0038 (56)\n-CC1FB Extra Length          0000 (0)\n-CC1FD Comment Length        0000 (0)\n-CC1FF Disk Start            0000 (0)\n-CC201 Int File Attributes   0000 (0)\n+CC7F4 Compression Method    0000 (0) 'Stored'\n+CC7F6 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CC7FA CRC                   00000000 (0)\n+CC7FE Compressed Size       00000000 (0)\n+CC802 Uncompressed Size     00000000 (0)\n+CC806 Filename Length       0038 (56)\n+CC808 Extra Length          0000 (0)\n+CC80A Comment Length        0000 (0)\n+CC80C Disk Start            0000 (0)\n+CC80E Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CC203 Ext File Attributes   41ED0010 (1106051088)\n+CC810 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-CC207 Local Header Offset   00006317 (25367)\n-CC20B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CC814 Local Header Offset   00006317 (25367)\n+CC818 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCC20B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCC818: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xCC20B: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xCC818: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xCC1E3: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCC7F0: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-CC243 CENTRAL HEADER #226   02014B50 (33639248)\n-CC247 Created Zip Spec      14 (20) '2.0'\n-CC248 Created OS            03 (3) 'Unix'\n-CC249 Extract Zip Spec      0A (10) '1.0'\n-CC24A Extract OS            00 (0) 'MS-DOS'\n-CC24B General Purpose Flag  0800 (2048)\n+CC850 CENTRAL HEADER #226   02014B50 (33639248)\n+CC854 Created Zip Spec      14 (20) '2.0'\n+CC855 Created OS            03 (3) 'Unix'\n+CC856 Extract Zip Spec      0A (10) '1.0'\n+CC857 Extract OS            00 (0) 'MS-DOS'\n+CC858 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-CC24D Compression Method    0000 (0) 'Stored'\n-CC24F Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CC253 CRC                   00000000 (0)\n-CC257 Compressed Size       00000000 (0)\n-CC25B Uncompressed Size     00000000 (0)\n-CC25F Filename Length       006E (110)\n-CC261 Extra Length          0000 (0)\n-CC263 Comment Length        0000 (0)\n-CC265 Disk Start            0000 (0)\n-CC267 Int File Attributes   0000 (0)\n+CC85A Compression Method    0000 (0) 'Stored'\n+CC85C Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CC860 CRC                   00000000 (0)\n+CC864 Compressed Size       00000000 (0)\n+CC868 Uncompressed Size     00000000 (0)\n+CC86C Filename Length       006E (110)\n+CC86E Extra Length          0000 (0)\n+CC870 Comment Length        0000 (0)\n+CC872 Disk Start            0000 (0)\n+CC874 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CC269 Ext File Attributes   41ED0010 (1106051088)\n+CC876 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-CC26D Local Header Offset   0000636D (25453)\n-CC271 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CC87A Local Header Offset   0000636D (25453)\n+CC87E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCC271: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCC87E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xCC271: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xCC87E: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xCC249: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCC856: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-CC2DF CENTRAL HEADER #227   02014B50 (33639248)\n-CC2E3 Created Zip Spec      14 (20) '2.0'\n-CC2E4 Created OS            03 (3) 'Unix'\n-CC2E5 Extract Zip Spec      0A (10) '1.0'\n-CC2E6 Extract OS            00 (0) 'MS-DOS'\n-CC2E7 General Purpose Flag  0800 (2048)\n+CC8EC CENTRAL HEADER #227   02014B50 (33639248)\n+CC8F0 Created Zip Spec      14 (20) '2.0'\n+CC8F1 Created OS            03 (3) 'Unix'\n+CC8F2 Extract Zip Spec      0A (10) '1.0'\n+CC8F3 Extract OS            00 (0) 'MS-DOS'\n+CC8F4 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-CC2E9 Compression Method    0000 (0) 'Stored'\n-CC2EB Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CC2EF CRC                   00000000 (0)\n-CC2F3 Compressed Size       00000000 (0)\n-CC2F7 Uncompressed Size     00000000 (0)\n-CC2FB Filename Length       0033 (51)\n-CC2FD Extra Length          0000 (0)\n-CC2FF Comment Length        0000 (0)\n-CC301 Disk Start            0000 (0)\n-CC303 Int File Attributes   0000 (0)\n+CC8F6 Compression Method    0000 (0) 'Stored'\n+CC8F8 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CC8FC CRC                   00000000 (0)\n+CC900 Compressed Size       00000000 (0)\n+CC904 Uncompressed Size     00000000 (0)\n+CC908 Filename Length       0033 (51)\n+CC90A Extra Length          0000 (0)\n+CC90C Comment Length        0000 (0)\n+CC90E Disk Start            0000 (0)\n+CC910 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CC305 Ext File Attributes   41ED0010 (1106051088)\n+CC912 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-CC309 Local Header Offset   000063F9 (25593)\n-CC30D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CC916 Local Header Offset   000063F9 (25593)\n+CC91A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCC30D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCC91A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xCC30D: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xCC91A: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xCC2E5: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCC8F2: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-CC340 CENTRAL HEADER #228   02014B50 (33639248)\n-CC344 Created Zip Spec      14 (20) '2.0'\n-CC345 Created OS            03 (3) 'Unix'\n-CC346 Extract Zip Spec      0A (10) '1.0'\n-CC347 Extract OS            00 (0) 'MS-DOS'\n-CC348 General Purpose Flag  0800 (2048)\n+CC94D CENTRAL HEADER #228   02014B50 (33639248)\n+CC951 Created Zip Spec      14 (20) '2.0'\n+CC952 Created OS            03 (3) 'Unix'\n+CC953 Extract Zip Spec      0A (10) '1.0'\n+CC954 Extract OS            00 (0) 'MS-DOS'\n+CC955 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-CC34A Compression Method    0000 (0) 'Stored'\n-CC34C Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CC350 CRC                   00000000 (0)\n-CC354 Compressed Size       00000000 (0)\n-CC358 Uncompressed Size     00000000 (0)\n-CC35C Filename Length       003C (60)\n-CC35E Extra Length          0000 (0)\n-CC360 Comment Length        0000 (0)\n-CC362 Disk Start            0000 (0)\n-CC364 Int File Attributes   0000 (0)\n+CC957 Compression Method    0000 (0) 'Stored'\n+CC959 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CC95D CRC                   00000000 (0)\n+CC961 Compressed Size       00000000 (0)\n+CC965 Uncompressed Size     00000000 (0)\n+CC969 Filename Length       003C (60)\n+CC96B Extra Length          0000 (0)\n+CC96D Comment Length        0000 (0)\n+CC96F Disk Start            0000 (0)\n+CC971 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CC366 Ext File Attributes   41ED0010 (1106051088)\n+CC973 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-CC36A Local Header Offset   0000644A (25674)\n-CC36E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CC977 Local Header Offset   0000644A (25674)\n+CC97B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCC36E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCC97B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xCC36E: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xCC97B: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xCC346: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCC953: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-CC3AA CENTRAL HEADER #229   02014B50 (33639248)\n-CC3AE Created Zip Spec      14 (20) '2.0'\n-CC3AF Created OS            03 (3) 'Unix'\n-CC3B0 Extract Zip Spec      0A (10) '1.0'\n-CC3B1 Extract OS            00 (0) 'MS-DOS'\n-CC3B2 General Purpose Flag  0800 (2048)\n+CC9B7 CENTRAL HEADER #229   02014B50 (33639248)\n+CC9BB Created Zip Spec      14 (20) '2.0'\n+CC9BC Created OS            03 (3) 'Unix'\n+CC9BD Extract Zip Spec      0A (10) '1.0'\n+CC9BE Extract OS            00 (0) 'MS-DOS'\n+CC9BF General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-CC3B4 Compression Method    0000 (0) 'Stored'\n-CC3B6 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CC3BA CRC                   00000000 (0)\n-CC3BE Compressed Size       00000000 (0)\n-CC3C2 Uncompressed Size     00000000 (0)\n-CC3C6 Filename Length       0072 (114)\n-CC3C8 Extra Length          0000 (0)\n-CC3CA Comment Length        0000 (0)\n-CC3CC Disk Start            0000 (0)\n-CC3CE Int File Attributes   0000 (0)\n+CC9C1 Compression Method    0000 (0) 'Stored'\n+CC9C3 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CC9C7 CRC                   00000000 (0)\n+CC9CB Compressed Size       00000000 (0)\n+CC9CF Uncompressed Size     00000000 (0)\n+CC9D3 Filename Length       0072 (114)\n+CC9D5 Extra Length          0000 (0)\n+CC9D7 Comment Length        0000 (0)\n+CC9D9 Disk Start            0000 (0)\n+CC9DB Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CC3D0 Ext File Attributes   41ED0010 (1106051088)\n+CC9DD Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-CC3D4 Local Header Offset   000064A4 (25764)\n-CC3D8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CC9E1 Local Header Offset   000064A4 (25764)\n+CC9E5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCC3D8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCC9E5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xCC3D8: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xCC9E5: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xCC3B0: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCC9BD: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-CC44A CENTRAL HEADER #230   02014B50 (33639248)\n-CC44E Created Zip Spec      14 (20) '2.0'\n-CC44F Created OS            03 (3) 'Unix'\n-CC450 Extract Zip Spec      0A (10) '1.0'\n-CC451 Extract OS            00 (0) 'MS-DOS'\n-CC452 General Purpose Flag  0800 (2048)\n+CCA57 CENTRAL HEADER #230   02014B50 (33639248)\n+CCA5B Created Zip Spec      14 (20) '2.0'\n+CCA5C Created OS            03 (3) 'Unix'\n+CCA5D Extract Zip Spec      0A (10) '1.0'\n+CCA5E Extract OS            00 (0) 'MS-DOS'\n+CCA5F General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-CC454 Compression Method    0000 (0) 'Stored'\n-CC456 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CC45A CRC                   00000000 (0)\n-CC45E Compressed Size       00000000 (0)\n-CC462 Uncompressed Size     00000000 (0)\n-CC466 Filename Length       0030 (48)\n-CC468 Extra Length          0000 (0)\n-CC46A Comment Length        0000 (0)\n-CC46C Disk Start            0000 (0)\n-CC46E Int File Attributes   0000 (0)\n+CCA61 Compression Method    0000 (0) 'Stored'\n+CCA63 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CCA67 CRC                   00000000 (0)\n+CCA6B Compressed Size       00000000 (0)\n+CCA6F Uncompressed Size     00000000 (0)\n+CCA73 Filename Length       0030 (48)\n+CCA75 Extra Length          0000 (0)\n+CCA77 Comment Length        0000 (0)\n+CCA79 Disk Start            0000 (0)\n+CCA7B Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CC470 Ext File Attributes   41ED0010 (1106051088)\n+CCA7D Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-CC474 Local Header Offset   00006534 (25908)\n-CC478 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CCA81 Local Header Offset   00006534 (25908)\n+CCA85 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCC478: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCCA85: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xCC478: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xCCA85: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xCC450: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCCA5D: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-CC4A8 CENTRAL HEADER #231   02014B50 (33639248)\n-CC4AC Created Zip Spec      14 (20) '2.0'\n-CC4AD Created OS            03 (3) 'Unix'\n-CC4AE Extract Zip Spec      0A (10) '1.0'\n-CC4AF Extract OS            00 (0) 'MS-DOS'\n-CC4B0 General Purpose Flag  0800 (2048)\n+CCAB5 CENTRAL HEADER #231   02014B50 (33639248)\n+CCAB9 Created Zip Spec      14 (20) '2.0'\n+CCABA Created OS            03 (3) 'Unix'\n+CCABB Extract Zip Spec      0A (10) '1.0'\n+CCABC Extract OS            00 (0) 'MS-DOS'\n+CCABD General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-CC4B2 Compression Method    0000 (0) 'Stored'\n-CC4B4 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CC4B8 CRC                   00000000 (0)\n-CC4BC Compressed Size       00000000 (0)\n-CC4C0 Uncompressed Size     00000000 (0)\n-CC4C4 Filename Length       0039 (57)\n-CC4C6 Extra Length          0000 (0)\n-CC4C8 Comment Length        0000 (0)\n-CC4CA Disk Start            0000 (0)\n-CC4CC Int File Attributes   0000 (0)\n+CCABF Compression Method    0000 (0) 'Stored'\n+CCAC1 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CCAC5 CRC                   00000000 (0)\n+CCAC9 Compressed Size       00000000 (0)\n+CCACD Uncompressed Size     00000000 (0)\n+CCAD1 Filename Length       0039 (57)\n+CCAD3 Extra Length          0000 (0)\n+CCAD5 Comment Length        0000 (0)\n+CCAD7 Disk Start            0000 (0)\n+CCAD9 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CC4CE Ext File Attributes   41ED0010 (1106051088)\n+CCADB Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-CC4D2 Local Header Offset   00006582 (25986)\n-CC4D6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CCADF Local Header Offset   00006582 (25986)\n+CCAE3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCC4D6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCCAE3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xCC4D6: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xCCAE3: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xCC4AE: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCCABB: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-CC50F CENTRAL HEADER #232   02014B50 (33639248)\n-CC513 Created Zip Spec      14 (20) '2.0'\n-CC514 Created OS            03 (3) 'Unix'\n-CC515 Extract Zip Spec      0A (10) '1.0'\n-CC516 Extract OS            00 (0) 'MS-DOS'\n-CC517 General Purpose Flag  0800 (2048)\n+CCB1C CENTRAL HEADER #232   02014B50 (33639248)\n+CCB20 Created Zip Spec      14 (20) '2.0'\n+CCB21 Created OS            03 (3) 'Unix'\n+CCB22 Extract Zip Spec      0A (10) '1.0'\n+CCB23 Extract OS            00 (0) 'MS-DOS'\n+CCB24 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-CC519 Compression Method    0000 (0) 'Stored'\n-CC51B Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CC51F CRC                   00000000 (0)\n-CC523 Compressed Size       00000000 (0)\n-CC527 Uncompressed Size     00000000 (0)\n-CC52B Filename Length       007D (125)\n-CC52D Extra Length          0000 (0)\n-CC52F Comment Length        0000 (0)\n-CC531 Disk Start            0000 (0)\n-CC533 Int File Attributes   0000 (0)\n+CCB26 Compression Method    0000 (0) 'Stored'\n+CCB28 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CCB2C CRC                   00000000 (0)\n+CCB30 Compressed Size       00000000 (0)\n+CCB34 Uncompressed Size     00000000 (0)\n+CCB38 Filename Length       007D (125)\n+CCB3A Extra Length          0000 (0)\n+CCB3C Comment Length        0000 (0)\n+CCB3E Disk Start            0000 (0)\n+CCB40 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CC535 Ext File Attributes   41ED0010 (1106051088)\n+CCB42 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-CC539 Local Header Offset   000065D9 (26073)\n-CC53D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CCB46 Local Header Offset   000065D9 (26073)\n+CCB4A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCC53D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCCB4A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xCC53D: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xCCB4A: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xCC515: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCCB22: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-CC5BA CENTRAL HEADER #233   02014B50 (33639248)\n-CC5BE Created Zip Spec      14 (20) '2.0'\n-CC5BF Created OS            03 (3) 'Unix'\n-CC5C0 Extract Zip Spec      0A (10) '1.0'\n-CC5C1 Extract OS            00 (0) 'MS-DOS'\n-CC5C2 General Purpose Flag  0800 (2048)\n+CCBC7 CENTRAL HEADER #233   02014B50 (33639248)\n+CCBCB Created Zip Spec      14 (20) '2.0'\n+CCBCC Created OS            03 (3) 'Unix'\n+CCBCD Extract Zip Spec      0A (10) '1.0'\n+CCBCE Extract OS            00 (0) 'MS-DOS'\n+CCBCF General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-CC5C4 Compression Method    0000 (0) 'Stored'\n-CC5C6 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CC5CA CRC                   00000000 (0)\n-CC5CE Compressed Size       00000000 (0)\n-CC5D2 Uncompressed Size     00000000 (0)\n-CC5D6 Filename Length       0031 (49)\n-CC5D8 Extra Length          0000 (0)\n-CC5DA Comment Length        0000 (0)\n-CC5DC Disk Start            0000 (0)\n-CC5DE Int File Attributes   0000 (0)\n+CCBD1 Compression Method    0000 (0) 'Stored'\n+CCBD3 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CCBD7 CRC                   00000000 (0)\n+CCBDB Compressed Size       00000000 (0)\n+CCBDF Uncompressed Size     00000000 (0)\n+CCBE3 Filename Length       0031 (49)\n+CCBE5 Extra Length          0000 (0)\n+CCBE7 Comment Length        0000 (0)\n+CCBE9 Disk Start            0000 (0)\n+CCBEB Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CC5E0 Ext File Attributes   41ED0010 (1106051088)\n+CCBED Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-CC5E4 Local Header Offset   00006674 (26228)\n-CC5E8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CCBF1 Local Header Offset   00006674 (26228)\n+CCBF5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCC5E8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCCBF5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xCC5E8: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xCCBF5: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xCC5C0: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCCBCD: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-CC619 CENTRAL HEADER #234   02014B50 (33639248)\n-CC61D Created Zip Spec      14 (20) '2.0'\n-CC61E Created OS            03 (3) 'Unix'\n-CC61F Extract Zip Spec      0A (10) '1.0'\n-CC620 Extract OS            00 (0) 'MS-DOS'\n-CC621 General Purpose Flag  0800 (2048)\n+CCC26 CENTRAL HEADER #234   02014B50 (33639248)\n+CCC2A Created Zip Spec      14 (20) '2.0'\n+CCC2B Created OS            03 (3) 'Unix'\n+CCC2C Extract Zip Spec      0A (10) '1.0'\n+CCC2D Extract OS            00 (0) 'MS-DOS'\n+CCC2E General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-CC623 Compression Method    0000 (0) 'Stored'\n-CC625 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CC629 CRC                   00000000 (0)\n-CC62D Compressed Size       00000000 (0)\n-CC631 Uncompressed Size     00000000 (0)\n-CC635 Filename Length       003A (58)\n-CC637 Extra Length          0000 (0)\n-CC639 Comment Length        0000 (0)\n-CC63B Disk Start            0000 (0)\n-CC63D Int File Attributes   0000 (0)\n+CCC30 Compression Method    0000 (0) 'Stored'\n+CCC32 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CCC36 CRC                   00000000 (0)\n+CCC3A Compressed Size       00000000 (0)\n+CCC3E Uncompressed Size     00000000 (0)\n+CCC42 Filename Length       003A (58)\n+CCC44 Extra Length          0000 (0)\n+CCC46 Comment Length        0000 (0)\n+CCC48 Disk Start            0000 (0)\n+CCC4A Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CC63F Ext File Attributes   41ED0010 (1106051088)\n+CCC4C Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-CC643 Local Header Offset   000066C3 (26307)\n-CC647 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CCC50 Local Header Offset   000066C3 (26307)\n+CCC54 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCC647: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCCC54: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xCC647: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xCCC54: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xCC61F: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCCC2C: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-CC681 CENTRAL HEADER #235   02014B50 (33639248)\n-CC685 Created Zip Spec      14 (20) '2.0'\n-CC686 Created OS            03 (3) 'Unix'\n-CC687 Extract Zip Spec      0A (10) '1.0'\n-CC688 Extract OS            00 (0) 'MS-DOS'\n-CC689 General Purpose Flag  0800 (2048)\n+CCC8E CENTRAL HEADER #235   02014B50 (33639248)\n+CCC92 Created Zip Spec      14 (20) '2.0'\n+CCC93 Created OS            03 (3) 'Unix'\n+CCC94 Extract Zip Spec      0A (10) '1.0'\n+CCC95 Extract OS            00 (0) 'MS-DOS'\n+CCC96 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-CC68B Compression Method    0000 (0) 'Stored'\n-CC68D Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CC691 CRC                   00000000 (0)\n-CC695 Compressed Size       00000000 (0)\n-CC699 Uncompressed Size     00000000 (0)\n-CC69D Filename Length       006E (110)\n-CC69F Extra Length          0000 (0)\n-CC6A1 Comment Length        0000 (0)\n-CC6A3 Disk Start            0000 (0)\n-CC6A5 Int File Attributes   0000 (0)\n+CCC98 Compression Method    0000 (0) 'Stored'\n+CCC9A Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CCC9E CRC                   00000000 (0)\n+CCCA2 Compressed Size       00000000 (0)\n+CCCA6 Uncompressed Size     00000000 (0)\n+CCCAA Filename Length       006E (110)\n+CCCAC Extra Length          0000 (0)\n+CCCAE Comment Length        0000 (0)\n+CCCB0 Disk Start            0000 (0)\n+CCCB2 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CC6A7 Ext File Attributes   41ED0010 (1106051088)\n+CCCB4 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-CC6AB Local Header Offset   0000671B (26395)\n-CC6AF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CCCB8 Local Header Offset   0000671B (26395)\n+CCCBC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCC6AF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCCCBC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xCC6AF: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xCCCBC: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xCC687: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCCC94: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-CC71D CENTRAL HEADER #236   02014B50 (33639248)\n-CC721 Created Zip Spec      14 (20) '2.0'\n-CC722 Created OS            03 (3) 'Unix'\n-CC723 Extract Zip Spec      0A (10) '1.0'\n-CC724 Extract OS            00 (0) 'MS-DOS'\n-CC725 General Purpose Flag  0800 (2048)\n+CCD2A CENTRAL HEADER #236   02014B50 (33639248)\n+CCD2E Created Zip Spec      14 (20) '2.0'\n+CCD2F Created OS            03 (3) 'Unix'\n+CCD30 Extract Zip Spec      0A (10) '1.0'\n+CCD31 Extract OS            00 (0) 'MS-DOS'\n+CCD32 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-CC727 Compression Method    0000 (0) 'Stored'\n-CC729 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CC72D CRC                   00000000 (0)\n-CC731 Compressed Size       00000000 (0)\n-CC735 Uncompressed Size     00000000 (0)\n-CC739 Filename Length       0026 (38)\n-CC73B Extra Length          0000 (0)\n-CC73D Comment Length        0000 (0)\n-CC73F Disk Start            0000 (0)\n-CC741 Int File Attributes   0000 (0)\n+CCD34 Compression Method    0000 (0) 'Stored'\n+CCD36 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CCD3A CRC                   00000000 (0)\n+CCD3E Compressed Size       00000000 (0)\n+CCD42 Uncompressed Size     00000000 (0)\n+CCD46 Filename Length       0026 (38)\n+CCD48 Extra Length          0000 (0)\n+CCD4A Comment Length        0000 (0)\n+CCD4C Disk Start            0000 (0)\n+CCD4E Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CC743 Ext File Attributes   41ED0010 (1106051088)\n+CCD50 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-CC747 Local Header Offset   000067A7 (26535)\n-CC74B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CCD54 Local Header Offset   000067A7 (26535)\n+CCD58 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCC74B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCCD58: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xCC74B: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xCCD58: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xCC723: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCCD30: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-CC771 CENTRAL HEADER #237   02014B50 (33639248)\n-CC775 Created Zip Spec      14 (20) '2.0'\n-CC776 Created OS            03 (3) 'Unix'\n-CC777 Extract Zip Spec      0A (10) '1.0'\n-CC778 Extract OS            00 (0) 'MS-DOS'\n-CC779 General Purpose Flag  0800 (2048)\n+CCD7E CENTRAL HEADER #237   02014B50 (33639248)\n+CCD82 Created Zip Spec      14 (20) '2.0'\n+CCD83 Created OS            03 (3) 'Unix'\n+CCD84 Extract Zip Spec      0A (10) '1.0'\n+CCD85 Extract OS            00 (0) 'MS-DOS'\n+CCD86 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-CC77B Compression Method    0000 (0) 'Stored'\n-CC77D Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CC781 CRC                   00000000 (0)\n-CC785 Compressed Size       00000000 (0)\n-CC789 Uncompressed Size     00000000 (0)\n-CC78D Filename Length       002F (47)\n-CC78F Extra Length          0000 (0)\n-CC791 Comment Length        0000 (0)\n-CC793 Disk Start            0000 (0)\n-CC795 Int File Attributes   0000 (0)\n+CCD88 Compression Method    0000 (0) 'Stored'\n+CCD8A Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CCD8E CRC                   00000000 (0)\n+CCD92 Compressed Size       00000000 (0)\n+CCD96 Uncompressed Size     00000000 (0)\n+CCD9A Filename Length       002F (47)\n+CCD9C Extra Length          0000 (0)\n+CCD9E Comment Length        0000 (0)\n+CCDA0 Disk Start            0000 (0)\n+CCDA2 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CC797 Ext File Attributes   41ED0010 (1106051088)\n+CCDA4 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-CC79B Local Header Offset   000067EB (26603)\n-CC79F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CCDA8 Local Header Offset   000067EB (26603)\n+CCDAC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCC79F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCCDAC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xCC79F: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xCCDAC: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xCC777: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCCD84: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-CC7CE CENTRAL HEADER #238   02014B50 (33639248)\n-CC7D2 Created Zip Spec      14 (20) '2.0'\n-CC7D3 Created OS            03 (3) 'Unix'\n-CC7D4 Extract Zip Spec      0A (10) '1.0'\n-CC7D5 Extract OS            00 (0) 'MS-DOS'\n-CC7D6 General Purpose Flag  0800 (2048)\n+CCDDB CENTRAL HEADER #238   02014B50 (33639248)\n+CCDDF Created Zip Spec      14 (20) '2.0'\n+CCDE0 Created OS            03 (3) 'Unix'\n+CCDE1 Extract Zip Spec      0A (10) '1.0'\n+CCDE2 Extract OS            00 (0) 'MS-DOS'\n+CCDE3 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-CC7D8 Compression Method    0000 (0) 'Stored'\n-CC7DA Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CC7DE CRC                   00000000 (0)\n-CC7E2 Compressed Size       00000000 (0)\n-CC7E6 Uncompressed Size     00000000 (0)\n-CC7EA Filename Length       005D (93)\n-CC7EC Extra Length          0000 (0)\n-CC7EE Comment Length        0000 (0)\n-CC7F0 Disk Start            0000 (0)\n-CC7F2 Int File Attributes   0000 (0)\n+CCDE5 Compression Method    0000 (0) 'Stored'\n+CCDE7 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CCDEB CRC                   00000000 (0)\n+CCDEF Compressed Size       00000000 (0)\n+CCDF3 Uncompressed Size     00000000 (0)\n+CCDF7 Filename Length       005D (93)\n+CCDF9 Extra Length          0000 (0)\n+CCDFB Comment Length        0000 (0)\n+CCDFD Disk Start            0000 (0)\n+CCDFF Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CC7F4 Ext File Attributes   41ED0010 (1106051088)\n+CCE01 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-CC7F8 Local Header Offset   00006838 (26680)\n-CC7FC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CCE05 Local Header Offset   00006838 (26680)\n+CCE09 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCC7FC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCCE09: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xCC7FC: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xCCE09: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xCC7D4: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCCDE1: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-CC859 CENTRAL HEADER #239   02014B50 (33639248)\n-CC85D Created Zip Spec      14 (20) '2.0'\n-CC85E Created OS            03 (3) 'Unix'\n-CC85F Extract Zip Spec      0A (10) '1.0'\n-CC860 Extract OS            00 (0) 'MS-DOS'\n-CC861 General Purpose Flag  0800 (2048)\n+CCE66 CENTRAL HEADER #239   02014B50 (33639248)\n+CCE6A Created Zip Spec      14 (20) '2.0'\n+CCE6B Created OS            03 (3) 'Unix'\n+CCE6C Extract Zip Spec      0A (10) '1.0'\n+CCE6D Extract OS            00 (0) 'MS-DOS'\n+CCE6E General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-CC863 Compression Method    0000 (0) 'Stored'\n-CC865 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CC869 CRC                   00000000 (0)\n-CC86D Compressed Size       00000000 (0)\n-CC871 Uncompressed Size     00000000 (0)\n-CC875 Filename Length       0063 (99)\n-CC877 Extra Length          0000 (0)\n-CC879 Comment Length        0000 (0)\n-CC87B Disk Start            0000 (0)\n-CC87D Int File Attributes   0000 (0)\n+CCE70 Compression Method    0000 (0) 'Stored'\n+CCE72 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CCE76 CRC                   00000000 (0)\n+CCE7A Compressed Size       00000000 (0)\n+CCE7E Uncompressed Size     00000000 (0)\n+CCE82 Filename Length       0063 (99)\n+CCE84 Extra Length          0000 (0)\n+CCE86 Comment Length        0000 (0)\n+CCE88 Disk Start            0000 (0)\n+CCE8A Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CC87F Ext File Attributes   41ED0010 (1106051088)\n+CCE8C Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-CC883 Local Header Offset   000068B3 (26803)\n-CC887 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CCE90 Local Header Offset   000068B3 (26803)\n+CCE94 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCC887: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCCE94: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xCC887: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xCCE94: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xCC85F: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCCE6C: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-CC8EA CENTRAL HEADER #240   02014B50 (33639248)\n-CC8EE Created Zip Spec      14 (20) '2.0'\n-CC8EF Created OS            03 (3) 'Unix'\n-CC8F0 Extract Zip Spec      0A (10) '1.0'\n-CC8F1 Extract OS            00 (0) 'MS-DOS'\n-CC8F2 General Purpose Flag  0800 (2048)\n+CCEF7 CENTRAL HEADER #240   02014B50 (33639248)\n+CCEFB Created Zip Spec      14 (20) '2.0'\n+CCEFC Created OS            03 (3) 'Unix'\n+CCEFD Extract Zip Spec      0A (10) '1.0'\n+CCEFE Extract OS            00 (0) 'MS-DOS'\n+CCEFF General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-CC8F4 Compression Method    0000 (0) 'Stored'\n-CC8F6 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CC8FA CRC                   00000000 (0)\n-CC8FE Compressed Size       00000000 (0)\n-CC902 Uncompressed Size     00000000 (0)\n-CC906 Filename Length       002F (47)\n-CC908 Extra Length          0000 (0)\n-CC90A Comment Length        0000 (0)\n-CC90C Disk Start            0000 (0)\n-CC90E Int File Attributes   0000 (0)\n+CCF01 Compression Method    0000 (0) 'Stored'\n+CCF03 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CCF07 CRC                   00000000 (0)\n+CCF0B Compressed Size       00000000 (0)\n+CCF0F Uncompressed Size     00000000 (0)\n+CCF13 Filename Length       002F (47)\n+CCF15 Extra Length          0000 (0)\n+CCF17 Comment Length        0000 (0)\n+CCF19 Disk Start            0000 (0)\n+CCF1B Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CC910 Ext File Attributes   41ED0010 (1106051088)\n+CCF1D Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-CC914 Local Header Offset   00006934 (26932)\n-CC918 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CCF21 Local Header Offset   00006934 (26932)\n+CCF25 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCC918: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCCF25: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xCC918: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xCCF25: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xCC8F0: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCCEFD: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-CC947 CENTRAL HEADER #241   02014B50 (33639248)\n-CC94B Created Zip Spec      14 (20) '2.0'\n-CC94C Created OS            03 (3) 'Unix'\n-CC94D Extract Zip Spec      0A (10) '1.0'\n-CC94E Extract OS            00 (0) 'MS-DOS'\n-CC94F General Purpose Flag  0800 (2048)\n+CCF54 CENTRAL HEADER #241   02014B50 (33639248)\n+CCF58 Created Zip Spec      14 (20) '2.0'\n+CCF59 Created OS            03 (3) 'Unix'\n+CCF5A Extract Zip Spec      0A (10) '1.0'\n+CCF5B Extract OS            00 (0) 'MS-DOS'\n+CCF5C General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-CC951 Compression Method    0000 (0) 'Stored'\n-CC953 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CC957 CRC                   00000000 (0)\n-CC95B Compressed Size       00000000 (0)\n-CC95F Uncompressed Size     00000000 (0)\n-CC963 Filename Length       0038 (56)\n-CC965 Extra Length          0000 (0)\n-CC967 Comment Length        0000 (0)\n-CC969 Disk Start            0000 (0)\n-CC96B Int File Attributes   0000 (0)\n+CCF5E Compression Method    0000 (0) 'Stored'\n+CCF60 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CCF64 CRC                   00000000 (0)\n+CCF68 Compressed Size       00000000 (0)\n+CCF6C Uncompressed Size     00000000 (0)\n+CCF70 Filename Length       0038 (56)\n+CCF72 Extra Length          0000 (0)\n+CCF74 Comment Length        0000 (0)\n+CCF76 Disk Start            0000 (0)\n+CCF78 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CC96D Ext File Attributes   41ED0010 (1106051088)\n+CCF7A Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-CC971 Local Header Offset   00006981 (27009)\n-CC975 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CCF7E Local Header Offset   00006981 (27009)\n+CCF82 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCC975: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCCF82: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xCC975: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xCCF82: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xCC94D: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCCF5A: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-CC9AD CENTRAL HEADER #242   02014B50 (33639248)\n-CC9B1 Created Zip Spec      14 (20) '2.0'\n-CC9B2 Created OS            03 (3) 'Unix'\n-CC9B3 Extract Zip Spec      0A (10) '1.0'\n-CC9B4 Extract OS            00 (0) 'MS-DOS'\n-CC9B5 General Purpose Flag  0800 (2048)\n+CCFBA CENTRAL HEADER #242   02014B50 (33639248)\n+CCFBE Created Zip Spec      14 (20) '2.0'\n+CCFBF Created OS            03 (3) 'Unix'\n+CCFC0 Extract Zip Spec      0A (10) '1.0'\n+CCFC1 Extract OS            00 (0) 'MS-DOS'\n+CCFC2 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-CC9B7 Compression Method    0000 (0) 'Stored'\n-CC9B9 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CC9BD CRC                   00000000 (0)\n-CC9C1 Compressed Size       00000000 (0)\n-CC9C5 Uncompressed Size     00000000 (0)\n-CC9C9 Filename Length       006B (107)\n-CC9CB Extra Length          0000 (0)\n-CC9CD Comment Length        0000 (0)\n-CC9CF Disk Start            0000 (0)\n-CC9D1 Int File Attributes   0000 (0)\n+CCFC4 Compression Method    0000 (0) 'Stored'\n+CCFC6 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CCFCA CRC                   00000000 (0)\n+CCFCE Compressed Size       00000000 (0)\n+CCFD2 Uncompressed Size     00000000 (0)\n+CCFD6 Filename Length       006B (107)\n+CCFD8 Extra Length          0000 (0)\n+CCFDA Comment Length        0000 (0)\n+CCFDC Disk Start            0000 (0)\n+CCFDE Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CC9D3 Ext File Attributes   41ED0010 (1106051088)\n+CCFE0 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-CC9D7 Local Header Offset   000069D7 (27095)\n-CC9DB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CCFE4 Local Header Offset   000069D7 (27095)\n+CCFE8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCC9DB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCCFE8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xCC9DB: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xCCFE8: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xCC9B3: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCCFC0: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-CCA46 CENTRAL HEADER #243   02014B50 (33639248)\n-CCA4A Created Zip Spec      14 (20) '2.0'\n-CCA4B Created OS            03 (3) 'Unix'\n-CCA4C Extract Zip Spec      0A (10) '1.0'\n-CCA4D Extract OS            00 (0) 'MS-DOS'\n-CCA4E General Purpose Flag  0800 (2048)\n+CD053 CENTRAL HEADER #243   02014B50 (33639248)\n+CD057 Created Zip Spec      14 (20) '2.0'\n+CD058 Created OS            03 (3) 'Unix'\n+CD059 Extract Zip Spec      0A (10) '1.0'\n+CD05A Extract OS            00 (0) 'MS-DOS'\n+CD05B General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-CCA50 Compression Method    0000 (0) 'Stored'\n-CCA52 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CCA56 CRC                   00000000 (0)\n-CCA5A Compressed Size       00000000 (0)\n-CCA5E Uncompressed Size     00000000 (0)\n-CCA62 Filename Length       000F (15)\n-CCA64 Extra Length          0000 (0)\n-CCA66 Comment Length        0000 (0)\n-CCA68 Disk Start            0000 (0)\n-CCA6A Int File Attributes   0000 (0)\n+CD05D Compression Method    0000 (0) 'Stored'\n+CD05F Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CD063 CRC                   00000000 (0)\n+CD067 Compressed Size       00000000 (0)\n+CD06B Uncompressed Size     00000000 (0)\n+CD06F Filename Length       000F (15)\n+CD071 Extra Length          0000 (0)\n+CD073 Comment Length        0000 (0)\n+CD075 Disk Start            0000 (0)\n+CD077 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CCA6C Ext File Attributes   41ED0010 (1106051088)\n+CD079 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-CCA70 Local Header Offset   00006A60 (27232)\n-CCA74 Filename              'XXXXXXXXXXXXXXX'\n+CD07D Local Header Offset   00006A60 (27232)\n+CD081 Filename              'XXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCCA74: Filename 'XXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCD081: Filename 'XXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xCCA74: Directory 'XXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xCD081: Directory 'XXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xCCA4C: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCD059: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXX'\n #\n \n-CCA83 CENTRAL HEADER #244   02014B50 (33639248)\n-CCA87 Created Zip Spec      14 (20) '2.0'\n-CCA88 Created OS            03 (3) 'Unix'\n-CCA89 Extract Zip Spec      0A (10) '1.0'\n-CCA8A Extract OS            00 (0) 'MS-DOS'\n-CCA8B General Purpose Flag  0800 (2048)\n+CD090 CENTRAL HEADER #244   02014B50 (33639248)\n+CD094 Created Zip Spec      14 (20) '2.0'\n+CD095 Created OS            03 (3) 'Unix'\n+CD096 Extract Zip Spec      0A (10) '1.0'\n+CD097 Extract OS            00 (0) 'MS-DOS'\n+CD098 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-CCA8D Compression Method    0000 (0) 'Stored'\n-CCA8F Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CCA93 CRC                   00000000 (0)\n-CCA97 Compressed Size       00000000 (0)\n-CCA9B Uncompressed Size     00000000 (0)\n-CCA9F Filename Length       001F (31)\n-CCAA1 Extra Length          0000 (0)\n-CCAA3 Comment Length        0000 (0)\n-CCAA5 Disk Start            0000 (0)\n-CCAA7 Int File Attributes   0000 (0)\n+CD09A Compression Method    0000 (0) 'Stored'\n+CD09C Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CD0A0 CRC                   00000000 (0)\n+CD0A4 Compressed Size       00000000 (0)\n+CD0A8 Uncompressed Size     00000000 (0)\n+CD0AC Filename Length       001F (31)\n+CD0AE Extra Length          0000 (0)\n+CD0B0 Comment Length        0000 (0)\n+CD0B2 Disk Start            0000 (0)\n+CD0B4 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CCAA9 Ext File Attributes   41ED0010 (1106051088)\n+CD0B6 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-CCAAD Local Header Offset   00006A8D (27277)\n-CCAB1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CD0BA Local Header Offset   00006A8D (27277)\n+CD0BE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCCAB1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCD0BE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xCCAB1: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xCD0BE: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xCCA89: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCD096: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-CCAD0 CENTRAL HEADER #245   02014B50 (33639248)\n-CCAD4 Created Zip Spec      14 (20) '2.0'\n-CCAD5 Created OS            03 (3) 'Unix'\n-CCAD6 Extract Zip Spec      0A (10) '1.0'\n-CCAD7 Extract OS            00 (0) 'MS-DOS'\n-CCAD8 General Purpose Flag  0800 (2048)\n+CD0DD CENTRAL HEADER #245   02014B50 (33639248)\n+CD0E1 Created Zip Spec      14 (20) '2.0'\n+CD0E2 Created OS            03 (3) 'Unix'\n+CD0E3 Extract Zip Spec      0A (10) '1.0'\n+CD0E4 Extract OS            00 (0) 'MS-DOS'\n+CD0E5 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-CCADA Compression Method    0000 (0) 'Stored'\n-CCADC Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CCAE0 CRC                   00000000 (0)\n-CCAE4 Compressed Size       00000000 (0)\n-CCAE8 Uncompressed Size     00000000 (0)\n-CCAEC Filename Length       0035 (53)\n-CCAEE Extra Length          0000 (0)\n-CCAF0 Comment Length        0000 (0)\n-CCAF2 Disk Start            0000 (0)\n-CCAF4 Int File Attributes   0000 (0)\n+CD0E7 Compression Method    0000 (0) 'Stored'\n+CD0E9 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CD0ED CRC                   00000000 (0)\n+CD0F1 Compressed Size       00000000 (0)\n+CD0F5 Uncompressed Size     00000000 (0)\n+CD0F9 Filename Length       0035 (53)\n+CD0FB Extra Length          0000 (0)\n+CD0FD Comment Length        0000 (0)\n+CD0FF Disk Start            0000 (0)\n+CD101 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CCAF6 Ext File Attributes   41ED0010 (1106051088)\n+CD103 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-CCAFA Local Header Offset   00006ACA (27338)\n-CCAFE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CD107 Local Header Offset   00006ACA (27338)\n+CD10B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCCAFE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCD10B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xCCAFE: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xCD10B: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xCCAD6: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCD0E3: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-CCB33 CENTRAL HEADER #246   02014B50 (33639248)\n-CCB37 Created Zip Spec      14 (20) '2.0'\n-CCB38 Created OS            03 (3) 'Unix'\n-CCB39 Extract Zip Spec      14 (20) '2.0'\n-CCB3A Extract OS            00 (0) 'MS-DOS'\n-CCB3B General Purpose Flag  0800 (2048)\n+CD140 CENTRAL HEADER #246   02014B50 (33639248)\n+CD144 Created Zip Spec      14 (20) '2.0'\n+CD145 Created OS            03 (3) 'Unix'\n+CD146 Extract Zip Spec      14 (20) '2.0'\n+CD147 Extract OS            00 (0) 'MS-DOS'\n+CD148 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-CCB3D Compression Method    0008 (8) 'Deflated'\n-CCB3F Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CCB43 CRC                   49E1B674 (1239529076)\n-CCB47 Compressed Size       00001E32 (7730)\n-CCB4B Uncompressed Size     00012B5D (76637)\n-CCB4F Filename Length       0015 (21)\n-CCB51 Extra Length          0000 (0)\n-CCB53 Comment Length        0000 (0)\n-CCB55 Disk Start            0000 (0)\n-CCB57 Int File Attributes   0000 (0)\n+CD14A Compression Method    0008 (8) 'Deflated'\n+CD14C Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CD150 CRC                   49E1B674 (1239529076)\n+CD154 Compressed Size       00001E32 (7730)\n+CD158 Uncompressed Size     00012B5D (76637)\n+CD15C Filename Length       0015 (21)\n+CD15E Extra Length          0000 (0)\n+CD160 Comment Length        0000 (0)\n+CD162 Disk Start            0000 (0)\n+CD164 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CCB59 Ext File Attributes   81A40000 (2175008768)\n+CD166 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-CCB5D Local Header Offset   00006B1D (27421)\n-CCB61 Filename              'XXXXXXXXXXXXXXXXXXXXX'\n+CD16A Local Header Offset   00006B1D (27421)\n+CD16E Filename              'XXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCCB61: Filename 'XXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCD16E: Filename 'XXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-CCB76 CENTRAL HEADER #247   02014B50 (33639248)\n-CCB7A Created Zip Spec      14 (20) '2.0'\n-CCB7B Created OS            03 (3) 'Unix'\n-CCB7C Extract Zip Spec      14 (20) '2.0'\n-CCB7D Extract OS            00 (0) 'MS-DOS'\n-CCB7E General Purpose Flag  0800 (2048)\n+CD183 CENTRAL HEADER #247   02014B50 (33639248)\n+CD187 Created Zip Spec      14 (20) '2.0'\n+CD188 Created OS            03 (3) 'Unix'\n+CD189 Extract Zip Spec      14 (20) '2.0'\n+CD18A Extract OS            00 (0) 'MS-DOS'\n+CD18B General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-CCB80 Compression Method    0008 (8) 'Deflated'\n-CCB82 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CCB86 CRC                   86E2B4B4 (2263004340)\n-CCB8A Compressed Size       00000F6D (3949)\n-CCB8E Uncompressed Size     00002C5E (11358)\n-CCB92 Filename Length       0010 (16)\n-CCB94 Extra Length          0000 (0)\n-CCB96 Comment Length        0000 (0)\n-CCB98 Disk Start            0000 (0)\n-CCB9A Int File Attributes   0000 (0)\n+CD18D Compression Method    0008 (8) 'Deflated'\n+CD18F Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CD193 CRC                   86E2B4B4 (2263004340)\n+CD197 Compressed Size       00000F6D (3949)\n+CD19B Uncompressed Size     00002C5E (11358)\n+CD19F Filename Length       0010 (16)\n+CD1A1 Extra Length          0000 (0)\n+CD1A3 Comment Length        0000 (0)\n+CD1A5 Disk Start            0000 (0)\n+CD1A7 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CCB9C Ext File Attributes   81A40000 (2175008768)\n+CD1A9 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-CCBA0 Local Header Offset   00008982 (35202)\n-CCBA4 Filename              'XXXXXXXXXXXXXXXX'\n+CD1AD Local Header Offset   00008982 (35202)\n+CD1B1 Filename              'XXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCCBA4: Filename 'XXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCD1B1: Filename 'XXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-CCBB4 CENTRAL HEADER #248   02014B50 (33639248)\n-CCBB8 Created Zip Spec      14 (20) '2.0'\n-CCBB9 Created OS            03 (3) 'Unix'\n-CCBBA Extract Zip Spec      14 (20) '2.0'\n-CCBBB Extract OS            00 (0) 'MS-DOS'\n-CCBBC General Purpose Flag  0800 (2048)\n+CD1C1 CENTRAL HEADER #248   02014B50 (33639248)\n+CD1C5 Created Zip Spec      14 (20) '2.0'\n+CD1C6 Created OS            03 (3) 'Unix'\n+CD1C7 Extract Zip Spec      14 (20) '2.0'\n+CD1C8 Extract OS            00 (0) 'MS-DOS'\n+CD1C9 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-CCBBE Compression Method    0008 (8) 'Deflated'\n-CCBC0 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CCBC4 CRC                   91A82808 (2443716616)\n-CCBC8 Compressed Size       00000082 (130)\n-CCBCC Uncompressed Size     000000A0 (160)\n-CCBD0 Filename Length       000F (15)\n-CCBD2 Extra Length          0000 (0)\n-CCBD4 Comment Length        0000 (0)\n-CCBD6 Disk Start            0000 (0)\n-CCBD8 Int File Attributes   0000 (0)\n+CD1CB Compression Method    0008 (8) 'Deflated'\n+CD1CD Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CD1D1 CRC                   91A82808 (2443716616)\n+CD1D5 Compressed Size       00000082 (130)\n+CD1D9 Uncompressed Size     000000A0 (160)\n+CD1DD Filename Length       000F (15)\n+CD1DF Extra Length          0000 (0)\n+CD1E1 Comment Length        0000 (0)\n+CD1E3 Disk Start            0000 (0)\n+CD1E5 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CCBDA Ext File Attributes   81A40000 (2175008768)\n+CD1E7 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-CCBDE Local Header Offset   0000991D (39197)\n-CCBE2 Filename              'XXXXXXXXXXXXXXX'\n+CD1EB Local Header Offset   0000991D (39197)\n+CD1EF Filename              'XXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCCBE2: Filename 'XXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCD1EF: Filename 'XXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-CCBF1 CENTRAL HEADER #249   02014B50 (33639248)\n-CCBF5 Created Zip Spec      14 (20) '2.0'\n-CCBF6 Created OS            03 (3) 'Unix'\n-CCBF7 Extract Zip Spec      14 (20) '2.0'\n-CCBF8 Extract OS            00 (0) 'MS-DOS'\n-CCBF9 General Purpose Flag  0800 (2048)\n+CD1FE CENTRAL HEADER #249   02014B50 (33639248)\n+CD202 Created Zip Spec      14 (20) '2.0'\n+CD203 Created OS            03 (3) 'Unix'\n+CD204 Extract Zip Spec      14 (20) '2.0'\n+CD205 Extract OS            00 (0) 'MS-DOS'\n+CD206 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-CCBFB Compression Method    0008 (8) 'Deflated'\n-CCBFD Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CCC01 CRC                   A60F7060 (2786029664)\n-CCC05 Compressed Size       000002EB (747)\n-CCC09 Uncompressed Size     0000050D (1293)\n-CCC0D Filename Length       0010 (16)\n-CCC0F Extra Length          0000 (0)\n-CCC11 Comment Length        0000 (0)\n-CCC13 Disk Start            0000 (0)\n-CCC15 Int File Attributes   0000 (0)\n+CD208 Compression Method    0008 (8) 'Deflated'\n+CD20A Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CD20E CRC                   13966CB5 (328625333)\n+CD212 Compressed Size       000002BA (698)\n+CD216 Uncompressed Size     000004A4 (1188)\n+CD21A Filename Length       0010 (16)\n+CD21C Extra Length          0000 (0)\n+CD21E Comment Length        0000 (0)\n+CD220 Disk Start            0000 (0)\n+CD222 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CCC17 Ext File Attributes   81A40000 (2175008768)\n+CD224 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-CCC1B Local Header Offset   000099CC (39372)\n-CCC1F Filename              'XXXXXXXXXXXXXXXX'\n+CD228 Local Header Offset   000099CC (39372)\n+CD22C Filename              'XXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCCC1F: Filename 'XXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCD22C: Filename 'XXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-CCC2F CENTRAL HEADER #250   02014B50 (33639248)\n-CCC33 Created Zip Spec      14 (20) '2.0'\n-CCC34 Created OS            03 (3) 'Unix'\n-CCC35 Extract Zip Spec      14 (20) '2.0'\n-CCC36 Extract OS            00 (0) 'MS-DOS'\n-CCC37 General Purpose Flag  0800 (2048)\n+CD23C CENTRAL HEADER #250   02014B50 (33639248)\n+CD240 Created Zip Spec      14 (20) '2.0'\n+CD241 Created OS            03 (3) 'Unix'\n+CD242 Extract Zip Spec      14 (20) '2.0'\n+CD243 Extract OS            00 (0) 'MS-DOS'\n+CD244 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-CCC39 Compression Method    0008 (8) 'Deflated'\n-CCC3B Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CCC3F CRC                   9CB4EC6B (2629102699)\n-CCC43 Compressed Size       00000546 (1350)\n-CCC47 Uncompressed Size     00000AA2 (2722)\n-CCC4B Filename Length       007D (125)\n-CCC4D Extra Length          0000 (0)\n-CCC4F Comment Length        0000 (0)\n-CCC51 Disk Start            0000 (0)\n-CCC53 Int File Attributes   0000 (0)\n+CD246 Compression Method    0008 (8) 'Deflated'\n+CD248 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CD24C CRC                   9CB4EC6B (2629102699)\n+CD250 Compressed Size       00000546 (1350)\n+CD254 Uncompressed Size     00000AA2 (2722)\n+CD258 Filename Length       007D (125)\n+CD25A Extra Length          0000 (0)\n+CD25C Comment Length        0000 (0)\n+CD25E Disk Start            0000 (0)\n+CD260 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CCC55 Ext File Attributes   81A40000 (2175008768)\n+CD262 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-CCC59 Local Header Offset   00009CE5 (40165)\n-CCC5D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CD266 Local Header Offset   00009CB4 (40116)\n+CD26A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCCC5D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCD26A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-CCCDA CENTRAL HEADER #251   02014B50 (33639248)\n-CCCDE Created Zip Spec      14 (20) '2.0'\n-CCCDF Created OS            03 (3) 'Unix'\n-CCCE0 Extract Zip Spec      14 (20) '2.0'\n-CCCE1 Extract OS            00 (0) 'MS-DOS'\n-CCCE2 General Purpose Flag  0800 (2048)\n+CD2E7 CENTRAL HEADER #251   02014B50 (33639248)\n+CD2EB Created Zip Spec      14 (20) '2.0'\n+CD2EC Created OS            03 (3) 'Unix'\n+CD2ED Extract Zip Spec      14 (20) '2.0'\n+CD2EE Extract OS            00 (0) 'MS-DOS'\n+CD2EF General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-CCCE4 Compression Method    0008 (8) 'Deflated'\n-CCCE6 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CCCEA CRC                   445AD7B2 (1146804146)\n-CCCEE Compressed Size       000006D4 (1748)\n-CCCF2 Uncompressed Size     00000FBF (4031)\n-CCCF6 Filename Length       006E (110)\n-CCCF8 Extra Length          0000 (0)\n-CCCFA Comment Length        0000 (0)\n-CCCFC Disk Start            0000 (0)\n-CCCFE Int File Attributes   0000 (0)\n+CD2F1 Compression Method    0008 (8) 'Deflated'\n+CD2F3 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CD2F7 CRC                   445AD7B2 (1146804146)\n+CD2FB Compressed Size       000006D4 (1748)\n+CD2FF Uncompressed Size     00000FBF (4031)\n+CD303 Filename Length       006E (110)\n+CD305 Extra Length          0000 (0)\n+CD307 Comment Length        0000 (0)\n+CD309 Disk Start            0000 (0)\n+CD30B Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CCD00 Ext File Attributes   81A40000 (2175008768)\n+CD30D 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-CCD04 Local Header Offset   0000A2C6 (41670)\n-CCD08 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CD311 Local Header Offset   0000A295 (41621)\n+CD315 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCCD08: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCD315: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-CCD76 CENTRAL HEADER #252   02014B50 (33639248)\n-CCD7A Created Zip Spec      14 (20) '2.0'\n-CCD7B Created OS            03 (3) 'Unix'\n-CCD7C Extract Zip Spec      14 (20) '2.0'\n-CCD7D Extract OS            00 (0) 'MS-DOS'\n-CCD7E General Purpose Flag  0800 (2048)\n+CD383 CENTRAL HEADER #252   02014B50 (33639248)\n+CD387 Created Zip Spec      14 (20) '2.0'\n+CD388 Created OS            03 (3) 'Unix'\n+CD389 Extract Zip Spec      14 (20) '2.0'\n+CD38A Extract OS            00 (0) 'MS-DOS'\n+CD38B General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-CCD80 Compression Method    0008 (8) 'Deflated'\n-CCD82 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CCD86 CRC                   A2A96EA2 (2729012898)\n-CCD8A Compressed Size       0000092B (2347)\n-CCD8E Uncompressed Size     000016DE (5854)\n-CCD92 Filename Length       006E (110)\n-CCD94 Extra Length          0000 (0)\n-CCD96 Comment Length        0000 (0)\n-CCD98 Disk Start            0000 (0)\n-CCD9A Int File Attributes   0000 (0)\n+CD38D Compression Method    0008 (8) 'Deflated'\n+CD38F Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CD393 CRC                   A2A96EA2 (2729012898)\n+CD397 Compressed Size       0000092B (2347)\n+CD39B Uncompressed Size     000016DE (5854)\n+CD39F Filename Length       006E (110)\n+CD3A1 Extra Length          0000 (0)\n+CD3A3 Comment Length        0000 (0)\n+CD3A5 Disk Start            0000 (0)\n+CD3A7 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CCD9C Ext File Attributes   81A40000 (2175008768)\n+CD3A9 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-CCDA0 Local Header Offset   0000AA26 (43558)\n-CCDA4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CD3AD Local Header Offset   0000A9F5 (43509)\n+CD3B1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCCDA4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCD3B1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-CCE12 CENTRAL HEADER #253   02014B50 (33639248)\n-CCE16 Created Zip Spec      14 (20) '2.0'\n-CCE17 Created OS            03 (3) 'Unix'\n-CCE18 Extract Zip Spec      14 (20) '2.0'\n-CCE19 Extract OS            00 (0) 'MS-DOS'\n-CCE1A General Purpose Flag  0800 (2048)\n+CD41F CENTRAL HEADER #253   02014B50 (33639248)\n+CD423 Created Zip Spec      14 (20) '2.0'\n+CD424 Created OS            03 (3) 'Unix'\n+CD425 Extract Zip Spec      14 (20) '2.0'\n+CD426 Extract OS            00 (0) 'MS-DOS'\n+CD427 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-CCE1C Compression Method    0008 (8) 'Deflated'\n-CCE1E Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CCE22 CRC                   7416DF2A (1947655978)\n-CCE26 Compressed Size       0000091D (2333)\n-CCE2A Uncompressed Size     00001512 (5394)\n-CCE2E Filename Length       007E (126)\n-CCE30 Extra Length          0000 (0)\n-CCE32 Comment Length        0000 (0)\n-CCE34 Disk Start            0000 (0)\n-CCE36 Int File Attributes   0000 (0)\n+CD429 Compression Method    0008 (8) 'Deflated'\n+CD42B Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CD42F CRC                   7416DF2A (1947655978)\n+CD433 Compressed Size       0000091D (2333)\n+CD437 Uncompressed Size     00001512 (5394)\n+CD43B Filename Length       007E (126)\n+CD43D Extra Length          0000 (0)\n+CD43F Comment Length        0000 (0)\n+CD441 Disk Start            0000 (0)\n+CD443 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CCE38 Ext File Attributes   81A40000 (2175008768)\n+CD445 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-CCE3C Local Header Offset   0000B3DD (46045)\n-CCE40 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CD449 Local Header Offset   0000B3AC (45996)\n+CD44D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCCE40: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCD44D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-CCEBE CENTRAL HEADER #254   02014B50 (33639248)\n-CCEC2 Created Zip Spec      14 (20) '2.0'\n-CCEC3 Created OS            03 (3) 'Unix'\n-CCEC4 Extract Zip Spec      14 (20) '2.0'\n-CCEC5 Extract OS            00 (0) 'MS-DOS'\n-CCEC6 General Purpose Flag  0800 (2048)\n+CD4CB CENTRAL HEADER #254   02014B50 (33639248)\n+CD4CF Created Zip Spec      14 (20) '2.0'\n+CD4D0 Created OS            03 (3) 'Unix'\n+CD4D1 Extract Zip Spec      14 (20) '2.0'\n+CD4D2 Extract OS            00 (0) 'MS-DOS'\n+CD4D3 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-CCEC8 Compression Method    0008 (8) 'Deflated'\n-CCECA Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CCECE CRC                   826E1CC4 (2188254404)\n-CCED2 Compressed Size       00000DE0 (3552)\n-CCED6 Uncompressed Size     00002F90 (12176)\n-CCEDA Filename Length       007B (123)\n-CCEDC Extra Length          0000 (0)\n-CCEDE Comment Length        0000 (0)\n-CCEE0 Disk Start            0000 (0)\n-CCEE2 Int File Attributes   0000 (0)\n+CD4D5 Compression Method    0008 (8) 'Deflated'\n+CD4D7 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CD4DB CRC                   826E1CC4 (2188254404)\n+CD4DF Compressed Size       00000DE0 (3552)\n+CD4E3 Uncompressed Size     00002F90 (12176)\n+CD4E7 Filename Length       007B (123)\n+CD4E9 Extra Length          0000 (0)\n+CD4EB Comment Length        0000 (0)\n+CD4ED Disk Start            0000 (0)\n+CD4EF Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CCEE4 Ext File Attributes   81A40000 (2175008768)\n+CD4F1 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-CCEE8 Local Header Offset   0000BD96 (48534)\n-CCEEC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CD4F5 Local Header Offset   0000BD65 (48485)\n+CD4F9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCCEEC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCD4F9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-CCF67 CENTRAL HEADER #255   02014B50 (33639248)\n-CCF6B Created Zip Spec      14 (20) '2.0'\n-CCF6C Created OS            03 (3) 'Unix'\n-CCF6D Extract Zip Spec      14 (20) '2.0'\n-CCF6E Extract OS            00 (0) 'MS-DOS'\n-CCF6F General Purpose Flag  0800 (2048)\n+CD574 CENTRAL HEADER #255   02014B50 (33639248)\n+CD578 Created Zip Spec      14 (20) '2.0'\n+CD579 Created OS            03 (3) 'Unix'\n+CD57A Extract Zip Spec      14 (20) '2.0'\n+CD57B Extract OS            00 (0) 'MS-DOS'\n+CD57C General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-CCF71 Compression Method    0008 (8) 'Deflated'\n-CCF73 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CCF77 CRC                   1BE163AC (467755948)\n-CCF7B Compressed Size       00000476 (1142)\n-CCF7F Uncompressed Size     00000967 (2407)\n-CCF83 Filename Length       0084 (132)\n-CCF85 Extra Length          0000 (0)\n-CCF87 Comment Length        0000 (0)\n-CCF89 Disk Start            0000 (0)\n-CCF8B Int File Attributes   0000 (0)\n+CD57E Compression Method    0008 (8) 'Deflated'\n+CD580 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CD584 CRC                   1BE163AC (467755948)\n+CD588 Compressed Size       00000476 (1142)\n+CD58C Uncompressed Size     00000967 (2407)\n+CD590 Filename Length       0084 (132)\n+CD592 Extra Length          0000 (0)\n+CD594 Comment Length        0000 (0)\n+CD596 Disk Start            0000 (0)\n+CD598 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CCF8D Ext File Attributes   81A40000 (2175008768)\n+CD59A 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-CCF91 Local Header Offset   0000CC0F (52239)\n-CCF95 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+CD59E Local Header Offset   0000CBDE (52190)\n+CD5A2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             '\n #\n-# WARNING: Offset 0xCCF95: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCD5A2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-CD019 CENTRAL HEADER #256   02014B50 (33639248)\n-CD01D Created Zip Spec      14 (20) '2.0'\n-CD01E Created OS            03 (3) 'Unix'\n-CD01F Extract Zip Spec      14 (20) '2.0'\n-CD020 Extract OS            00 (0) 'MS-DOS'\n-CD021 General Purpose Flag  0800 (2048)\n+CD626 CENTRAL HEADER #256   02014B50 (33639248)\n+CD62A Created Zip Spec      14 (20) '2.0'\n+CD62B Created OS            03 (3) 'Unix'\n+CD62C Extract Zip Spec      14 (20) '2.0'\n+CD62D Extract OS            00 (0) 'MS-DOS'\n+CD62E General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-CD023 Compression Method    0008 (8) 'Deflated'\n-CD025 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CD029 CRC                   11DB1110 (299569424)\n-CD02D Compressed Size       00000428 (1064)\n-CD031 Uncompressed Size     0000080F (2063)\n-CD035 Filename Length       007E (126)\n-CD037 Extra Length          0000 (0)\n-CD039 Comment Length        0000 (0)\n-CD03B Disk Start            0000 (0)\n-CD03D Int File Attributes   0000 (0)\n+CD630 Compression Method    0008 (8) 'Deflated'\n+CD632 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CD636 CRC                   11DB1110 (299569424)\n+CD63A Compressed Size       00000428 (1064)\n+CD63E Uncompressed Size     0000080F (2063)\n+CD642 Filename Length       007E (126)\n+CD644 Extra Length          0000 (0)\n+CD646 Comment Length        0000 (0)\n+CD648 Disk Start            0000 (0)\n+CD64A Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CD03F Ext File Attributes   81A40000 (2175008768)\n+CD64C 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-CD043 Local Header Offset   0000D127 (53543)\n-CD047 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CD650 Local Header Offset   0000D0F6 (53494)\n+CD654 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCD047: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCD654: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-CD0C5 CENTRAL HEADER #257   02014B50 (33639248)\n-CD0C9 Created Zip Spec      14 (20) '2.0'\n-CD0CA Created OS            03 (3) 'Unix'\n-CD0CB Extract Zip Spec      14 (20) '2.0'\n-CD0CC Extract OS            00 (0) 'MS-DOS'\n-CD0CD General Purpose Flag  0800 (2048)\n+CD6D2 CENTRAL HEADER #257   02014B50 (33639248)\n+CD6D6 Created Zip Spec      14 (20) '2.0'\n+CD6D7 Created OS            03 (3) 'Unix'\n+CD6D8 Extract Zip Spec      14 (20) '2.0'\n+CD6D9 Extract OS            00 (0) 'MS-DOS'\n+CD6DA General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-CD0CF Compression Method    0008 (8) 'Deflated'\n-CD0D1 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CD0D5 CRC                   30A69673 (816223859)\n-CD0D9 Compressed Size       000005CE (1486)\n-CD0DD Uncompressed Size     00000C1C (3100)\n-CD0E1 Filename Length       007A (122)\n-CD0E3 Extra Length          0000 (0)\n-CD0E5 Comment Length        0000 (0)\n-CD0E7 Disk Start            0000 (0)\n-CD0E9 Int File Attributes   0000 (0)\n+CD6DC Compression Method    0008 (8) 'Deflated'\n+CD6DE Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CD6E2 CRC                   30A69673 (816223859)\n+CD6E6 Compressed Size       000005CE (1486)\n+CD6EA Uncompressed Size     00000C1C (3100)\n+CD6EE Filename Length       007A (122)\n+CD6F0 Extra Length          0000 (0)\n+CD6F2 Comment Length        0000 (0)\n+CD6F4 Disk Start            0000 (0)\n+CD6F6 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CD0EB Ext File Attributes   81A40000 (2175008768)\n+CD6F8 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-CD0EF Local Header Offset   0000D5EB (54763)\n-CD0F3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CD6FC Local Header Offset   0000D5BA (54714)\n+CD700 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCD0F3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCD700: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-CD16D CENTRAL HEADER #258   02014B50 (33639248)\n-CD171 Created Zip Spec      14 (20) '2.0'\n-CD172 Created OS            03 (3) 'Unix'\n-CD173 Extract Zip Spec      14 (20) '2.0'\n-CD174 Extract OS            00 (0) 'MS-DOS'\n-CD175 General Purpose Flag  0800 (2048)\n+CD77A CENTRAL HEADER #258   02014B50 (33639248)\n+CD77E Created Zip Spec      14 (20) '2.0'\n+CD77F Created OS            03 (3) 'Unix'\n+CD780 Extract Zip Spec      14 (20) '2.0'\n+CD781 Extract OS            00 (0) 'MS-DOS'\n+CD782 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-CD177 Compression Method    0008 (8) 'Deflated'\n-CD179 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CD17D CRC                   0C316B32 (204565298)\n-CD181 Compressed Size       000003A1 (929)\n-CD185 Uncompressed Size     000006D7 (1751)\n-CD189 Filename Length       0084 (132)\n-CD18B Extra Length          0000 (0)\n-CD18D Comment Length        0000 (0)\n-CD18F Disk Start            0000 (0)\n-CD191 Int File Attributes   0000 (0)\n+CD784 Compression Method    0008 (8) 'Deflated'\n+CD786 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CD78A CRC                   0C316B32 (204565298)\n+CD78E Compressed Size       000003A1 (929)\n+CD792 Uncompressed Size     000006D7 (1751)\n+CD796 Filename Length       0084 (132)\n+CD798 Extra Length          0000 (0)\n+CD79A Comment Length        0000 (0)\n+CD79C Disk Start            0000 (0)\n+CD79E Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CD193 Ext File Attributes   81A40000 (2175008768)\n+CD7A0 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-CD197 Local Header Offset   0000DC51 (56401)\n-CD19B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+CD7A4 Local Header Offset   0000DC20 (56352)\n+CD7A8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             '\n #\n-# WARNING: Offset 0xCD19B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCD7A8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-CD21F CENTRAL HEADER #259   02014B50 (33639248)\n-CD223 Created Zip Spec      14 (20) '2.0'\n-CD224 Created OS            03 (3) 'Unix'\n-CD225 Extract Zip Spec      14 (20) '2.0'\n-CD226 Extract OS            00 (0) 'MS-DOS'\n-CD227 General Purpose Flag  0800 (2048)\n+CD82C CENTRAL HEADER #259   02014B50 (33639248)\n+CD830 Created Zip Spec      14 (20) '2.0'\n+CD831 Created OS            03 (3) 'Unix'\n+CD832 Extract Zip Spec      14 (20) '2.0'\n+CD833 Extract OS            00 (0) 'MS-DOS'\n+CD834 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-CD229 Compression Method    0008 (8) 'Deflated'\n-CD22B Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CD22F CRC                   37BEEC96 (935259286)\n-CD233 Compressed Size       000006C9 (1737)\n-CD237 Uncompressed Size     0000133B (4923)\n-CD23B Filename Length       0080 (128)\n-CD23D Extra Length          0000 (0)\n-CD23F Comment Length        0000 (0)\n-CD241 Disk Start            0000 (0)\n-CD243 Int File Attributes   0000 (0)\n+CD836 Compression Method    0008 (8) 'Deflated'\n+CD838 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CD83C CRC                   37BEEC96 (935259286)\n+CD840 Compressed Size       000006C9 (1737)\n+CD844 Uncompressed Size     0000133B (4923)\n+CD848 Filename Length       0080 (128)\n+CD84A Extra Length          0000 (0)\n+CD84C Comment Length        0000 (0)\n+CD84E Disk Start            0000 (0)\n+CD850 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CD245 Ext File Attributes   81A40000 (2175008768)\n+CD852 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-CD249 Local Header Offset   0000E094 (57492)\n-CD24D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CD856 Local Header Offset   0000E063 (57443)\n+CD85A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCD24D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCD85A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-CD2CD CENTRAL HEADER #260   02014B50 (33639248)\n-CD2D1 Created Zip Spec      14 (20) '2.0'\n-CD2D2 Created OS            03 (3) 'Unix'\n-CD2D3 Extract Zip Spec      14 (20) '2.0'\n-CD2D4 Extract OS            00 (0) 'MS-DOS'\n-CD2D5 General Purpose Flag  0800 (2048)\n+CD8DA CENTRAL HEADER #260   02014B50 (33639248)\n+CD8DE Created Zip Spec      14 (20) '2.0'\n+CD8DF Created OS            03 (3) 'Unix'\n+CD8E0 Extract Zip Spec      14 (20) '2.0'\n+CD8E1 Extract OS            00 (0) 'MS-DOS'\n+CD8E2 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-CD2D7 Compression Method    0008 (8) 'Deflated'\n-CD2D9 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CD2DD CRC                   D0AE7BE4 (3501095908)\n-CD2E1 Compressed Size       000003D9 (985)\n-CD2E5 Uncompressed Size     0000074C (1868)\n-CD2E9 Filename Length       0088 (136)\n-CD2EB Extra Length          0000 (0)\n-CD2ED Comment Length        0000 (0)\n-CD2EF Disk Start            0000 (0)\n-CD2F1 Int File Attributes   0000 (0)\n+CD8E4 Compression Method    0008 (8) 'Deflated'\n+CD8E6 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CD8EA CRC                   D0AE7BE4 (3501095908)\n+CD8EE Compressed Size       000003D9 (985)\n+CD8F2 Uncompressed Size     0000074C (1868)\n+CD8F6 Filename Length       0088 (136)\n+CD8F8 Extra Length          0000 (0)\n+CD8FA Comment Length        0000 (0)\n+CD8FC Disk Start            0000 (0)\n+CD8FE Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CD2F3 Ext File Attributes   81A40000 (2175008768)\n+CD900 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-CD2F7 Local Header Offset   0000E7FB (59387)\n-CD2FB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+CD904 Local Header Offset   0000E7CA (59338)\n+CD908 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXX'\n #\n-# WARNING: Offset 0xCD2FB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCD908: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-CD383 CENTRAL HEADER #261   02014B50 (33639248)\n-CD387 Created Zip Spec      14 (20) '2.0'\n-CD388 Created OS            03 (3) 'Unix'\n-CD389 Extract Zip Spec      14 (20) '2.0'\n-CD38A Extract OS            00 (0) 'MS-DOS'\n-CD38B General Purpose Flag  0800 (2048)\n+CD990 CENTRAL HEADER #261   02014B50 (33639248)\n+CD994 Created Zip Spec      14 (20) '2.0'\n+CD995 Created OS            03 (3) 'Unix'\n+CD996 Extract Zip Spec      14 (20) '2.0'\n+CD997 Extract OS            00 (0) 'MS-DOS'\n+CD998 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-CD38D Compression Method    0008 (8) 'Deflated'\n-CD38F Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CD393 CRC                   4C134CE6 (1276333286)\n-CD397 Compressed Size       000006D5 (1749)\n-CD39B Uncompressed Size     0000103C (4156)\n-CD39F Filename Length       0084 (132)\n-CD3A1 Extra Length          0000 (0)\n-CD3A3 Comment Length        0000 (0)\n-CD3A5 Disk Start            0000 (0)\n-CD3A7 Int File Attributes   0000 (0)\n+CD99A Compression Method    0008 (8) 'Deflated'\n+CD99C Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CD9A0 CRC                   4C134CE6 (1276333286)\n+CD9A4 Compressed Size       000006D5 (1749)\n+CD9A8 Uncompressed Size     0000103C (4156)\n+CD9AC Filename Length       0084 (132)\n+CD9AE Extra Length          0000 (0)\n+CD9B0 Comment Length        0000 (0)\n+CD9B2 Disk Start            0000 (0)\n+CD9B4 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CD3A9 Ext File Attributes   81A40000 (2175008768)\n+CD9B6 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-CD3AD Local Header Offset   0000EC7A (60538)\n-CD3B1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+CD9BA Local Header Offset   0000EC49 (60489)\n+CD9BE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             '\n #\n-# WARNING: Offset 0xCD3B1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCD9BE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-CD435 CENTRAL HEADER #262   02014B50 (33639248)\n-CD439 Created Zip Spec      14 (20) '2.0'\n-CD43A Created OS            03 (3) 'Unix'\n-CD43B Extract Zip Spec      14 (20) '2.0'\n-CD43C Extract OS            00 (0) 'MS-DOS'\n-CD43D General Purpose Flag  0800 (2048)\n+CDA42 CENTRAL HEADER #262   02014B50 (33639248)\n+CDA46 Created Zip Spec      14 (20) '2.0'\n+CDA47 Created OS            03 (3) 'Unix'\n+CDA48 Extract Zip Spec      14 (20) '2.0'\n+CDA49 Extract OS            00 (0) 'MS-DOS'\n+CDA4A General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-CD43F Compression Method    0008 (8) 'Deflated'\n-CD441 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CD445 CRC                   63086228 (1661493800)\n-CD449 Compressed Size       00000430 (1072)\n-CD44D Uncompressed Size     00000838 (2104)\n-CD451 Filename Length       0086 (134)\n-CD453 Extra Length          0000 (0)\n-CD455 Comment Length        0000 (0)\n-CD457 Disk Start            0000 (0)\n-CD459 Int File Attributes   0000 (0)\n+CDA4C Compression Method    0008 (8) 'Deflated'\n+CDA4E Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CDA52 CRC                   63086228 (1661493800)\n+CDA56 Compressed Size       00000430 (1072)\n+CDA5A Uncompressed Size     00000838 (2104)\n+CDA5E Filename Length       0086 (134)\n+CDA60 Extra Length          0000 (0)\n+CDA62 Comment Length        0000 (0)\n+CDA64 Disk Start            0000 (0)\n+CDA66 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CD45B Ext File Attributes   81A40000 (2175008768)\n+CDA68 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-CD45F Local Header Offset   0000F3F1 (62449)\n-CD463 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+CDA6C Local Header Offset   0000F3C0 (62400)\n+CDA70 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XX'\n #\n-# WARNING: Offset 0xCD463: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCDA70: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-CD4E9 CENTRAL HEADER #263   02014B50 (33639248)\n-CD4ED Created Zip Spec      14 (20) '2.0'\n-CD4EE Created OS            03 (3) 'Unix'\n-CD4EF Extract Zip Spec      14 (20) '2.0'\n-CD4F0 Extract OS            00 (0) 'MS-DOS'\n-CD4F1 General Purpose Flag  0800 (2048)\n+CDAF6 CENTRAL HEADER #263   02014B50 (33639248)\n+CDAFA Created Zip Spec      14 (20) '2.0'\n+CDAFB Created OS            03 (3) 'Unix'\n+CDAFC Extract Zip Spec      14 (20) '2.0'\n+CDAFD Extract OS            00 (0) 'MS-DOS'\n+CDAFE General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-CD4F3 Compression Method    0008 (8) 'Deflated'\n-CD4F5 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CD4F9 CRC                   9EF621C1 (2666930625)\n-CD4FD Compressed Size       000005D9 (1497)\n-CD501 Uncompressed Size     00000C90 (3216)\n-CD505 Filename Length       0082 (130)\n-CD507 Extra Length          0000 (0)\n-CD509 Comment Length        0000 (0)\n-CD50B Disk Start            0000 (0)\n-CD50D Int File Attributes   0000 (0)\n+CDB00 Compression Method    0008 (8) 'Deflated'\n+CDB02 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CDB06 CRC                   9EF621C1 (2666930625)\n+CDB0A Compressed Size       000005D9 (1497)\n+CDB0E Uncompressed Size     00000C90 (3216)\n+CDB12 Filename Length       0082 (130)\n+CDB14 Extra Length          0000 (0)\n+CDB16 Comment Length        0000 (0)\n+CDB18 Disk Start            0000 (0)\n+CDB1A Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CD50F Ext File Attributes   81A40000 (2175008768)\n+CDB1C 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-CD513 Local Header Offset   0000F8C5 (63685)\n-CD517 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CDB20 Local Header Offset   0000F894 (63636)\n+CDB24 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCD517: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCDB24: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-CD599 CENTRAL HEADER #264   02014B50 (33639248)\n-CD59D Created Zip Spec      14 (20) '2.0'\n-CD59E Created OS            03 (3) 'Unix'\n-CD59F Extract Zip Spec      14 (20) '2.0'\n-CD5A0 Extract OS            00 (0) 'MS-DOS'\n-CD5A1 General Purpose Flag  0800 (2048)\n+CDBA6 CENTRAL HEADER #264   02014B50 (33639248)\n+CDBAA Created Zip Spec      14 (20) '2.0'\n+CDBAB Created OS            03 (3) 'Unix'\n+CDBAC Extract Zip Spec      14 (20) '2.0'\n+CDBAD Extract OS            00 (0) 'MS-DOS'\n+CDBAE General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-CD5A3 Compression Method    0008 (8) 'Deflated'\n-CD5A5 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CD5A9 CRC                   6BE0FFE8 (1809907688)\n-CD5AD Compressed Size       00000687 (1671)\n-CD5B1 Uncompressed Size     00000EF6 (3830)\n-CD5B5 Filename Length       006A (106)\n-CD5B7 Extra Length          0000 (0)\n-CD5B9 Comment Length        0000 (0)\n-CD5BB Disk Start            0000 (0)\n-CD5BD Int File Attributes   0000 (0)\n+CDBB0 Compression Method    0008 (8) 'Deflated'\n+CDBB2 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CDBB6 CRC                   6BE0FFE8 (1809907688)\n+CDBBA Compressed Size       00000687 (1671)\n+CDBBE Uncompressed Size     00000EF6 (3830)\n+CDBC2 Filename Length       006A (106)\n+CDBC4 Extra Length          0000 (0)\n+CDBC6 Comment Length        0000 (0)\n+CDBC8 Disk Start            0000 (0)\n+CDBCA Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CD5BF Ext File Attributes   81A40000 (2175008768)\n+CDBCC 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-CD5C3 Local Header Offset   0000FF3E (65342)\n-CD5C7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CDBD0 Local Header Offset   0000FF0D (65293)\n+CDBD4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCD5C7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCDBD4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-CD631 CENTRAL HEADER #265   02014B50 (33639248)\n-CD635 Created Zip Spec      14 (20) '2.0'\n-CD636 Created OS            03 (3) 'Unix'\n-CD637 Extract Zip Spec      14 (20) '2.0'\n-CD638 Extract OS            00 (0) 'MS-DOS'\n-CD639 General Purpose Flag  0800 (2048)\n+CDC3E CENTRAL HEADER #265   02014B50 (33639248)\n+CDC42 Created Zip Spec      14 (20) '2.0'\n+CDC43 Created OS            03 (3) 'Unix'\n+CDC44 Extract Zip Spec      14 (20) '2.0'\n+CDC45 Extract OS            00 (0) 'MS-DOS'\n+CDC46 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-CD63B Compression Method    0008 (8) 'Deflated'\n-CD63D Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CD641 CRC                   8743913D (2269352253)\n-CD645 Compressed Size       000005DE (1502)\n-CD649 Uncompressed Size     00000C44 (3140)\n-CD64D Filename Length       006F (111)\n-CD64F Extra Length          0000 (0)\n-CD651 Comment Length        0000 (0)\n-CD653 Disk Start            0000 (0)\n-CD655 Int File Attributes   0000 (0)\n+CDC48 Compression Method    0008 (8) 'Deflated'\n+CDC4A Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CDC4E CRC                   8743913D (2269352253)\n+CDC52 Compressed Size       000005DE (1502)\n+CDC56 Uncompressed Size     00000C44 (3140)\n+CDC5A Filename Length       006F (111)\n+CDC5C Extra Length          0000 (0)\n+CDC5E Comment Length        0000 (0)\n+CDC60 Disk Start            0000 (0)\n+CDC62 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CD657 Ext File Attributes   81A40000 (2175008768)\n+CDC64 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-CD65B Local Header Offset   0001064D (67149)\n-CD65F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CDC68 Local Header Offset   0001061C (67100)\n+CDC6C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCD65F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCDC6C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-CD6CE CENTRAL HEADER #266   02014B50 (33639248)\n-CD6D2 Created Zip Spec      14 (20) '2.0'\n-CD6D3 Created OS            03 (3) 'Unix'\n-CD6D4 Extract Zip Spec      14 (20) '2.0'\n-CD6D5 Extract OS            00 (0) 'MS-DOS'\n-CD6D6 General Purpose Flag  0800 (2048)\n+CDCDB CENTRAL HEADER #266   02014B50 (33639248)\n+CDCDF Created Zip Spec      14 (20) '2.0'\n+CDCE0 Created OS            03 (3) 'Unix'\n+CDCE1 Extract Zip Spec      14 (20) '2.0'\n+CDCE2 Extract OS            00 (0) 'MS-DOS'\n+CDCE3 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-CD6D8 Compression Method    0008 (8) 'Deflated'\n-CD6DA Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CD6DE CRC                   07A59EC9 (128294601)\n-CD6E2 Compressed Size       000004D1 (1233)\n-CD6E6 Uncompressed Size     00000C29 (3113)\n-CD6EA Filename Length       008A (138)\n-CD6EC Extra Length          0000 (0)\n-CD6EE Comment Length        0000 (0)\n-CD6F0 Disk Start            0000 (0)\n-CD6F2 Int File Attributes   0000 (0)\n+CDCE5 Compression Method    0008 (8) 'Deflated'\n+CDCE7 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CDCEB CRC                   07A59EC9 (128294601)\n+CDCEF Compressed Size       000004D1 (1233)\n+CDCF3 Uncompressed Size     00000C29 (3113)\n+CDCF7 Filename Length       008A (138)\n+CDCF9 Extra Length          0000 (0)\n+CDCFB Comment Length        0000 (0)\n+CDCFD Disk Start            0000 (0)\n+CDCFF Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CD6F4 Ext File Attributes   81A40000 (2175008768)\n+CDD01 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-CD6F8 Local Header Offset   00010CB8 (68792)\n-CD6FC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+CDD05 Local Header Offset   00010C87 (68743)\n+CDD09 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXX'\n #\n-# WARNING: Offset 0xCD6FC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCDD09: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-CD786 CENTRAL HEADER #267   02014B50 (33639248)\n-CD78A Created Zip Spec      14 (20) '2.0'\n-CD78B Created OS            03 (3) 'Unix'\n-CD78C Extract Zip Spec      14 (20) '2.0'\n-CD78D Extract OS            00 (0) 'MS-DOS'\n-CD78E General Purpose Flag  0800 (2048)\n+CDD93 CENTRAL HEADER #267   02014B50 (33639248)\n+CDD97 Created Zip Spec      14 (20) '2.0'\n+CDD98 Created OS            03 (3) 'Unix'\n+CDD99 Extract Zip Spec      14 (20) '2.0'\n+CDD9A Extract OS            00 (0) 'MS-DOS'\n+CDD9B General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-CD790 Compression Method    0008 (8) 'Deflated'\n-CD792 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CD796 CRC                   63D24DDE (1674726878)\n-CD79A Compressed Size       0000046A (1130)\n-CD79E Uncompressed Size     00000E46 (3654)\n-CD7A2 Filename Length       0084 (132)\n-CD7A4 Extra Length          0000 (0)\n-CD7A6 Comment Length        0000 (0)\n-CD7A8 Disk Start            0000 (0)\n-CD7AA Int File Attributes   0000 (0)\n+CDD9D Compression Method    0008 (8) 'Deflated'\n+CDD9F Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CDDA3 CRC                   63D24DDE (1674726878)\n+CDDA7 Compressed Size       0000046A (1130)\n+CDDAB Uncompressed Size     00000E46 (3654)\n+CDDAF Filename Length       0084 (132)\n+CDDB1 Extra Length          0000 (0)\n+CDDB3 Comment Length        0000 (0)\n+CDDB5 Disk Start            0000 (0)\n+CDDB7 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CD7AC Ext File Attributes   81A40000 (2175008768)\n+CDDB9 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-CD7B0 Local Header Offset   00011231 (70193)\n-CD7B4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+CDDBD Local Header Offset   00011200 (70144)\n+CDDC1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             '\n #\n-# WARNING: Offset 0xCD7B4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCDDC1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-CD838 CENTRAL HEADER #268   02014B50 (33639248)\n-CD83C Created Zip Spec      14 (20) '2.0'\n-CD83D Created OS            03 (3) 'Unix'\n-CD83E Extract Zip Spec      14 (20) '2.0'\n-CD83F Extract OS            00 (0) 'MS-DOS'\n-CD840 General Purpose Flag  0800 (2048)\n+CDE45 CENTRAL HEADER #268   02014B50 (33639248)\n+CDE49 Created Zip Spec      14 (20) '2.0'\n+CDE4A Created OS            03 (3) 'Unix'\n+CDE4B Extract Zip Spec      14 (20) '2.0'\n+CDE4C Extract OS            00 (0) 'MS-DOS'\n+CDE4D General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-CD842 Compression Method    0008 (8) 'Deflated'\n-CD844 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CD848 CRC                   2E17013D (773259581)\n-CD84C Compressed Size       0000043F (1087)\n-CD850 Uncompressed Size     00000888 (2184)\n-CD854 Filename Length       008B (139)\n-CD856 Extra Length          0000 (0)\n-CD858 Comment Length        0000 (0)\n-CD85A Disk Start            0000 (0)\n-CD85C Int File Attributes   0000 (0)\n+CDE4F Compression Method    0008 (8) 'Deflated'\n+CDE51 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CDE55 CRC                   2E17013D (773259581)\n+CDE59 Compressed Size       0000043F (1087)\n+CDE5D Uncompressed Size     00000888 (2184)\n+CDE61 Filename Length       008B (139)\n+CDE63 Extra Length          0000 (0)\n+CDE65 Comment Length        0000 (0)\n+CDE67 Disk Start            0000 (0)\n+CDE69 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CD85E Ext File Attributes   81A40000 (2175008768)\n+CDE6B 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-CD862 Local Header Offset   0001173D (71485)\n-CD866 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+CDE6F Local Header Offset   0001170C (71436)\n+CDE73 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXXX'\n #\n-# WARNING: Offset 0xCD866: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCDE73: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-CD8F1 CENTRAL HEADER #269   02014B50 (33639248)\n-CD8F5 Created Zip Spec      14 (20) '2.0'\n-CD8F6 Created OS            03 (3) 'Unix'\n-CD8F7 Extract Zip Spec      14 (20) '2.0'\n-CD8F8 Extract OS            00 (0) 'MS-DOS'\n-CD8F9 General Purpose Flag  0800 (2048)\n+CDEFE CENTRAL HEADER #269   02014B50 (33639248)\n+CDF02 Created Zip Spec      14 (20) '2.0'\n+CDF03 Created OS            03 (3) 'Unix'\n+CDF04 Extract Zip Spec      14 (20) '2.0'\n+CDF05 Extract OS            00 (0) 'MS-DOS'\n+CDF06 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-CD8FB Compression Method    0008 (8) 'Deflated'\n-CD8FD Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CD901 CRC                   C1E5A225 (3253051941)\n-CD905 Compressed Size       000003A3 (931)\n-CD909 Uncompressed Size     0000070B (1803)\n-CD90D Filename Length       006D (109)\n-CD90F Extra Length          0000 (0)\n-CD911 Comment Length        0000 (0)\n-CD913 Disk Start            0000 (0)\n-CD915 Int File Attributes   0000 (0)\n+CDF08 Compression Method    0008 (8) 'Deflated'\n+CDF0A Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CDF0E CRC                   C1E5A225 (3253051941)\n+CDF12 Compressed Size       000003A3 (931)\n+CDF16 Uncompressed Size     0000070B (1803)\n+CDF1A Filename Length       006D (109)\n+CDF1C Extra Length          0000 (0)\n+CDF1E Comment Length        0000 (0)\n+CDF20 Disk Start            0000 (0)\n+CDF22 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CD917 Ext File Attributes   81A40000 (2175008768)\n+CDF24 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-CD91B Local Header Offset   00011C25 (72741)\n-CD91F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CDF28 Local Header Offset   00011BF4 (72692)\n+CDF2C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCD91F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCDF2C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-CD98C CENTRAL HEADER #270   02014B50 (33639248)\n-CD990 Created Zip Spec      14 (20) '2.0'\n-CD991 Created OS            03 (3) 'Unix'\n-CD992 Extract Zip Spec      14 (20) '2.0'\n-CD993 Extract OS            00 (0) 'MS-DOS'\n-CD994 General Purpose Flag  0800 (2048)\n+CDF99 CENTRAL HEADER #270   02014B50 (33639248)\n+CDF9D Created Zip Spec      14 (20) '2.0'\n+CDF9E Created OS            03 (3) 'Unix'\n+CDF9F Extract Zip Spec      14 (20) '2.0'\n+CDFA0 Extract OS            00 (0) 'MS-DOS'\n+CDFA1 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-CD996 Compression Method    0008 (8) 'Deflated'\n-CD998 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CD99C CRC                   8950733E (2303750974)\n-CD9A0 Compressed Size       00000350 (848)\n-CD9A4 Uncompressed Size     0000064D (1613)\n-CD9A8 Filename Length       006C (108)\n-CD9AA Extra Length          0000 (0)\n-CD9AC Comment Length        0000 (0)\n-CD9AE Disk Start            0000 (0)\n-CD9B0 Int File Attributes   0000 (0)\n+CDFA3 Compression Method    0008 (8) 'Deflated'\n+CDFA5 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CDFA9 CRC                   8950733E (2303750974)\n+CDFAD Compressed Size       00000350 (848)\n+CDFB1 Uncompressed Size     0000064D (1613)\n+CDFB5 Filename Length       006C (108)\n+CDFB7 Extra Length          0000 (0)\n+CDFB9 Comment Length        0000 (0)\n+CDFBB Disk Start            0000 (0)\n+CDFBD Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CD9B2 Ext File Attributes   81A40000 (2175008768)\n+CDFBF 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-CD9B6 Local Header Offset   00012053 (73811)\n-CD9BA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CDFC3 Local Header Offset   00012022 (73762)\n+CDFC7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCD9BA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCDFC7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-CDA26 CENTRAL HEADER #271   02014B50 (33639248)\n-CDA2A Created Zip Spec      14 (20) '2.0'\n-CDA2B Created OS            03 (3) 'Unix'\n-CDA2C Extract Zip Spec      14 (20) '2.0'\n-CDA2D Extract OS            00 (0) 'MS-DOS'\n-CDA2E General Purpose Flag  0800 (2048)\n+CE033 CENTRAL HEADER #271   02014B50 (33639248)\n+CE037 Created Zip Spec      14 (20) '2.0'\n+CE038 Created OS            03 (3) 'Unix'\n+CE039 Extract Zip Spec      14 (20) '2.0'\n+CE03A Extract OS            00 (0) 'MS-DOS'\n+CE03B General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-CDA30 Compression Method    0008 (8) 'Deflated'\n-CDA32 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CDA36 CRC                   A0157ABE (2685762238)\n-CDA3A Compressed Size       0000034B (843)\n-CDA3E Uncompressed Size     00000643 (1603)\n-CDA42 Filename Length       006B (107)\n-CDA44 Extra Length          0000 (0)\n-CDA46 Comment Length        0000 (0)\n-CDA48 Disk Start            0000 (0)\n-CDA4A Int File Attributes   0000 (0)\n+CE03D Compression Method    0008 (8) 'Deflated'\n+CE03F Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CE043 CRC                   A0157ABE (2685762238)\n+CE047 Compressed Size       0000034B (843)\n+CE04B Uncompressed Size     00000643 (1603)\n+CE04F Filename Length       006B (107)\n+CE051 Extra Length          0000 (0)\n+CE053 Comment Length        0000 (0)\n+CE055 Disk Start            0000 (0)\n+CE057 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CDA4C Ext File Attributes   81A40000 (2175008768)\n+CE059 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-CDA50 Local Header Offset   0001242D (74797)\n-CDA54 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CE05D Local Header Offset   000123FC (74748)\n+CE061 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCDA54: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCE061: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-CDABF CENTRAL HEADER #272   02014B50 (33639248)\n-CDAC3 Created Zip Spec      14 (20) '2.0'\n-CDAC4 Created OS            03 (3) 'Unix'\n-CDAC5 Extract Zip Spec      14 (20) '2.0'\n-CDAC6 Extract OS            00 (0) 'MS-DOS'\n-CDAC7 General Purpose Flag  0800 (2048)\n+CE0CC CENTRAL HEADER #272   02014B50 (33639248)\n+CE0D0 Created Zip Spec      14 (20) '2.0'\n+CE0D1 Created OS            03 (3) 'Unix'\n+CE0D2 Extract Zip Spec      14 (20) '2.0'\n+CE0D3 Extract OS            00 (0) 'MS-DOS'\n+CE0D4 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-CDAC9 Compression Method    0008 (8) 'Deflated'\n-CDACB Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CDACF CRC                   164EC61D (374261277)\n-CDAD3 Compressed Size       0000054E (1358)\n-CDAD7 Uncompressed Size     00000B15 (2837)\n-CDADB Filename Length       0091 (145)\n-CDADD Extra Length          0000 (0)\n-CDADF Comment Length        0000 (0)\n-CDAE1 Disk Start            0000 (0)\n-CDAE3 Int File Attributes   0000 (0)\n+CE0D6 Compression Method    0008 (8) 'Deflated'\n+CE0D8 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CE0DC CRC                   164EC61D (374261277)\n+CE0E0 Compressed Size       0000054E (1358)\n+CE0E4 Uncompressed Size     00000B15 (2837)\n+CE0E8 Filename Length       0091 (145)\n+CE0EA Extra Length          0000 (0)\n+CE0EC Comment Length        0000 (0)\n+CE0EE Disk Start            0000 (0)\n+CE0F0 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CDAE5 Ext File Attributes   81A40000 (2175008768)\n+CE0F2 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-CDAE9 Local Header Offset   00012801 (75777)\n-CDAED Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+CE0F6 Local Header Offset   000127D0 (75728)\n+CE0FA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCDAED: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCE0FA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-CDB7E CENTRAL HEADER #273   02014B50 (33639248)\n-CDB82 Created Zip Spec      14 (20) '2.0'\n-CDB83 Created OS            03 (3) 'Unix'\n-CDB84 Extract Zip Spec      14 (20) '2.0'\n-CDB85 Extract OS            00 (0) 'MS-DOS'\n-CDB86 General Purpose Flag  0800 (2048)\n+CE18B CENTRAL HEADER #273   02014B50 (33639248)\n+CE18F Created Zip Spec      14 (20) '2.0'\n+CE190 Created OS            03 (3) 'Unix'\n+CE191 Extract Zip Spec      14 (20) '2.0'\n+CE192 Extract OS            00 (0) 'MS-DOS'\n+CE193 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-CDB88 Compression Method    0008 (8) 'Deflated'\n-CDB8A Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CDB8E CRC                   4F9A1C4F (1335499855)\n-CDB92 Compressed Size       000003FB (1019)\n-CDB96 Uncompressed Size     000009AF (2479)\n-CDB9A Filename Length       0075 (117)\n-CDB9C Extra Length          0000 (0)\n-CDB9E Comment Length        0000 (0)\n-CDBA0 Disk Start            0000 (0)\n-CDBA2 Int File Attributes   0000 (0)\n+CE195 Compression Method    0008 (8) 'Deflated'\n+CE197 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CE19B CRC                   4F9A1C4F (1335499855)\n+CE19F Compressed Size       000003FB (1019)\n+CE1A3 Uncompressed Size     000009AF (2479)\n+CE1A7 Filename Length       0075 (117)\n+CE1A9 Extra Length          0000 (0)\n+CE1AB Comment Length        0000 (0)\n+CE1AD Disk Start            0000 (0)\n+CE1AF Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CDBA4 Ext File Attributes   81A40000 (2175008768)\n+CE1B1 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-CDBA8 Local Header Offset   00012DFE (77310)\n-CDBAC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CE1B5 Local Header Offset   00012DCD (77261)\n+CE1B9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCDBAC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCE1B9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-CDC21 CENTRAL HEADER #274   02014B50 (33639248)\n-CDC25 Created Zip Spec      14 (20) '2.0'\n-CDC26 Created OS            03 (3) 'Unix'\n-CDC27 Extract Zip Spec      14 (20) '2.0'\n-CDC28 Extract OS            00 (0) 'MS-DOS'\n-CDC29 General Purpose Flag  0800 (2048)\n+CE22E CENTRAL HEADER #274   02014B50 (33639248)\n+CE232 Created Zip Spec      14 (20) '2.0'\n+CE233 Created OS            03 (3) 'Unix'\n+CE234 Extract Zip Spec      14 (20) '2.0'\n+CE235 Extract OS            00 (0) 'MS-DOS'\n+CE236 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-CDC2B Compression Method    0008 (8) 'Deflated'\n-CDC2D Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CDC31 CRC                   754F4527 (1968129319)\n-CDC35 Compressed Size       00000573 (1395)\n-CDC39 Uncompressed Size     00001265 (4709)\n-CDC3D Filename Length       0082 (130)\n-CDC3F Extra Length          0000 (0)\n-CDC41 Comment Length        0000 (0)\n-CDC43 Disk Start            0000 (0)\n-CDC45 Int File Attributes   0000 (0)\n+CE238 Compression Method    0008 (8) 'Deflated'\n+CE23A Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CE23E CRC                   754F4527 (1968129319)\n+CE242 Compressed Size       00000573 (1395)\n+CE246 Uncompressed Size     00001265 (4709)\n+CE24A Filename Length       0082 (130)\n+CE24C Extra Length          0000 (0)\n+CE24E Comment Length        0000 (0)\n+CE250 Disk Start            0000 (0)\n+CE252 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CDC47 Ext File Attributes   81A40000 (2175008768)\n+CE254 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-CDC4B Local Header Offset   0001328C (78476)\n-CDC4F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CE258 Local Header Offset   0001325B (78427)\n+CE25C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCDC4F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCE25C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-CDCD1 CENTRAL HEADER #275   02014B50 (33639248)\n-CDCD5 Created Zip Spec      14 (20) '2.0'\n-CDCD6 Created OS            03 (3) 'Unix'\n-CDCD7 Extract Zip Spec      14 (20) '2.0'\n-CDCD8 Extract OS            00 (0) 'MS-DOS'\n-CDCD9 General Purpose Flag  0800 (2048)\n+CE2DE CENTRAL HEADER #275   02014B50 (33639248)\n+CE2E2 Created Zip Spec      14 (20) '2.0'\n+CE2E3 Created OS            03 (3) 'Unix'\n+CE2E4 Extract Zip Spec      14 (20) '2.0'\n+CE2E5 Extract OS            00 (0) 'MS-DOS'\n+CE2E6 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-CDCDB Compression Method    0008 (8) 'Deflated'\n-CDCDD Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CDCE1 CRC                   896578EC (2305128684)\n-CDCE5 Compressed Size       00000746 (1862)\n-CDCE9 Uncompressed Size     00001327 (4903)\n-CDCED Filename Length       0090 (144)\n-CDCEF Extra Length          0000 (0)\n-CDCF1 Comment Length        0000 (0)\n-CDCF3 Disk Start            0000 (0)\n-CDCF5 Int File Attributes   0000 (0)\n+CE2E8 Compression Method    0008 (8) 'Deflated'\n+CE2EA Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CE2EE CRC                   896578EC (2305128684)\n+CE2F2 Compressed Size       00000746 (1862)\n+CE2F6 Uncompressed Size     00001327 (4903)\n+CE2FA Filename Length       0090 (144)\n+CE2FC Extra Length          0000 (0)\n+CE2FE Comment Length        0000 (0)\n+CE300 Disk Start            0000 (0)\n+CE302 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CDCF7 Ext File Attributes   81A40000 (2175008768)\n+CE304 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-CDCFB Local Header Offset   0001389F (80031)\n-CDCFF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+CE308 Local Header Offset   0001386E (79982)\n+CE30C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCDCFF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCE30C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-CDD8F CENTRAL HEADER #276   02014B50 (33639248)\n-CDD93 Created Zip Spec      14 (20) '2.0'\n-CDD94 Created OS            03 (3) 'Unix'\n-CDD95 Extract Zip Spec      14 (20) '2.0'\n-CDD96 Extract OS            00 (0) 'MS-DOS'\n-CDD97 General Purpose Flag  0800 (2048)\n+CE39C CENTRAL HEADER #276   02014B50 (33639248)\n+CE3A0 Created Zip Spec      14 (20) '2.0'\n+CE3A1 Created OS            03 (3) 'Unix'\n+CE3A2 Extract Zip Spec      14 (20) '2.0'\n+CE3A3 Extract OS            00 (0) 'MS-DOS'\n+CE3A4 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-CDD99 Compression Method    0008 (8) 'Deflated'\n-CDD9B Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CDD9F CRC                   64624734 (1684162356)\n-CDDA3 Compressed Size       0000063D (1597)\n-CDDA7 Uncompressed Size     00000D24 (3364)\n-CDDAB Filename Length       0097 (151)\n-CDDAD Extra Length          0000 (0)\n-CDDAF Comment Length        0000 (0)\n-CDDB1 Disk Start            0000 (0)\n-CDDB3 Int File Attributes   0000 (0)\n+CE3A6 Compression Method    0008 (8) 'Deflated'\n+CE3A8 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CE3AC CRC                   64624734 (1684162356)\n+CE3B0 Compressed Size       0000063D (1597)\n+CE3B4 Uncompressed Size     00000D24 (3364)\n+CE3B8 Filename Length       0097 (151)\n+CE3BA Extra Length          0000 (0)\n+CE3BC Comment Length        0000 (0)\n+CE3BE Disk Start            0000 (0)\n+CE3C0 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CDDB5 Ext File Attributes   81A40000 (2175008768)\n+CE3C2 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-CDDB9 Local Header Offset   00014093 (82067)\n-CDDBD Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+CE3C6 Local Header Offset   00014062 (82018)\n+CE3CA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCDDBD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCE3CA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-CDE54 CENTRAL HEADER #277   02014B50 (33639248)\n-CDE58 Created Zip Spec      14 (20) '2.0'\n-CDE59 Created OS            03 (3) 'Unix'\n-CDE5A Extract Zip Spec      14 (20) '2.0'\n-CDE5B Extract OS            00 (0) 'MS-DOS'\n-CDE5C General Purpose Flag  0800 (2048)\n+CE461 CENTRAL HEADER #277   02014B50 (33639248)\n+CE465 Created Zip Spec      14 (20) '2.0'\n+CE466 Created OS            03 (3) 'Unix'\n+CE467 Extract Zip Spec      14 (20) '2.0'\n+CE468 Extract OS            00 (0) 'MS-DOS'\n+CE469 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-CDE5E Compression Method    0008 (8) 'Deflated'\n-CDE60 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CDE64 CRC                   2B6EF697 (728692375)\n-CDE68 Compressed Size       00000444 (1092)\n-CDE6C Uncompressed Size     000008CD (2253)\n-CDE70 Filename Length       0093 (147)\n-CDE72 Extra Length          0000 (0)\n-CDE74 Comment Length        0000 (0)\n-CDE76 Disk Start            0000 (0)\n-CDE78 Int File Attributes   0000 (0)\n+CE46B Compression Method    0008 (8) 'Deflated'\n+CE46D Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CE471 CRC                   2B6EF697 (728692375)\n+CE475 Compressed Size       00000444 (1092)\n+CE479 Uncompressed Size     000008CD (2253)\n+CE47D Filename Length       0093 (147)\n+CE47F Extra Length          0000 (0)\n+CE481 Comment Length        0000 (0)\n+CE483 Disk Start            0000 (0)\n+CE485 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CDE7A Ext File Attributes   81A40000 (2175008768)\n+CE487 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-CDE7E Local Header Offset   00014785 (83845)\n-CDE82 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+CE48B Local Header Offset   00014754 (83796)\n+CE48F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCDE82: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCE48F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-CDF15 CENTRAL HEADER #278   02014B50 (33639248)\n-CDF19 Created Zip Spec      14 (20) '2.0'\n-CDF1A Created OS            03 (3) 'Unix'\n-CDF1B Extract Zip Spec      14 (20) '2.0'\n-CDF1C Extract OS            00 (0) 'MS-DOS'\n-CDF1D General Purpose Flag  0800 (2048)\n+CE522 CENTRAL HEADER #278   02014B50 (33639248)\n+CE526 Created Zip Spec      14 (20) '2.0'\n+CE527 Created OS            03 (3) 'Unix'\n+CE528 Extract Zip Spec      14 (20) '2.0'\n+CE529 Extract OS            00 (0) 'MS-DOS'\n+CE52A General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-CDF1F Compression Method    0008 (8) 'Deflated'\n-CDF21 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CDF25 CRC                   DBC79151 (3687289169)\n-CDF29 Compressed Size       00000874 (2164)\n-CDF2D Uncompressed Size     000013B1 (5041)\n-CDF31 Filename Length       0091 (145)\n-CDF33 Extra Length          0000 (0)\n-CDF35 Comment Length        0000 (0)\n-CDF37 Disk Start            0000 (0)\n-CDF39 Int File Attributes   0000 (0)\n+CE52C Compression Method    0008 (8) 'Deflated'\n+CE52E Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CE532 CRC                   DBC79151 (3687289169)\n+CE536 Compressed Size       00000874 (2164)\n+CE53A Uncompressed Size     000013B1 (5041)\n+CE53E Filename Length       0091 (145)\n+CE540 Extra Length          0000 (0)\n+CE542 Comment Length        0000 (0)\n+CE544 Disk Start            0000 (0)\n+CE546 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CDF3B Ext File Attributes   81A40000 (2175008768)\n+CE548 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-CDF3F Local Header Offset   00014C7A (85114)\n-CDF43 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+CE54C Local Header Offset   00014C49 (85065)\n+CE550 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCDF43: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCE550: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-CDFD4 CENTRAL HEADER #279   02014B50 (33639248)\n-CDFD8 Created Zip Spec      14 (20) '2.0'\n-CDFD9 Created OS            03 (3) 'Unix'\n-CDFDA Extract Zip Spec      14 (20) '2.0'\n-CDFDB Extract OS            00 (0) 'MS-DOS'\n-CDFDC General Purpose Flag  0800 (2048)\n+CE5E1 CENTRAL HEADER #279   02014B50 (33639248)\n+CE5E5 Created Zip Spec      14 (20) '2.0'\n+CE5E6 Created OS            03 (3) 'Unix'\n+CE5E7 Extract Zip Spec      14 (20) '2.0'\n+CE5E8 Extract OS            00 (0) 'MS-DOS'\n+CE5E9 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-CDFDE Compression Method    0008 (8) 'Deflated'\n-CDFE0 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CDFE4 CRC                   9AFFB21B (2600448539)\n-CDFE8 Compressed Size       0000033F (831)\n-CDFEC Uncompressed Size     0000064E (1614)\n-CDFF0 Filename Length       0097 (151)\n-CDFF2 Extra Length          0000 (0)\n-CDFF4 Comment Length        0000 (0)\n-CDFF6 Disk Start            0000 (0)\n-CDFF8 Int File Attributes   0000 (0)\n+CE5EB Compression Method    0008 (8) 'Deflated'\n+CE5ED Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CE5F1 CRC                   9AFFB21B (2600448539)\n+CE5F5 Compressed Size       0000033F (831)\n+CE5F9 Uncompressed Size     0000064E (1614)\n+CE5FD Filename Length       0097 (151)\n+CE5FF Extra Length          0000 (0)\n+CE601 Comment Length        0000 (0)\n+CE603 Disk Start            0000 (0)\n+CE605 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CDFFA Ext File Attributes   81A40000 (2175008768)\n+CE607 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-CDFFE Local Header Offset   0001559D (87453)\n-CE002 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+CE60B Local Header Offset   0001556C (87404)\n+CE60F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCE002: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCE60F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-CE099 CENTRAL HEADER #280   02014B50 (33639248)\n-CE09D Created Zip Spec      14 (20) '2.0'\n-CE09E Created OS            03 (3) 'Unix'\n-CE09F Extract Zip Spec      14 (20) '2.0'\n-CE0A0 Extract OS            00 (0) 'MS-DOS'\n-CE0A1 General Purpose Flag  0800 (2048)\n+CE6A6 CENTRAL HEADER #280   02014B50 (33639248)\n+CE6AA Created Zip Spec      14 (20) '2.0'\n+CE6AB Created OS            03 (3) 'Unix'\n+CE6AC Extract Zip Spec      14 (20) '2.0'\n+CE6AD Extract OS            00 (0) 'MS-DOS'\n+CE6AE General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-CE0A3 Compression Method    0008 (8) 'Deflated'\n-CE0A5 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CE0A9 CRC                   88CF36AA (2295281322)\n-CE0AD Compressed Size       000004BC (1212)\n-CE0B1 Uncompressed Size     00000A4F (2639)\n-CE0B5 Filename Length       0093 (147)\n-CE0B7 Extra Length          0000 (0)\n-CE0B9 Comment Length        0000 (0)\n-CE0BB Disk Start            0000 (0)\n-CE0BD Int File Attributes   0000 (0)\n+CE6B0 Compression Method    0008 (8) 'Deflated'\n+CE6B2 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CE6B6 CRC                   88CF36AA (2295281322)\n+CE6BA Compressed Size       000004BC (1212)\n+CE6BE Uncompressed Size     00000A4F (2639)\n+CE6C2 Filename Length       0093 (147)\n+CE6C4 Extra Length          0000 (0)\n+CE6C6 Comment Length        0000 (0)\n+CE6C8 Disk Start            0000 (0)\n+CE6CA Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CE0BF Ext File Attributes   81A40000 (2175008768)\n+CE6CC 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-CE0C3 Local Header Offset   00015991 (88465)\n-CE0C7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+CE6D0 Local Header Offset   00015960 (88416)\n+CE6D4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCE0C7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCE6D4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-CE15A CENTRAL HEADER #281   02014B50 (33639248)\n-CE15E Created Zip Spec      14 (20) '2.0'\n-CE15F Created OS            03 (3) 'Unix'\n-CE160 Extract Zip Spec      14 (20) '2.0'\n-CE161 Extract OS            00 (0) 'MS-DOS'\n-CE162 General Purpose Flag  0800 (2048)\n+CE767 CENTRAL HEADER #281   02014B50 (33639248)\n+CE76B Created Zip Spec      14 (20) '2.0'\n+CE76C Created OS            03 (3) 'Unix'\n+CE76D Extract Zip Spec      14 (20) '2.0'\n+CE76E Extract OS            00 (0) 'MS-DOS'\n+CE76F General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-CE164 Compression Method    0008 (8) 'Deflated'\n-CE166 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CE16A CRC                   9593555C (2509460828)\n-CE16E Compressed Size       000005DA (1498)\n-CE172 Uncompressed Size     00000D05 (3333)\n-CE176 Filename Length       009C (156)\n-CE178 Extra Length          0000 (0)\n-CE17A Comment Length        0000 (0)\n-CE17C Disk Start            0000 (0)\n-CE17E Int File Attributes   0000 (0)\n+CE771 Compression Method    0008 (8) 'Deflated'\n+CE773 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CE777 CRC                   9593555C (2509460828)\n+CE77B Compressed Size       000005DA (1498)\n+CE77F Uncompressed Size     00000D05 (3333)\n+CE783 Filename Length       009C (156)\n+CE785 Extra Length          0000 (0)\n+CE787 Comment Length        0000 (0)\n+CE789 Disk Start            0000 (0)\n+CE78B Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CE180 Ext File Attributes   81A40000 (2175008768)\n+CE78D 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-CE184 Local Header Offset   00015EFE (89854)\n-CE188 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+CE791 Local Header Offset   00015ECD (89805)\n+CE795 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCE188: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCE795: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-CE224 CENTRAL HEADER #282   02014B50 (33639248)\n-CE228 Created Zip Spec      14 (20) '2.0'\n-CE229 Created OS            03 (3) 'Unix'\n-CE22A Extract Zip Spec      14 (20) '2.0'\n-CE22B Extract OS            00 (0) 'MS-DOS'\n-CE22C General Purpose Flag  0800 (2048)\n+CE831 CENTRAL HEADER #282   02014B50 (33639248)\n+CE835 Created Zip Spec      14 (20) '2.0'\n+CE836 Created OS            03 (3) 'Unix'\n+CE837 Extract Zip Spec      14 (20) '2.0'\n+CE838 Extract OS            00 (0) 'MS-DOS'\n+CE839 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-CE22E Compression Method    0008 (8) 'Deflated'\n-CE230 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CE234 CRC                   9640338D (2520789901)\n-CE238 Compressed Size       00000785 (1925)\n-CE23C Uncompressed Size     000013DD (5085)\n-CE240 Filename Length       0091 (145)\n-CE242 Extra Length          0000 (0)\n-CE244 Comment Length        0000 (0)\n-CE246 Disk Start            0000 (0)\n-CE248 Int File Attributes   0000 (0)\n+CE83B Compression Method    0008 (8) 'Deflated'\n+CE83D Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CE841 CRC                   9640338D (2520789901)\n+CE845 Compressed Size       00000785 (1925)\n+CE849 Uncompressed Size     000013DD (5085)\n+CE84D Filename Length       0091 (145)\n+CE84F Extra Length          0000 (0)\n+CE851 Comment Length        0000 (0)\n+CE853 Disk Start            0000 (0)\n+CE855 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CE24A Ext File Attributes   81A40000 (2175008768)\n+CE857 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-CE24E Local Header Offset   00016592 (91538)\n-CE252 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+CE85B Local Header Offset   00016561 (91489)\n+CE85F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCE252: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCE85F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-CE2E3 CENTRAL HEADER #283   02014B50 (33639248)\n-CE2E7 Created Zip Spec      14 (20) '2.0'\n-CE2E8 Created OS            03 (3) 'Unix'\n-CE2E9 Extract Zip Spec      14 (20) '2.0'\n-CE2EA Extract OS            00 (0) 'MS-DOS'\n-CE2EB General Purpose Flag  0800 (2048)\n+CE8F0 CENTRAL HEADER #283   02014B50 (33639248)\n+CE8F4 Created Zip Spec      14 (20) '2.0'\n+CE8F5 Created OS            03 (3) 'Unix'\n+CE8F6 Extract Zip Spec      14 (20) '2.0'\n+CE8F7 Extract OS            00 (0) 'MS-DOS'\n+CE8F8 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-CE2ED Compression Method    0008 (8) 'Deflated'\n-CE2EF Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CE2F3 CRC                   5232B519 (1379054873)\n-CE2F7 Compressed Size       000009AF (2479)\n-CE2FB Uncompressed Size     00001C1F (7199)\n-CE2FF Filename Length       0093 (147)\n-CE301 Extra Length          0000 (0)\n-CE303 Comment Length        0000 (0)\n-CE305 Disk Start            0000 (0)\n-CE307 Int File Attributes   0000 (0)\n+CE8FA Compression Method    0008 (8) 'Deflated'\n+CE8FC Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CE900 CRC                   5232B519 (1379054873)\n+CE904 Compressed Size       000009AF (2479)\n+CE908 Uncompressed Size     00001C1F (7199)\n+CE90C Filename Length       0093 (147)\n+CE90E Extra Length          0000 (0)\n+CE910 Comment Length        0000 (0)\n+CE912 Disk Start            0000 (0)\n+CE914 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CE309 Ext File Attributes   81A40000 (2175008768)\n+CE916 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-CE30D Local Header Offset   00016DC6 (93638)\n-CE311 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+CE91A Local Header Offset   00016D95 (93589)\n+CE91E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCE311: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCE91E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-CE3A4 CENTRAL HEADER #284   02014B50 (33639248)\n-CE3A8 Created Zip Spec      14 (20) '2.0'\n-CE3A9 Created OS            03 (3) 'Unix'\n-CE3AA Extract Zip Spec      14 (20) '2.0'\n-CE3AB Extract OS            00 (0) 'MS-DOS'\n-CE3AC General Purpose Flag  0800 (2048)\n+CE9B1 CENTRAL HEADER #284   02014B50 (33639248)\n+CE9B5 Created Zip Spec      14 (20) '2.0'\n+CE9B6 Created OS            03 (3) 'Unix'\n+CE9B7 Extract Zip Spec      14 (20) '2.0'\n+CE9B8 Extract OS            00 (0) 'MS-DOS'\n+CE9B9 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-CE3AE Compression Method    0008 (8) 'Deflated'\n-CE3B0 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CE3B4 CRC                   57267C45 (1462139973)\n-CE3B8 Compressed Size       0000083D (2109)\n-CE3BC Uncompressed Size     000013D6 (5078)\n-CE3C0 Filename Length       0090 (144)\n-CE3C2 Extra Length          0000 (0)\n-CE3C4 Comment Length        0000 (0)\n-CE3C6 Disk Start            0000 (0)\n-CE3C8 Int File Attributes   0000 (0)\n+CE9BB Compression Method    0008 (8) 'Deflated'\n+CE9BD Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CE9C1 CRC                   57267C45 (1462139973)\n+CE9C5 Compressed Size       0000083D (2109)\n+CE9C9 Uncompressed Size     000013D6 (5078)\n+CE9CD Filename Length       0090 (144)\n+CE9CF Extra Length          0000 (0)\n+CE9D1 Comment Length        0000 (0)\n+CE9D3 Disk Start            0000 (0)\n+CE9D5 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CE3CA Ext File Attributes   81A40000 (2175008768)\n+CE9D7 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-CE3CE Local Header Offset   00017826 (96294)\n-CE3D2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+CE9DB Local Header Offset   000177F5 (96245)\n+CE9DF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCE3D2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCE9DF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-CE462 CENTRAL HEADER #285   02014B50 (33639248)\n-CE466 Created Zip Spec      14 (20) '2.0'\n-CE467 Created OS            03 (3) 'Unix'\n-CE468 Extract Zip Spec      14 (20) '2.0'\n-CE469 Extract OS            00 (0) 'MS-DOS'\n-CE46A General Purpose Flag  0800 (2048)\n+CEA6F CENTRAL HEADER #285   02014B50 (33639248)\n+CEA73 Created Zip Spec      14 (20) '2.0'\n+CEA74 Created OS            03 (3) 'Unix'\n+CEA75 Extract Zip Spec      14 (20) '2.0'\n+CEA76 Extract OS            00 (0) 'MS-DOS'\n+CEA77 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-CE46C Compression Method    0008 (8) 'Deflated'\n-CE46E Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CE472 CRC                   333FC2BB (859816635)\n-CE476 Compressed Size       00000395 (917)\n-CE47A Uncompressed Size     00000736 (1846)\n-CE47E Filename Length       0097 (151)\n-CE480 Extra Length          0000 (0)\n-CE482 Comment Length        0000 (0)\n-CE484 Disk Start            0000 (0)\n-CE486 Int File Attributes   0000 (0)\n+CEA79 Compression Method    0008 (8) 'Deflated'\n+CEA7B Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CEA7F CRC                   333FC2BB (859816635)\n+CEA83 Compressed Size       00000395 (917)\n+CEA87 Uncompressed Size     00000736 (1846)\n+CEA8B Filename Length       0097 (151)\n+CEA8D Extra Length          0000 (0)\n+CEA8F Comment Length        0000 (0)\n+CEA91 Disk Start            0000 (0)\n+CEA93 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CE488 Ext File Attributes   81A40000 (2175008768)\n+CEA95 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-CE48C Local Header Offset   00018111 (98577)\n-CE490 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+CEA99 Local Header Offset   000180E0 (98528)\n+CEA9D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCE490: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCEA9D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-CE527 CENTRAL HEADER #286   02014B50 (33639248)\n-CE52B Created Zip Spec      14 (20) '2.0'\n-CE52C Created OS            03 (3) 'Unix'\n-CE52D Extract Zip Spec      14 (20) '2.0'\n-CE52E Extract OS            00 (0) 'MS-DOS'\n-CE52F General Purpose Flag  0800 (2048)\n+CEB34 CENTRAL HEADER #286   02014B50 (33639248)\n+CEB38 Created Zip Spec      14 (20) '2.0'\n+CEB39 Created OS            03 (3) 'Unix'\n+CEB3A Extract Zip Spec      14 (20) '2.0'\n+CEB3B Extract OS            00 (0) 'MS-DOS'\n+CEB3C General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-CE531 Compression Method    0008 (8) 'Deflated'\n-CE533 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CE537 CRC                   10CC5E74 (281828980)\n-CE53B Compressed Size       000004BC (1212)\n-CE53F Uncompressed Size     000009CD (2509)\n-CE543 Filename Length       0070 (112)\n-CE545 Extra Length          0000 (0)\n-CE547 Comment Length        0000 (0)\n-CE549 Disk Start            0000 (0)\n-CE54B Int File Attributes   0000 (0)\n+CEB3E Compression Method    0008 (8) 'Deflated'\n+CEB40 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CEB44 CRC                   10CC5E74 (281828980)\n+CEB48 Compressed Size       000004BC (1212)\n+CEB4C Uncompressed Size     000009CD (2509)\n+CEB50 Filename Length       0070 (112)\n+CEB52 Extra Length          0000 (0)\n+CEB54 Comment Length        0000 (0)\n+CEB56 Disk Start            0000 (0)\n+CEB58 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CE54D Ext File Attributes   81A40000 (2175008768)\n+CEB5A 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-CE551 Local Header Offset   0001855B (99675)\n-CE555 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CEB5E Local Header Offset   0001852A (99626)\n+CEB62 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCE555: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCEB62: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-CE5C5 CENTRAL HEADER #287   02014B50 (33639248)\n-CE5C9 Created Zip Spec      14 (20) '2.0'\n-CE5CA Created OS            03 (3) 'Unix'\n-CE5CB Extract Zip Spec      14 (20) '2.0'\n-CE5CC Extract OS            00 (0) 'MS-DOS'\n-CE5CD General Purpose Flag  0800 (2048)\n+CEBD2 CENTRAL HEADER #287   02014B50 (33639248)\n+CEBD6 Created Zip Spec      14 (20) '2.0'\n+CEBD7 Created OS            03 (3) 'Unix'\n+CEBD8 Extract Zip Spec      14 (20) '2.0'\n+CEBD9 Extract OS            00 (0) 'MS-DOS'\n+CEBDA General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-CE5CF Compression Method    0008 (8) 'Deflated'\n-CE5D1 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CE5D5 CRC                   5F6BF872 (1600911474)\n-CE5D9 Compressed Size       000004BC (1212)\n-CE5DD Uncompressed Size     000009A0 (2464)\n-CE5E1 Filename Length       0070 (112)\n-CE5E3 Extra Length          0000 (0)\n-CE5E5 Comment Length        0000 (0)\n-CE5E7 Disk Start            0000 (0)\n-CE5E9 Int File Attributes   0000 (0)\n+CEBDC Compression Method    0008 (8) 'Deflated'\n+CEBDE Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CEBE2 CRC                   5F6BF872 (1600911474)\n+CEBE6 Compressed Size       000004BC (1212)\n+CEBEA Uncompressed Size     000009A0 (2464)\n+CEBEE Filename Length       0070 (112)\n+CEBF0 Extra Length          0000 (0)\n+CEBF2 Comment Length        0000 (0)\n+CEBF4 Disk Start            0000 (0)\n+CEBF6 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CE5EB Ext File Attributes   81A40000 (2175008768)\n+CEBF8 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-CE5EF Local Header Offset   00018AA5 (101029)\n-CE5F3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CEBFC Local Header Offset   00018A74 (100980)\n+CEC00 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCE5F3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCEC00: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-CE663 CENTRAL HEADER #288   02014B50 (33639248)\n-CE667 Created Zip Spec      14 (20) '2.0'\n-CE668 Created OS            03 (3) 'Unix'\n-CE669 Extract Zip Spec      14 (20) '2.0'\n-CE66A Extract OS            00 (0) 'MS-DOS'\n-CE66B General Purpose Flag  0800 (2048)\n+CEC70 CENTRAL HEADER #288   02014B50 (33639248)\n+CEC74 Created Zip Spec      14 (20) '2.0'\n+CEC75 Created OS            03 (3) 'Unix'\n+CEC76 Extract Zip Spec      14 (20) '2.0'\n+CEC77 Extract OS            00 (0) 'MS-DOS'\n+CEC78 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-CE66D Compression Method    0008 (8) 'Deflated'\n-CE66F Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CE673 CRC                   456B0BC9 (1164643273)\n-CE677 Compressed Size       000005BD (1469)\n-CE67B Uncompressed Size     00001135 (4405)\n-CE67F Filename Length       006C (108)\n-CE681 Extra Length          0000 (0)\n-CE683 Comment Length        0000 (0)\n-CE685 Disk Start            0000 (0)\n-CE687 Int File Attributes   0000 (0)\n+CEC7A Compression Method    0008 (8) 'Deflated'\n+CEC7C Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CEC80 CRC                   456B0BC9 (1164643273)\n+CEC84 Compressed Size       000005BD (1469)\n+CEC88 Uncompressed Size     00001135 (4405)\n+CEC8C Filename Length       006C (108)\n+CEC8E Extra Length          0000 (0)\n+CEC90 Comment Length        0000 (0)\n+CEC92 Disk Start            0000 (0)\n+CEC94 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CE689 Ext File Attributes   81A40000 (2175008768)\n+CEC96 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-CE68D Local Header Offset   00018FEF (102383)\n-CE691 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CEC9A Local Header Offset   00018FBE (102334)\n+CEC9E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCE691: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCEC9E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-CE6FD CENTRAL HEADER #289   02014B50 (33639248)\n-CE701 Created Zip Spec      14 (20) '2.0'\n-CE702 Created OS            03 (3) 'Unix'\n-CE703 Extract Zip Spec      14 (20) '2.0'\n-CE704 Extract OS            00 (0) 'MS-DOS'\n-CE705 General Purpose Flag  0800 (2048)\n+CED0A CENTRAL HEADER #289   02014B50 (33639248)\n+CED0E Created Zip Spec      14 (20) '2.0'\n+CED0F Created OS            03 (3) 'Unix'\n+CED10 Extract Zip Spec      14 (20) '2.0'\n+CED11 Extract OS            00 (0) 'MS-DOS'\n+CED12 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-CE707 Compression Method    0008 (8) 'Deflated'\n-CE709 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CE70D CRC                   6A45582D (1782929453)\n-CE711 Compressed Size       000004E4 (1252)\n-CE715 Uncompressed Size     000009E0 (2528)\n-CE719 Filename Length       0075 (117)\n-CE71B Extra Length          0000 (0)\n-CE71D Comment Length        0000 (0)\n-CE71F Disk Start            0000 (0)\n-CE721 Int File Attributes   0000 (0)\n+CED14 Compression Method    0008 (8) 'Deflated'\n+CED16 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CED1A CRC                   6A45582D (1782929453)\n+CED1E Compressed Size       000004E4 (1252)\n+CED22 Uncompressed Size     000009E0 (2528)\n+CED26 Filename Length       0075 (117)\n+CED28 Extra Length          0000 (0)\n+CED2A Comment Length        0000 (0)\n+CED2C Disk Start            0000 (0)\n+CED2E Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CE723 Ext File Attributes   81A40000 (2175008768)\n+CED30 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-CE727 Local Header Offset   00019636 (103990)\n-CE72B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CED34 Local Header Offset   00019605 (103941)\n+CED38 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCE72B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCED38: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-CE7A0 CENTRAL HEADER #290   02014B50 (33639248)\n-CE7A4 Created Zip Spec      14 (20) '2.0'\n-CE7A5 Created OS            03 (3) 'Unix'\n-CE7A6 Extract Zip Spec      14 (20) '2.0'\n-CE7A7 Extract OS            00 (0) 'MS-DOS'\n-CE7A8 General Purpose Flag  0800 (2048)\n+CEDAD CENTRAL HEADER #290   02014B50 (33639248)\n+CEDB1 Created Zip Spec      14 (20) '2.0'\n+CEDB2 Created OS            03 (3) 'Unix'\n+CEDB3 Extract Zip Spec      14 (20) '2.0'\n+CEDB4 Extract OS            00 (0) 'MS-DOS'\n+CEDB5 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-CE7AA Compression Method    0008 (8) 'Deflated'\n-CE7AC Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CE7B0 CRC                   4731534C (1194414924)\n-CE7B4 Compressed Size       0000051E (1310)\n-CE7B8 Uncompressed Size     00000B90 (2960)\n-CE7BC Filename Length       0077 (119)\n-CE7BE Extra Length          0000 (0)\n-CE7C0 Comment Length        0000 (0)\n-CE7C2 Disk Start            0000 (0)\n-CE7C4 Int File Attributes   0000 (0)\n+CEDB7 Compression Method    0008 (8) 'Deflated'\n+CEDB9 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CEDBD CRC                   4731534C (1194414924)\n+CEDC1 Compressed Size       0000051E (1310)\n+CEDC5 Uncompressed Size     00000B90 (2960)\n+CEDC9 Filename Length       0077 (119)\n+CEDCB Extra Length          0000 (0)\n+CEDCD Comment Length        0000 (0)\n+CEDCF Disk Start            0000 (0)\n+CEDD1 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CE7C6 Ext File Attributes   81A40000 (2175008768)\n+CEDD3 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-CE7CA Local Header Offset   00019BAD (105389)\n-CE7CE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CEDD7 Local Header Offset   00019B7C (105340)\n+CEDDB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCE7CE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCEDDB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-CE845 CENTRAL HEADER #291   02014B50 (33639248)\n-CE849 Created Zip Spec      14 (20) '2.0'\n-CE84A Created OS            03 (3) 'Unix'\n-CE84B Extract Zip Spec      14 (20) '2.0'\n-CE84C Extract OS            00 (0) 'MS-DOS'\n-CE84D General Purpose Flag  0800 (2048)\n+CEE52 CENTRAL HEADER #291   02014B50 (33639248)\n+CEE56 Created Zip Spec      14 (20) '2.0'\n+CEE57 Created OS            03 (3) 'Unix'\n+CEE58 Extract Zip Spec      14 (20) '2.0'\n+CEE59 Extract OS            00 (0) 'MS-DOS'\n+CEE5A General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-CE84F Compression Method    0008 (8) 'Deflated'\n-CE851 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CE855 CRC                   CEBA8B64 (3468331876)\n-CE859 Compressed Size       000004A0 (1184)\n-CE85D Uncompressed Size     00000A7D (2685)\n-CE861 Filename Length       0076 (118)\n-CE863 Extra Length          0000 (0)\n-CE865 Comment Length        0000 (0)\n-CE867 Disk Start            0000 (0)\n-CE869 Int File Attributes   0000 (0)\n+CEE5C Compression Method    0008 (8) 'Deflated'\n+CEE5E Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CEE62 CRC                   CEBA8B64 (3468331876)\n+CEE66 Compressed Size       000004A0 (1184)\n+CEE6A Uncompressed Size     00000A7D (2685)\n+CEE6E Filename Length       0076 (118)\n+CEE70 Extra Length          0000 (0)\n+CEE72 Comment Length        0000 (0)\n+CEE74 Disk Start            0000 (0)\n+CEE76 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CE86B Ext File Attributes   81A40000 (2175008768)\n+CEE78 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-CE86F Local Header Offset   0001A160 (106848)\n-CE873 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CEE7C Local Header Offset   0001A12F (106799)\n+CEE80 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCE873: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCEE80: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-CE8E9 CENTRAL HEADER #292   02014B50 (33639248)\n-CE8ED Created Zip Spec      14 (20) '2.0'\n-CE8EE Created OS            03 (3) 'Unix'\n-CE8EF Extract Zip Spec      14 (20) '2.0'\n-CE8F0 Extract OS            00 (0) 'MS-DOS'\n-CE8F1 General Purpose Flag  0800 (2048)\n+CEEF6 CENTRAL HEADER #292   02014B50 (33639248)\n+CEEFA Created Zip Spec      14 (20) '2.0'\n+CEEFB Created OS            03 (3) 'Unix'\n+CEEFC Extract Zip Spec      14 (20) '2.0'\n+CEEFD Extract OS            00 (0) 'MS-DOS'\n+CEEFE General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-CE8F3 Compression Method    0008 (8) 'Deflated'\n-CE8F5 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CE8F9 CRC                   0DACEA84 (229436036)\n-CE8FD Compressed Size       000004B1 (1201)\n-CE901 Uncompressed Size     00000A95 (2709)\n-CE905 Filename Length       0075 (117)\n-CE907 Extra Length          0000 (0)\n-CE909 Comment Length        0000 (0)\n-CE90B Disk Start            0000 (0)\n-CE90D Int File Attributes   0000 (0)\n+CEF00 Compression Method    0008 (8) 'Deflated'\n+CEF02 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CEF06 CRC                   0DACEA84 (229436036)\n+CEF0A Compressed Size       000004B1 (1201)\n+CEF0E Uncompressed Size     00000A95 (2709)\n+CEF12 Filename Length       0075 (117)\n+CEF14 Extra Length          0000 (0)\n+CEF16 Comment Length        0000 (0)\n+CEF18 Disk Start            0000 (0)\n+CEF1A Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CE90F Ext File Attributes   81A40000 (2175008768)\n+CEF1C 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-CE913 Local Header Offset   0001A694 (108180)\n-CE917 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CEF20 Local Header Offset   0001A663 (108131)\n+CEF24 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCE917: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCEF24: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-CE98C CENTRAL HEADER #293   02014B50 (33639248)\n-CE990 Created Zip Spec      14 (20) '2.0'\n-CE991 Created OS            03 (3) 'Unix'\n-CE992 Extract Zip Spec      14 (20) '2.0'\n-CE993 Extract OS            00 (0) 'MS-DOS'\n-CE994 General Purpose Flag  0800 (2048)\n+CEF99 CENTRAL HEADER #293   02014B50 (33639248)\n+CEF9D Created Zip Spec      14 (20) '2.0'\n+CEF9E Created OS            03 (3) 'Unix'\n+CEF9F Extract Zip Spec      14 (20) '2.0'\n+CEFA0 Extract OS            00 (0) 'MS-DOS'\n+CEFA1 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-CE996 Compression Method    0008 (8) 'Deflated'\n-CE998 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CE99C CRC                   2E84B239 (780448313)\n-CE9A0 Compressed Size       000006DB (1755)\n-CE9A4 Uncompressed Size     0000121D (4637)\n-CE9A8 Filename Length       0076 (118)\n-CE9AA Extra Length          0000 (0)\n-CE9AC Comment Length        0000 (0)\n-CE9AE Disk Start            0000 (0)\n-CE9B0 Int File Attributes   0000 (0)\n+CEFA3 Compression Method    0008 (8) 'Deflated'\n+CEFA5 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CEFA9 CRC                   2E84B239 (780448313)\n+CEFAD Compressed Size       000006DB (1755)\n+CEFB1 Uncompressed Size     0000121D (4637)\n+CEFB5 Filename Length       0076 (118)\n+CEFB7 Extra Length          0000 (0)\n+CEFB9 Comment Length        0000 (0)\n+CEFBB Disk Start            0000 (0)\n+CEFBD Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CE9B2 Ext File Attributes   81A40000 (2175008768)\n+CEFBF 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-CE9B6 Local Header Offset   0001ABD8 (109528)\n-CE9BA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CEFC3 Local Header Offset   0001ABA7 (109479)\n+CEFC7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCE9BA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCEFC7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-CEA30 CENTRAL HEADER #294   02014B50 (33639248)\n-CEA34 Created Zip Spec      14 (20) '2.0'\n-CEA35 Created OS            03 (3) 'Unix'\n-CEA36 Extract Zip Spec      14 (20) '2.0'\n-CEA37 Extract OS            00 (0) 'MS-DOS'\n-CEA38 General Purpose Flag  0800 (2048)\n+CF03D CENTRAL HEADER #294   02014B50 (33639248)\n+CF041 Created Zip Spec      14 (20) '2.0'\n+CF042 Created OS            03 (3) 'Unix'\n+CF043 Extract Zip Spec      14 (20) '2.0'\n+CF044 Extract OS            00 (0) 'MS-DOS'\n+CF045 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-CEA3A Compression Method    0008 (8) 'Deflated'\n-CEA3C Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CEA40 CRC                   10E7267F (283584127)\n-CEA44 Compressed Size       000003B1 (945)\n-CEA48 Uncompressed Size     000006FB (1787)\n-CEA4C Filename Length       0090 (144)\n-CEA4E Extra Length          0000 (0)\n-CEA50 Comment Length        0000 (0)\n-CEA52 Disk Start            0000 (0)\n-CEA54 Int File Attributes   0000 (0)\n+CF047 Compression Method    0008 (8) 'Deflated'\n+CF049 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CF04D CRC                   10E7267F (283584127)\n+CF051 Compressed Size       000003B1 (945)\n+CF055 Uncompressed Size     000006FB (1787)\n+CF059 Filename Length       0090 (144)\n+CF05B Extra Length          0000 (0)\n+CF05D Comment Length        0000 (0)\n+CF05F Disk Start            0000 (0)\n+CF061 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CEA56 Ext File Attributes   81A40000 (2175008768)\n+CF063 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-CEA5A Local Header Offset   0001B347 (111431)\n-CEA5E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+CF067 Local Header Offset   0001B316 (111382)\n+CF06B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCEA5E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCF06B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-CEAEE CENTRAL HEADER #295   02014B50 (33639248)\n-CEAF2 Created Zip Spec      14 (20) '2.0'\n-CEAF3 Created OS            03 (3) 'Unix'\n-CEAF4 Extract Zip Spec      14 (20) '2.0'\n-CEAF5 Extract OS            00 (0) 'MS-DOS'\n-CEAF6 General Purpose Flag  0800 (2048)\n+CF0FB CENTRAL HEADER #295   02014B50 (33639248)\n+CF0FF Created Zip Spec      14 (20) '2.0'\n+CF100 Created OS            03 (3) 'Unix'\n+CF101 Extract Zip Spec      14 (20) '2.0'\n+CF102 Extract OS            00 (0) 'MS-DOS'\n+CF103 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-CEAF8 Compression Method    0008 (8) 'Deflated'\n-CEAFA Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CEAFE CRC                   24E47A3B (618953275)\n-CEB02 Compressed Size       000003B4 (948)\n-CEB06 Uncompressed Size     000006FF (1791)\n-CEB0A Filename Length       0091 (145)\n-CEB0C Extra Length          0000 (0)\n-CEB0E Comment Length        0000 (0)\n-CEB10 Disk Start            0000 (0)\n-CEB12 Int File Attributes   0000 (0)\n+CF105 Compression Method    0008 (8) 'Deflated'\n+CF107 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CF10B CRC                   24E47A3B (618953275)\n+CF10F Compressed Size       000003B4 (948)\n+CF113 Uncompressed Size     000006FF (1791)\n+CF117 Filename Length       0091 (145)\n+CF119 Extra Length          0000 (0)\n+CF11B Comment Length        0000 (0)\n+CF11D Disk Start            0000 (0)\n+CF11F Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CEB14 Ext File Attributes   81A40000 (2175008768)\n+CF121 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-CEB18 Local Header Offset   0001B7A6 (112550)\n-CEB1C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+CF125 Local Header Offset   0001B775 (112501)\n+CF129 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCEB1C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCF129: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-CEBAD CENTRAL HEADER #296   02014B50 (33639248)\n-CEBB1 Created Zip Spec      14 (20) '2.0'\n-CEBB2 Created OS            03 (3) 'Unix'\n-CEBB3 Extract Zip Spec      14 (20) '2.0'\n-CEBB4 Extract OS            00 (0) 'MS-DOS'\n-CEBB5 General Purpose Flag  0800 (2048)\n+CF1BA CENTRAL HEADER #296   02014B50 (33639248)\n+CF1BE Created Zip Spec      14 (20) '2.0'\n+CF1BF Created OS            03 (3) 'Unix'\n+CF1C0 Extract Zip Spec      14 (20) '2.0'\n+CF1C1 Extract OS            00 (0) 'MS-DOS'\n+CF1C2 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-CEBB7 Compression Method    0008 (8) 'Deflated'\n-CEBB9 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CEBBD CRC                   042BB565 (69973349)\n-CEBC1 Compressed Size       000007C6 (1990)\n-CEBC5 Uncompressed Size     00001364 (4964)\n-CEBC9 Filename Length       008C (140)\n-CEBCB Extra Length          0000 (0)\n-CEBCD Comment Length        0000 (0)\n-CEBCF Disk Start            0000 (0)\n-CEBD1 Int File Attributes   0000 (0)\n+CF1C4 Compression Method    0008 (8) 'Deflated'\n+CF1C6 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CF1CA CRC                   042BB565 (69973349)\n+CF1CE Compressed Size       000007C6 (1990)\n+CF1D2 Uncompressed Size     00001364 (4964)\n+CF1D6 Filename Length       008C (140)\n+CF1D8 Extra Length          0000 (0)\n+CF1DA Comment Length        0000 (0)\n+CF1DC Disk Start            0000 (0)\n+CF1DE Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CEBD3 Ext File Attributes   81A40000 (2175008768)\n+CF1E0 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-CEBD7 Local Header Offset   0001BC09 (113673)\n-CEBDB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+CF1E4 Local Header Offset   0001BBD8 (113624)\n+CF1E8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXXXX'\n #\n-# WARNING: Offset 0xCEBDB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCF1E8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-CEC67 CENTRAL HEADER #297   02014B50 (33639248)\n-CEC6B Created Zip Spec      14 (20) '2.0'\n-CEC6C Created OS            03 (3) 'Unix'\n-CEC6D Extract Zip Spec      14 (20) '2.0'\n-CEC6E Extract OS            00 (0) 'MS-DOS'\n-CEC6F General Purpose Flag  0800 (2048)\n+CF274 CENTRAL HEADER #297   02014B50 (33639248)\n+CF278 Created Zip Spec      14 (20) '2.0'\n+CF279 Created OS            03 (3) 'Unix'\n+CF27A Extract Zip Spec      14 (20) '2.0'\n+CF27B Extract OS            00 (0) 'MS-DOS'\n+CF27C General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-CEC71 Compression Method    0008 (8) 'Deflated'\n-CEC73 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CEC77 CRC                   7A63232B (2053317419)\n-CEC7B Compressed Size       0000084C (2124)\n-CEC7F Uncompressed Size     000013C0 (5056)\n-CEC83 Filename Length       008D (141)\n-CEC85 Extra Length          0000 (0)\n-CEC87 Comment Length        0000 (0)\n-CEC89 Disk Start            0000 (0)\n-CEC8B Int File Attributes   0000 (0)\n+CF27E Compression Method    0008 (8) 'Deflated'\n+CF280 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CF284 CRC                   7A63232B (2053317419)\n+CF288 Compressed Size       0000084C (2124)\n+CF28C Uncompressed Size     000013C0 (5056)\n+CF290 Filename Length       008D (141)\n+CF292 Extra Length          0000 (0)\n+CF294 Comment Length        0000 (0)\n+CF296 Disk Start            0000 (0)\n+CF298 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CEC8D Ext File Attributes   81A40000 (2175008768)\n+CF29A 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-CEC91 Local Header Offset   0001C479 (115833)\n-CEC95 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+CF29E Local Header Offset   0001C448 (115784)\n+CF2A2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXXXXX'\n #\n-# WARNING: Offset 0xCEC95: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCF2A2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-CED22 CENTRAL HEADER #298   02014B50 (33639248)\n-CED26 Created Zip Spec      14 (20) '2.0'\n-CED27 Created OS            03 (3) 'Unix'\n-CED28 Extract Zip Spec      14 (20) '2.0'\n-CED29 Extract OS            00 (0) 'MS-DOS'\n-CED2A General Purpose Flag  0800 (2048)\n+CF32F CENTRAL HEADER #298   02014B50 (33639248)\n+CF333 Created Zip Spec      14 (20) '2.0'\n+CF334 Created OS            03 (3) 'Unix'\n+CF335 Extract Zip Spec      14 (20) '2.0'\n+CF336 Extract OS            00 (0) 'MS-DOS'\n+CF337 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-CED2C Compression Method    0008 (8) 'Deflated'\n-CED2E Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CED32 CRC                   19888393 (428376979)\n-CED36 Compressed Size       000004B8 (1208)\n-CED3A Uncompressed Size     0000092E (2350)\n-CED3E Filename Length       0076 (118)\n-CED40 Extra Length          0000 (0)\n-CED42 Comment Length        0000 (0)\n-CED44 Disk Start            0000 (0)\n-CED46 Int File Attributes   0000 (0)\n+CF339 Compression Method    0008 (8) 'Deflated'\n+CF33B Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CF33F CRC                   19888393 (428376979)\n+CF343 Compressed Size       000004B8 (1208)\n+CF347 Uncompressed Size     0000092E (2350)\n+CF34B Filename Length       0076 (118)\n+CF34D Extra Length          0000 (0)\n+CF34F Comment Length        0000 (0)\n+CF351 Disk Start            0000 (0)\n+CF353 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CED48 Ext File Attributes   81A40000 (2175008768)\n+CF355 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-CED4C Local Header Offset   0001CD70 (118128)\n-CED50 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CF359 Local Header Offset   0001CD3F (118079)\n+CF35D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCED50: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCF35D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-CEDC6 CENTRAL HEADER #299   02014B50 (33639248)\n-CEDCA Created Zip Spec      14 (20) '2.0'\n-CEDCB Created OS            03 (3) 'Unix'\n-CEDCC Extract Zip Spec      14 (20) '2.0'\n-CEDCD Extract OS            00 (0) 'MS-DOS'\n-CEDCE General Purpose Flag  0800 (2048)\n+CF3D3 CENTRAL HEADER #299   02014B50 (33639248)\n+CF3D7 Created Zip Spec      14 (20) '2.0'\n+CF3D8 Created OS            03 (3) 'Unix'\n+CF3D9 Extract Zip Spec      14 (20) '2.0'\n+CF3DA Extract OS            00 (0) 'MS-DOS'\n+CF3DB General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-CEDD0 Compression Method    0008 (8) 'Deflated'\n-CEDD2 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CEDD6 CRC                   8B1E3BB7 (2334014391)\n-CEDDA Compressed Size       00000B79 (2937)\n-CEDDE Uncompressed Size     00002091 (8337)\n-CEDE2 Filename Length       007C (124)\n-CEDE4 Extra Length          0000 (0)\n-CEDE6 Comment Length        0000 (0)\n-CEDE8 Disk Start            0000 (0)\n-CEDEA Int File Attributes   0000 (0)\n+CF3DD Compression Method    0008 (8) 'Deflated'\n+CF3DF Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CF3E3 CRC                   8B1E3BB7 (2334014391)\n+CF3E7 Compressed Size       00000B79 (2937)\n+CF3EB Uncompressed Size     00002091 (8337)\n+CF3EF Filename Length       007C (124)\n+CF3F1 Extra Length          0000 (0)\n+CF3F3 Comment Length        0000 (0)\n+CF3F5 Disk Start            0000 (0)\n+CF3F7 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CEDEC Ext File Attributes   81A40000 (2175008768)\n+CF3F9 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-CEDF0 Local Header Offset   0001D2BC (119484)\n-CEDF4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CF3FD Local Header Offset   0001D28B (119435)\n+CF401 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCEDF4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCF401: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-CEE70 CENTRAL HEADER #300   02014B50 (33639248)\n-CEE74 Created Zip Spec      14 (20) '2.0'\n-CEE75 Created OS            03 (3) 'Unix'\n-CEE76 Extract Zip Spec      14 (20) '2.0'\n-CEE77 Extract OS            00 (0) 'MS-DOS'\n-CEE78 General Purpose Flag  0800 (2048)\n+CF47D CENTRAL HEADER #300   02014B50 (33639248)\n+CF481 Created Zip Spec      14 (20) '2.0'\n+CF482 Created OS            03 (3) 'Unix'\n+CF483 Extract Zip Spec      14 (20) '2.0'\n+CF484 Extract OS            00 (0) 'MS-DOS'\n+CF485 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-CEE7A Compression Method    0008 (8) 'Deflated'\n-CEE7C Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CEE80 CRC                   0D142FFC (219426812)\n-CEE84 Compressed Size       000009EA (2538)\n-CEE88 Uncompressed Size     00001A7B (6779)\n-CEE8C Filename Length       0091 (145)\n-CEE8E Extra Length          0000 (0)\n-CEE90 Comment Length        0000 (0)\n-CEE92 Disk Start            0000 (0)\n-CEE94 Int File Attributes   0000 (0)\n+CF487 Compression Method    0008 (8) 'Deflated'\n+CF489 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CF48D CRC                   0D142FFC (219426812)\n+CF491 Compressed Size       000009EA (2538)\n+CF495 Uncompressed Size     00001A7B (6779)\n+CF499 Filename Length       0091 (145)\n+CF49B Extra Length          0000 (0)\n+CF49D Comment Length        0000 (0)\n+CF49F Disk Start            0000 (0)\n+CF4A1 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CEE96 Ext File Attributes   81A40000 (2175008768)\n+CF4A3 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-CEE9A Local Header Offset   0001DECF (122575)\n-CEE9E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+CF4A7 Local Header Offset   0001DE9E (122526)\n+CF4AB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCEE9E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCF4AB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-CEF2F CENTRAL HEADER #301   02014B50 (33639248)\n-CEF33 Created Zip Spec      14 (20) '2.0'\n-CEF34 Created OS            03 (3) 'Unix'\n-CEF35 Extract Zip Spec      14 (20) '2.0'\n-CEF36 Extract OS            00 (0) 'MS-DOS'\n-CEF37 General Purpose Flag  0800 (2048)\n+CF53C CENTRAL HEADER #301   02014B50 (33639248)\n+CF540 Created Zip Spec      14 (20) '2.0'\n+CF541 Created OS            03 (3) 'Unix'\n+CF542 Extract Zip Spec      14 (20) '2.0'\n+CF543 Extract OS            00 (0) 'MS-DOS'\n+CF544 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-CEF39 Compression Method    0008 (8) 'Deflated'\n-CEF3B Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CEF3F CRC                   726CFBF2 (1919745010)\n-CEF43 Compressed Size       00000434 (1076)\n-CEF47 Uncompressed Size     00000886 (2182)\n-CEF4B Filename Length       0097 (151)\n-CEF4D Extra Length          0000 (0)\n-CEF4F Comment Length        0000 (0)\n-CEF51 Disk Start            0000 (0)\n-CEF53 Int File Attributes   0000 (0)\n+CF546 Compression Method    0008 (8) 'Deflated'\n+CF548 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CF54C CRC                   726CFBF2 (1919745010)\n+CF550 Compressed Size       00000434 (1076)\n+CF554 Uncompressed Size     00000886 (2182)\n+CF558 Filename Length       0097 (151)\n+CF55A Extra Length          0000 (0)\n+CF55C Comment Length        0000 (0)\n+CF55E Disk Start            0000 (0)\n+CF560 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CEF55 Ext File Attributes   81A40000 (2175008768)\n+CF562 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-CEF59 Local Header Offset   0001E968 (125288)\n-CEF5D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+CF566 Local Header Offset   0001E937 (125239)\n+CF56A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCEF5D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCF56A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-CEFF4 CENTRAL HEADER #302   02014B50 (33639248)\n-CEFF8 Created Zip Spec      14 (20) '2.0'\n-CEFF9 Created OS            03 (3) 'Unix'\n-CEFFA Extract Zip Spec      14 (20) '2.0'\n-CEFFB Extract OS            00 (0) 'MS-DOS'\n-CEFFC General Purpose Flag  0800 (2048)\n+CF601 CENTRAL HEADER #302   02014B50 (33639248)\n+CF605 Created Zip Spec      14 (20) '2.0'\n+CF606 Created OS            03 (3) 'Unix'\n+CF607 Extract Zip Spec      14 (20) '2.0'\n+CF608 Extract OS            00 (0) 'MS-DOS'\n+CF609 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-CEFFE Compression Method    0008 (8) 'Deflated'\n-CF000 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CF004 CRC                   0124A640 (19179072)\n-CF008 Compressed Size       0000070A (1802)\n-CF00C Uncompressed Size     00001071 (4209)\n-CF010 Filename Length       009E (158)\n-CF012 Extra Length          0000 (0)\n-CF014 Comment Length        0000 (0)\n-CF016 Disk Start            0000 (0)\n-CF018 Int File Attributes   0000 (0)\n+CF60B Compression Method    0008 (8) 'Deflated'\n+CF60D Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CF611 CRC                   0124A640 (19179072)\n+CF615 Compressed Size       0000070A (1802)\n+CF619 Uncompressed Size     00001071 (4209)\n+CF61D Filename Length       009E (158)\n+CF61F Extra Length          0000 (0)\n+CF621 Comment Length        0000 (0)\n+CF623 Disk Start            0000 (0)\n+CF625 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CF01A Ext File Attributes   81A40000 (2175008768)\n+CF627 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-CF01E Local Header Offset   0001EE51 (126545)\n-CF022 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+CF62B Local Header Offset   0001EE20 (126496)\n+CF62F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCF022: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCF62F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-CF0C0 CENTRAL HEADER #303   02014B50 (33639248)\n-CF0C4 Created Zip Spec      14 (20) '2.0'\n-CF0C5 Created OS            03 (3) 'Unix'\n-CF0C6 Extract Zip Spec      14 (20) '2.0'\n-CF0C7 Extract OS            00 (0) 'MS-DOS'\n-CF0C8 General Purpose Flag  0800 (2048)\n+CF6CD CENTRAL HEADER #303   02014B50 (33639248)\n+CF6D1 Created Zip Spec      14 (20) '2.0'\n+CF6D2 Created OS            03 (3) 'Unix'\n+CF6D3 Extract Zip Spec      14 (20) '2.0'\n+CF6D4 Extract OS            00 (0) 'MS-DOS'\n+CF6D5 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-CF0CA Compression Method    0008 (8) 'Deflated'\n-CF0CC Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CF0D0 CRC                   7E793C9C (2121874588)\n-CF0D4 Compressed Size       00000459 (1113)\n-CF0D8 Uncompressed Size     000008CC (2252)\n-CF0DC Filename Length       009E (158)\n-CF0DE Extra Length          0000 (0)\n-CF0E0 Comment Length        0000 (0)\n-CF0E2 Disk Start            0000 (0)\n-CF0E4 Int File Attributes   0000 (0)\n+CF6D7 Compression Method    0008 (8) 'Deflated'\n+CF6D9 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CF6DD CRC                   7E793C9C (2121874588)\n+CF6E1 Compressed Size       00000459 (1113)\n+CF6E5 Uncompressed Size     000008CC (2252)\n+CF6E9 Filename Length       009E (158)\n+CF6EB Extra Length          0000 (0)\n+CF6ED Comment Length        0000 (0)\n+CF6EF Disk Start            0000 (0)\n+CF6F1 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CF0E6 Ext File Attributes   81A40000 (2175008768)\n+CF6F3 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-CF0EA Local Header Offset   0001F617 (128535)\n-CF0EE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+CF6F7 Local Header Offset   0001F5E6 (128486)\n+CF6FB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCF0EE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCF6FB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-CF18C CENTRAL HEADER #304   02014B50 (33639248)\n-CF190 Created Zip Spec      14 (20) '2.0'\n-CF191 Created OS            03 (3) 'Unix'\n-CF192 Extract Zip Spec      14 (20) '2.0'\n-CF193 Extract OS            00 (0) 'MS-DOS'\n-CF194 General Purpose Flag  0800 (2048)\n+CF799 CENTRAL HEADER #304   02014B50 (33639248)\n+CF79D Created Zip Spec      14 (20) '2.0'\n+CF79E Created OS            03 (3) 'Unix'\n+CF79F Extract Zip Spec      14 (20) '2.0'\n+CF7A0 Extract OS            00 (0) 'MS-DOS'\n+CF7A1 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-CF196 Compression Method    0008 (8) 'Deflated'\n-CF198 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CF19C CRC                   4C048087 (1275363463)\n-CF1A0 Compressed Size       00000445 (1093)\n-CF1A4 Uncompressed Size     00000861 (2145)\n-CF1A8 Filename Length       0073 (115)\n-CF1AA Extra Length          0000 (0)\n-CF1AC Comment Length        0000 (0)\n-CF1AE Disk Start            0000 (0)\n-CF1B0 Int File Attributes   0000 (0)\n+CF7A3 Compression Method    0008 (8) 'Deflated'\n+CF7A5 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CF7A9 CRC                   4C048087 (1275363463)\n+CF7AD Compressed Size       00000445 (1093)\n+CF7B1 Uncompressed Size     00000861 (2145)\n+CF7B5 Filename Length       0073 (115)\n+CF7B7 Extra Length          0000 (0)\n+CF7B9 Comment Length        0000 (0)\n+CF7BB Disk Start            0000 (0)\n+CF7BD Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CF1B2 Ext File Attributes   81A40000 (2175008768)\n+CF7BF 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-CF1B6 Local Header Offset   0001FB2C (129836)\n-CF1BA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CF7C3 Local Header Offset   0001FAFB (129787)\n+CF7C7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCF1BA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCF7C7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-CF22D CENTRAL HEADER #305   02014B50 (33639248)\n-CF231 Created Zip Spec      14 (20) '2.0'\n-CF232 Created OS            03 (3) 'Unix'\n-CF233 Extract Zip Spec      14 (20) '2.0'\n-CF234 Extract OS            00 (0) 'MS-DOS'\n-CF235 General Purpose Flag  0800 (2048)\n+CF83A CENTRAL HEADER #305   02014B50 (33639248)\n+CF83E Created Zip Spec      14 (20) '2.0'\n+CF83F Created OS            03 (3) 'Unix'\n+CF840 Extract Zip Spec      14 (20) '2.0'\n+CF841 Extract OS            00 (0) 'MS-DOS'\n+CF842 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-CF237 Compression Method    0008 (8) 'Deflated'\n-CF239 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CF23D CRC                   877B2EE8 (2272997096)\n-CF241 Compressed Size       00000AAF (2735)\n-CF245 Uncompressed Size     0000215E (8542)\n-CF249 Filename Length       0080 (128)\n-CF24B Extra Length          0000 (0)\n-CF24D Comment Length        0000 (0)\n-CF24F Disk Start            0000 (0)\n-CF251 Int File Attributes   0000 (0)\n+CF844 Compression Method    0008 (8) 'Deflated'\n+CF846 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CF84A CRC                   877B2EE8 (2272997096)\n+CF84E Compressed Size       00000AAF (2735)\n+CF852 Uncompressed Size     0000215E (8542)\n+CF856 Filename Length       0080 (128)\n+CF858 Extra Length          0000 (0)\n+CF85A Comment Length        0000 (0)\n+CF85C Disk Start            0000 (0)\n+CF85E Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CF253 Ext File Attributes   81A40000 (2175008768)\n+CF860 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-CF257 Local Header Offset   00020002 (131074)\n-CF25B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CF864 Local Header Offset   0001FFD1 (131025)\n+CF868 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCF25B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCF868: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-CF2DB CENTRAL HEADER #306   02014B50 (33639248)\n-CF2DF Created Zip Spec      14 (20) '2.0'\n-CF2E0 Created OS            03 (3) 'Unix'\n-CF2E1 Extract Zip Spec      14 (20) '2.0'\n-CF2E2 Extract OS            00 (0) 'MS-DOS'\n-CF2E3 General Purpose Flag  0800 (2048)\n+CF8E8 CENTRAL HEADER #306   02014B50 (33639248)\n+CF8EC Created Zip Spec      14 (20) '2.0'\n+CF8ED Created OS            03 (3) 'Unix'\n+CF8EE Extract Zip Spec      14 (20) '2.0'\n+CF8EF Extract OS            00 (0) 'MS-DOS'\n+CF8F0 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-CF2E5 Compression Method    0008 (8) 'Deflated'\n-CF2E7 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CF2EB CRC                   E43D22D5 (3829211861)\n-CF2EF Compressed Size       00000806 (2054)\n-CF2F3 Uncompressed Size     0000147F (5247)\n-CF2F7 Filename Length       0084 (132)\n-CF2F9 Extra Length          0000 (0)\n-CF2FB Comment Length        0000 (0)\n-CF2FD Disk Start            0000 (0)\n-CF2FF Int File Attributes   0000 (0)\n+CF8F2 Compression Method    0008 (8) 'Deflated'\n+CF8F4 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CF8F8 CRC                   E43D22D5 (3829211861)\n+CF8FC Compressed Size       00000806 (2054)\n+CF900 Uncompressed Size     0000147F (5247)\n+CF904 Filename Length       0084 (132)\n+CF906 Extra Length          0000 (0)\n+CF908 Comment Length        0000 (0)\n+CF90A Disk Start            0000 (0)\n+CF90C Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CF301 Ext File Attributes   81A40000 (2175008768)\n+CF90E 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-CF305 Local Header Offset   00020B4F (133967)\n-CF309 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+CF912 Local Header Offset   00020B1E (133918)\n+CF916 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             '\n #\n-# WARNING: Offset 0xCF309: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCF916: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-CF38D CENTRAL HEADER #307   02014B50 (33639248)\n-CF391 Created Zip Spec      14 (20) '2.0'\n-CF392 Created OS            03 (3) 'Unix'\n-CF393 Extract Zip Spec      14 (20) '2.0'\n-CF394 Extract OS            00 (0) 'MS-DOS'\n-CF395 General Purpose Flag  0800 (2048)\n+CF99A CENTRAL HEADER #307   02014B50 (33639248)\n+CF99E Created Zip Spec      14 (20) '2.0'\n+CF99F Created OS            03 (3) 'Unix'\n+CF9A0 Extract Zip Spec      14 (20) '2.0'\n+CF9A1 Extract OS            00 (0) 'MS-DOS'\n+CF9A2 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-CF397 Compression Method    0008 (8) 'Deflated'\n-CF399 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CF39D CRC                   D765846F (3613754479)\n-CF3A1 Compressed Size       0000069E (1694)\n-CF3A5 Uncompressed Size     00001060 (4192)\n-CF3A9 Filename Length       0076 (118)\n-CF3AB Extra Length          0000 (0)\n-CF3AD Comment Length        0000 (0)\n-CF3AF Disk Start            0000 (0)\n-CF3B1 Int File Attributes   0000 (0)\n+CF9A4 Compression Method    0008 (8) 'Deflated'\n+CF9A6 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CF9AA CRC                   D765846F (3613754479)\n+CF9AE Compressed Size       0000069E (1694)\n+CF9B2 Uncompressed Size     00001060 (4192)\n+CF9B6 Filename Length       0076 (118)\n+CF9B8 Extra Length          0000 (0)\n+CF9BA Comment Length        0000 (0)\n+CF9BC Disk Start            0000 (0)\n+CF9BE Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CF3B3 Ext File Attributes   81A40000 (2175008768)\n+CF9C0 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-CF3B7 Local Header Offset   000213F7 (136183)\n-CF3BB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CF9C4 Local Header Offset   000213C6 (136134)\n+CF9C8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCF3BB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCF9C8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-CF431 CENTRAL HEADER #308   02014B50 (33639248)\n-CF435 Created Zip Spec      14 (20) '2.0'\n-CF436 Created OS            03 (3) 'Unix'\n-CF437 Extract Zip Spec      14 (20) '2.0'\n-CF438 Extract OS            00 (0) 'MS-DOS'\n-CF439 General Purpose Flag  0800 (2048)\n+CFA3E CENTRAL HEADER #308   02014B50 (33639248)\n+CFA42 Created Zip Spec      14 (20) '2.0'\n+CFA43 Created OS            03 (3) 'Unix'\n+CFA44 Extract Zip Spec      14 (20) '2.0'\n+CFA45 Extract OS            00 (0) 'MS-DOS'\n+CFA46 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-CF43B Compression Method    0008 (8) 'Deflated'\n-CF43D Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CF441 CRC                   57E394F3 (1474532595)\n-CF445 Compressed Size       000006F4 (1780)\n-CF449 Uncompressed Size     0000115C (4444)\n-CF44D Filename Length       0076 (118)\n-CF44F Extra Length          0000 (0)\n-CF451 Comment Length        0000 (0)\n-CF453 Disk Start            0000 (0)\n-CF455 Int File Attributes   0000 (0)\n+CFA48 Compression Method    0008 (8) 'Deflated'\n+CFA4A Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CFA4E CRC                   57E394F3 (1474532595)\n+CFA52 Compressed Size       000006F4 (1780)\n+CFA56 Uncompressed Size     0000115C (4444)\n+CFA5A Filename Length       0076 (118)\n+CFA5C Extra Length          0000 (0)\n+CFA5E Comment Length        0000 (0)\n+CFA60 Disk Start            0000 (0)\n+CFA62 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CF457 Ext File Attributes   81A40000 (2175008768)\n+CFA64 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-CF45B Local Header Offset   00021B29 (138025)\n-CF45F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CFA68 Local Header Offset   00021AF8 (137976)\n+CFA6C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCF45F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCFA6C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-CF4D5 CENTRAL HEADER #309   02014B50 (33639248)\n-CF4D9 Created Zip Spec      14 (20) '2.0'\n-CF4DA Created OS            03 (3) 'Unix'\n-CF4DB Extract Zip Spec      14 (20) '2.0'\n-CF4DC Extract OS            00 (0) 'MS-DOS'\n-CF4DD General Purpose Flag  0800 (2048)\n+CFAE2 CENTRAL HEADER #309   02014B50 (33639248)\n+CFAE6 Created Zip Spec      14 (20) '2.0'\n+CFAE7 Created OS            03 (3) 'Unix'\n+CFAE8 Extract Zip Spec      14 (20) '2.0'\n+CFAE9 Extract OS            00 (0) 'MS-DOS'\n+CFAEA General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-CF4DF Compression Method    0008 (8) 'Deflated'\n-CF4E1 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CF4E5 CRC                   990AFEE4 (2567634660)\n-CF4E9 Compressed Size       0000042B (1067)\n-CF4ED Uncompressed Size     00000807 (2055)\n-CF4F1 Filename Length       0074 (116)\n-CF4F3 Extra Length          0000 (0)\n-CF4F5 Comment Length        0000 (0)\n-CF4F7 Disk Start            0000 (0)\n-CF4F9 Int File Attributes   0000 (0)\n+CFAEC Compression Method    0008 (8) 'Deflated'\n+CFAEE Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CFAF2 CRC                   990AFEE4 (2567634660)\n+CFAF6 Compressed Size       0000042B (1067)\n+CFAFA Uncompressed Size     00000807 (2055)\n+CFAFE Filename Length       0074 (116)\n+CFB00 Extra Length          0000 (0)\n+CFB02 Comment Length        0000 (0)\n+CFB04 Disk Start            0000 (0)\n+CFB06 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CF4FB Ext File Attributes   81A40000 (2175008768)\n+CFB08 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-CF4FF Local Header Offset   000222B1 (139953)\n-CF503 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CFB0C Local Header Offset   00022280 (139904)\n+CFB10 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCF503: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCFB10: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-CF577 CENTRAL HEADER #310   02014B50 (33639248)\n-CF57B Created Zip Spec      14 (20) '2.0'\n-CF57C Created OS            03 (3) 'Unix'\n-CF57D Extract Zip Spec      14 (20) '2.0'\n-CF57E Extract OS            00 (0) 'MS-DOS'\n-CF57F General Purpose Flag  0800 (2048)\n+CFB84 CENTRAL HEADER #310   02014B50 (33639248)\n+CFB88 Created Zip Spec      14 (20) '2.0'\n+CFB89 Created OS            03 (3) 'Unix'\n+CFB8A Extract Zip Spec      14 (20) '2.0'\n+CFB8B Extract OS            00 (0) 'MS-DOS'\n+CFB8C General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-CF581 Compression Method    0008 (8) 'Deflated'\n-CF583 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CF587 CRC                   F6367964 (4130765156)\n-CF58B Compressed Size       0000164C (5708)\n-CF58F Uncompressed Size     00005103 (20739)\n-CF593 Filename Length       0086 (134)\n-CF595 Extra Length          0000 (0)\n-CF597 Comment Length        0000 (0)\n-CF599 Disk Start            0000 (0)\n-CF59B Int File Attributes   0000 (0)\n+CFB8E Compression Method    0008 (8) 'Deflated'\n+CFB90 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CFB94 CRC                   F6367964 (4130765156)\n+CFB98 Compressed Size       0000164C (5708)\n+CFB9C Uncompressed Size     00005103 (20739)\n+CFBA0 Filename Length       0086 (134)\n+CFBA2 Extra Length          0000 (0)\n+CFBA4 Comment Length        0000 (0)\n+CFBA6 Disk Start            0000 (0)\n+CFBA8 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CF59D Ext File Attributes   81A40000 (2175008768)\n+CFBAA 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-CF5A1 Local Header Offset   0002276E (141166)\n-CF5A5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+CFBAE Local Header Offset   0002273D (141117)\n+CFBB2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XX'\n #\n-# WARNING: Offset 0xCF5A5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCFBB2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-CF62B CENTRAL HEADER #311   02014B50 (33639248)\n-CF62F Created Zip Spec      14 (20) '2.0'\n-CF630 Created OS            03 (3) 'Unix'\n-CF631 Extract Zip Spec      14 (20) '2.0'\n-CF632 Extract OS            00 (0) 'MS-DOS'\n-CF633 General Purpose Flag  0800 (2048)\n+CFC38 CENTRAL HEADER #311   02014B50 (33639248)\n+CFC3C Created Zip Spec      14 (20) '2.0'\n+CFC3D Created OS            03 (3) 'Unix'\n+CFC3E Extract Zip Spec      14 (20) '2.0'\n+CFC3F Extract OS            00 (0) 'MS-DOS'\n+CFC40 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-CF635 Compression Method    0008 (8) 'Deflated'\n-CF637 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CF63B CRC                   9EC902FD (2663973629)\n-CF63F Compressed Size       000010B5 (4277)\n-CF643 Uncompressed Size     00003DB9 (15801)\n-CF647 Filename Length       0080 (128)\n-CF649 Extra Length          0000 (0)\n-CF64B Comment Length        0000 (0)\n-CF64D Disk Start            0000 (0)\n-CF64F Int File Attributes   0000 (0)\n+CFC42 Compression Method    0008 (8) 'Deflated'\n+CFC44 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CFC48 CRC                   9EC902FD (2663973629)\n+CFC4C Compressed Size       000010B5 (4277)\n+CFC50 Uncompressed Size     00003DB9 (15801)\n+CFC54 Filename Length       0080 (128)\n+CFC56 Extra Length          0000 (0)\n+CFC58 Comment Length        0000 (0)\n+CFC5A Disk Start            0000 (0)\n+CFC5C Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CF651 Ext File Attributes   81A40000 (2175008768)\n+CFC5E 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-CF655 Local Header Offset   00023E5E (147038)\n-CF659 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CFC62 Local Header Offset   00023E2D (146989)\n+CFC66 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCF659: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCFC66: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-CF6D9 CENTRAL HEADER #312   02014B50 (33639248)\n-CF6DD Created Zip Spec      14 (20) '2.0'\n-CF6DE Created OS            03 (3) 'Unix'\n-CF6DF Extract Zip Spec      14 (20) '2.0'\n-CF6E0 Extract OS            00 (0) 'MS-DOS'\n-CF6E1 General Purpose Flag  0800 (2048)\n+CFCE6 CENTRAL HEADER #312   02014B50 (33639248)\n+CFCEA Created Zip Spec      14 (20) '2.0'\n+CFCEB Created OS            03 (3) 'Unix'\n+CFCEC Extract Zip Spec      14 (20) '2.0'\n+CFCED Extract OS            00 (0) 'MS-DOS'\n+CFCEE General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-CF6E3 Compression Method    0008 (8) 'Deflated'\n-CF6E5 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CF6E9 CRC                   AD150348 (2903835464)\n-CF6ED Compressed Size       0000189A (6298)\n-CF6F1 Uncompressed Size     00009C3D (39997)\n-CF6F5 Filename Length       0086 (134)\n-CF6F7 Extra Length          0000 (0)\n-CF6F9 Comment Length        0000 (0)\n-CF6FB Disk Start            0000 (0)\n-CF6FD Int File Attributes   0000 (0)\n+CFCF0 Compression Method    0008 (8) 'Deflated'\n+CFCF2 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CFCF6 CRC                   AD150348 (2903835464)\n+CFCFA Compressed Size       0000189A (6298)\n+CFCFE Uncompressed Size     00009C3D (39997)\n+CFD02 Filename Length       0086 (134)\n+CFD04 Extra Length          0000 (0)\n+CFD06 Comment Length        0000 (0)\n+CFD08 Disk Start            0000 (0)\n+CFD0A Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CF6FF Ext File Attributes   81A40000 (2175008768)\n+CFD0C 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-CF703 Local Header Offset   00024FB1 (151473)\n-CF707 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+CFD10 Local Header Offset   00024F80 (151424)\n+CFD14 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XX'\n #\n-# WARNING: Offset 0xCF707: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCFD14: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-CF78D CENTRAL HEADER #313   02014B50 (33639248)\n-CF791 Created Zip Spec      14 (20) '2.0'\n-CF792 Created OS            03 (3) 'Unix'\n-CF793 Extract Zip Spec      14 (20) '2.0'\n-CF794 Extract OS            00 (0) 'MS-DOS'\n-CF795 General Purpose Flag  0800 (2048)\n+CFD9A CENTRAL HEADER #313   02014B50 (33639248)\n+CFD9E Created Zip Spec      14 (20) '2.0'\n+CFD9F Created OS            03 (3) 'Unix'\n+CFDA0 Extract Zip Spec      14 (20) '2.0'\n+CFDA1 Extract OS            00 (0) 'MS-DOS'\n+CFDA2 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-CF797 Compression Method    0008 (8) 'Deflated'\n-CF799 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CF79D CRC                   8BF94713 (2348369683)\n-CF7A1 Compressed Size       00000C16 (3094)\n-CF7A5 Uncompressed Size     00002C4C (11340)\n-CF7A9 Filename Length       0080 (128)\n-CF7AB Extra Length          0000 (0)\n-CF7AD Comment Length        0000 (0)\n-CF7AF Disk Start            0000 (0)\n-CF7B1 Int File Attributes   0000 (0)\n+CFDA4 Compression Method    0008 (8) 'Deflated'\n+CFDA6 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CFDAA CRC                   8BF94713 (2348369683)\n+CFDAE Compressed Size       00000C16 (3094)\n+CFDB2 Uncompressed Size     00002C4C (11340)\n+CFDB6 Filename Length       0080 (128)\n+CFDB8 Extra Length          0000 (0)\n+CFDBA Comment Length        0000 (0)\n+CFDBC Disk Start            0000 (0)\n+CFDBE Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CF7B3 Ext File Attributes   81A40000 (2175008768)\n+CFDC0 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-CF7B7 Local Header Offset   000268EF (157935)\n-CF7BB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CFDC4 Local Header Offset   000268BE (157886)\n+CFDC8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCF7BB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCFDC8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-CF83B CENTRAL HEADER #314   02014B50 (33639248)\n-CF83F Created Zip Spec      14 (20) '2.0'\n-CF840 Created OS            03 (3) 'Unix'\n-CF841 Extract Zip Spec      14 (20) '2.0'\n-CF842 Extract OS            00 (0) 'MS-DOS'\n-CF843 General Purpose Flag  0800 (2048)\n+CFE48 CENTRAL HEADER #314   02014B50 (33639248)\n+CFE4C Created Zip Spec      14 (20) '2.0'\n+CFE4D Created OS            03 (3) 'Unix'\n+CFE4E Extract Zip Spec      14 (20) '2.0'\n+CFE4F Extract OS            00 (0) 'MS-DOS'\n+CFE50 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-CF845 Compression Method    0008 (8) 'Deflated'\n-CF847 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CF84B CRC                   42E654D4 (1122391252)\n-CF84F Compressed Size       00000650 (1616)\n-CF853 Uncompressed Size     00000EFA (3834)\n-CF857 Filename Length       0076 (118)\n-CF859 Extra Length          0000 (0)\n-CF85B Comment Length        0000 (0)\n-CF85D Disk Start            0000 (0)\n-CF85F Int File Attributes   0000 (0)\n+CFE52 Compression Method    0008 (8) 'Deflated'\n+CFE54 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CFE58 CRC                   42E654D4 (1122391252)\n+CFE5C Compressed Size       00000650 (1616)\n+CFE60 Uncompressed Size     00000EFA (3834)\n+CFE64 Filename Length       0076 (118)\n+CFE66 Extra Length          0000 (0)\n+CFE68 Comment Length        0000 (0)\n+CFE6A Disk Start            0000 (0)\n+CFE6C Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CF861 Ext File Attributes   81A40000 (2175008768)\n+CFE6E 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-CF865 Local Header Offset   000275A3 (161187)\n-CF869 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CFE72 Local Header Offset   00027572 (161138)\n+CFE76 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCF869: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCFE76: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-CF8DF CENTRAL HEADER #315   02014B50 (33639248)\n-CF8E3 Created Zip Spec      14 (20) '2.0'\n-CF8E4 Created OS            03 (3) 'Unix'\n-CF8E5 Extract Zip Spec      14 (20) '2.0'\n-CF8E6 Extract OS            00 (0) 'MS-DOS'\n-CF8E7 General Purpose Flag  0800 (2048)\n+CFEEC CENTRAL HEADER #315   02014B50 (33639248)\n+CFEF0 Created Zip Spec      14 (20) '2.0'\n+CFEF1 Created OS            03 (3) 'Unix'\n+CFEF2 Extract Zip Spec      14 (20) '2.0'\n+CFEF3 Extract OS            00 (0) 'MS-DOS'\n+CFEF4 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-CF8E9 Compression Method    0008 (8) 'Deflated'\n-CF8EB Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CF8EF CRC                   51B4F745 (1370814277)\n-CF8F3 Compressed Size       0000075A (1882)\n-CF8F7 Uncompressed Size     000016D7 (5847)\n-CF8FB Filename Length       007C (124)\n-CF8FD Extra Length          0000 (0)\n-CF8FF Comment Length        0000 (0)\n-CF901 Disk Start            0000 (0)\n-CF903 Int File Attributes   0000 (0)\n+CFEF6 Compression Method    0008 (8) 'Deflated'\n+CFEF8 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CFEFC CRC                   51B4F745 (1370814277)\n+CFF00 Compressed Size       0000075A (1882)\n+CFF04 Uncompressed Size     000016D7 (5847)\n+CFF08 Filename Length       007C (124)\n+CFF0A Extra Length          0000 (0)\n+CFF0C Comment Length        0000 (0)\n+CFF0E Disk Start            0000 (0)\n+CFF10 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CF905 Ext File Attributes   81A40000 (2175008768)\n+CFF12 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-CF909 Local Header Offset   00027C87 (162951)\n-CF90D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CFF16 Local Header Offset   00027C56 (162902)\n+CFF1A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCF90D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCFF1A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-CF989 CENTRAL HEADER #316   02014B50 (33639248)\n-CF98D Created Zip Spec      14 (20) '2.0'\n-CF98E Created OS            03 (3) 'Unix'\n-CF98F Extract Zip Spec      14 (20) '2.0'\n-CF990 Extract OS            00 (0) 'MS-DOS'\n-CF991 General Purpose Flag  0800 (2048)\n+CFF96 CENTRAL HEADER #316   02014B50 (33639248)\n+CFF9A Created Zip Spec      14 (20) '2.0'\n+CFF9B Created OS            03 (3) 'Unix'\n+CFF9C Extract Zip Spec      14 (20) '2.0'\n+CFF9D Extract OS            00 (0) 'MS-DOS'\n+CFF9E General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-CF993 Compression Method    0008 (8) 'Deflated'\n-CF995 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CF999 CRC                   357DA477 (897426551)\n-CF99D Compressed Size       0000039F (927)\n-CF9A1 Uncompressed Size     000006C6 (1734)\n-CF9A5 Filename Length       0074 (116)\n-CF9A7 Extra Length          0000 (0)\n-CF9A9 Comment Length        0000 (0)\n-CF9AB Disk Start            0000 (0)\n-CF9AD Int File Attributes   0000 (0)\n+CFFA0 Compression Method    0008 (8) 'Deflated'\n+CFFA2 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+CFFA6 CRC                   357DA477 (897426551)\n+CFFAA Compressed Size       0000039F (927)\n+CFFAE Uncompressed Size     000006C6 (1734)\n+CFFB2 Filename Length       0074 (116)\n+CFFB4 Extra Length          0000 (0)\n+CFFB6 Comment Length        0000 (0)\n+CFFB8 Disk Start            0000 (0)\n+CFFBA Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CF9AF Ext File Attributes   81A40000 (2175008768)\n+CFFBC 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-CF9B3 Local Header Offset   0002847B (164987)\n-CF9B7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+CFFC0 Local Header Offset   0002844A (164938)\n+CFFC4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCF9B7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCFFC4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-CFA2B CENTRAL HEADER #317   02014B50 (33639248)\n-CFA2F Created Zip Spec      14 (20) '2.0'\n-CFA30 Created OS            03 (3) 'Unix'\n-CFA31 Extract Zip Spec      14 (20) '2.0'\n-CFA32 Extract OS            00 (0) 'MS-DOS'\n-CFA33 General Purpose Flag  0800 (2048)\n+D0038 CENTRAL HEADER #317   02014B50 (33639248)\n+D003C Created Zip Spec      14 (20) '2.0'\n+D003D Created OS            03 (3) 'Unix'\n+D003E Extract Zip Spec      14 (20) '2.0'\n+D003F Extract OS            00 (0) 'MS-DOS'\n+D0040 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-CFA35 Compression Method    0008 (8) 'Deflated'\n-CFA37 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CFA3B CRC                   F9CAC97B (4190816635)\n-CFA3F Compressed Size       000004CB (1227)\n-CFA43 Uncompressed Size     000009BC (2492)\n-CFA47 Filename Length       0071 (113)\n-CFA49 Extra Length          0000 (0)\n-CFA4B Comment Length        0000 (0)\n-CFA4D Disk Start            0000 (0)\n-CFA4F Int File Attributes   0000 (0)\n+D0042 Compression Method    0008 (8) 'Deflated'\n+D0044 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+D0048 CRC                   F9CAC97B (4190816635)\n+D004C Compressed Size       000004CB (1227)\n+D0050 Uncompressed Size     000009BC (2492)\n+D0054 Filename Length       0071 (113)\n+D0056 Extra Length          0000 (0)\n+D0058 Comment Length        0000 (0)\n+D005A Disk Start            0000 (0)\n+D005C Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CFA51 Ext File Attributes   81A40000 (2175008768)\n+D005E 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-CFA55 Local Header Offset   000288AC (166060)\n-CFA59 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+D0062 Local Header Offset   0002887B (166011)\n+D0066 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCFA59: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xD0066: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-CFACA CENTRAL HEADER #318   02014B50 (33639248)\n-CFACE Created Zip Spec      14 (20) '2.0'\n-CFACF Created OS            03 (3) 'Unix'\n-CFAD0 Extract Zip Spec      14 (20) '2.0'\n-CFAD1 Extract OS            00 (0) 'MS-DOS'\n-CFAD2 General Purpose Flag  0800 (2048)\n+D00D7 CENTRAL HEADER #318   02014B50 (33639248)\n+D00DB Created Zip Spec      14 (20) '2.0'\n+D00DC Created OS            03 (3) 'Unix'\n+D00DD Extract Zip Spec      14 (20) '2.0'\n+D00DE Extract OS            00 (0) 'MS-DOS'\n+D00DF General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-CFAD4 Compression Method    0008 (8) 'Deflated'\n-CFAD6 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CFADA CRC                   9DEB8C8B (2649459851)\n-CFADE Compressed Size       000004E7 (1255)\n-CFAE2 Uncompressed Size     00000A07 (2567)\n-CFAE6 Filename Length       0077 (119)\n-CFAE8 Extra Length          0000 (0)\n-CFAEA Comment Length        0000 (0)\n-CFAEC Disk Start            0000 (0)\n-CFAEE Int File Attributes   0000 (0)\n+D00E1 Compression Method    0008 (8) 'Deflated'\n+D00E3 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+D00E7 CRC                   9DEB8C8B (2649459851)\n+D00EB Compressed Size       000004E7 (1255)\n+D00EF Uncompressed Size     00000A07 (2567)\n+D00F3 Filename Length       0077 (119)\n+D00F5 Extra Length          0000 (0)\n+D00F7 Comment Length        0000 (0)\n+D00F9 Disk Start            0000 (0)\n+D00FB Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CFAF0 Ext File Attributes   81A40000 (2175008768)\n+D00FD 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-CFAF4 Local Header Offset   00028E06 (167430)\n-CFAF8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+D0101 Local Header Offset   00028DD5 (167381)\n+D0105 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCFAF8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xD0105: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-CFB6F CENTRAL HEADER #319   02014B50 (33639248)\n-CFB73 Created Zip Spec      14 (20) '2.0'\n-CFB74 Created OS            03 (3) 'Unix'\n-CFB75 Extract Zip Spec      14 (20) '2.0'\n-CFB76 Extract OS            00 (0) 'MS-DOS'\n-CFB77 General Purpose Flag  0800 (2048)\n+D017C CENTRAL HEADER #319   02014B50 (33639248)\n+D0180 Created Zip Spec      14 (20) '2.0'\n+D0181 Created OS            03 (3) 'Unix'\n+D0182 Extract Zip Spec      14 (20) '2.0'\n+D0183 Extract OS            00 (0) 'MS-DOS'\n+D0184 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-CFB79 Compression Method    0008 (8) 'Deflated'\n-CFB7B Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CFB7F CRC                   85B17459 (2242999385)\n-CFB83 Compressed Size       0000060E (1550)\n-CFB87 Uncompressed Size     00000DDE (3550)\n-CFB8B Filename Length       0071 (113)\n-CFB8D Extra Length          0000 (0)\n-CFB8F Comment Length        0000 (0)\n-CFB91 Disk Start            0000 (0)\n-CFB93 Int File Attributes   0000 (0)\n+D0186 Compression Method    0008 (8) 'Deflated'\n+D0188 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+D018C CRC                   85B17459 (2242999385)\n+D0190 Compressed Size       0000060E (1550)\n+D0194 Uncompressed Size     00000DDE (3550)\n+D0198 Filename Length       0071 (113)\n+D019A Extra Length          0000 (0)\n+D019C Comment Length        0000 (0)\n+D019E Disk Start            0000 (0)\n+D01A0 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CFB95 Ext File Attributes   81A40000 (2175008768)\n+D01A2 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-CFB99 Local Header Offset   00029382 (168834)\n-CFB9D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+D01A6 Local Header Offset   00029351 (168785)\n+D01AA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCFB9D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xD01AA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-CFC0E CENTRAL HEADER #320   02014B50 (33639248)\n-CFC12 Created Zip Spec      14 (20) '2.0'\n-CFC13 Created OS            03 (3) 'Unix'\n-CFC14 Extract Zip Spec      14 (20) '2.0'\n-CFC15 Extract OS            00 (0) 'MS-DOS'\n-CFC16 General Purpose Flag  0800 (2048)\n+D021B CENTRAL HEADER #320   02014B50 (33639248)\n+D021F Created Zip Spec      14 (20) '2.0'\n+D0220 Created OS            03 (3) 'Unix'\n+D0221 Extract Zip Spec      14 (20) '2.0'\n+D0222 Extract OS            00 (0) 'MS-DOS'\n+D0223 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-CFC18 Compression Method    0008 (8) 'Deflated'\n-CFC1A Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CFC1E CRC                   9C229073 (2619510899)\n-CFC22 Compressed Size       00000330 (816)\n-CFC26 Uncompressed Size     000005CF (1487)\n-CFC2A Filename Length       007C (124)\n-CFC2C Extra Length          0000 (0)\n-CFC2E Comment Length        0000 (0)\n-CFC30 Disk Start            0000 (0)\n-CFC32 Int File Attributes   0000 (0)\n+D0225 Compression Method    0008 (8) 'Deflated'\n+D0227 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+D022B CRC                   9C229073 (2619510899)\n+D022F Compressed Size       00000330 (816)\n+D0233 Uncompressed Size     000005CF (1487)\n+D0237 Filename Length       007C (124)\n+D0239 Extra Length          0000 (0)\n+D023B Comment Length        0000 (0)\n+D023D Disk Start            0000 (0)\n+D023F Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CFC34 Ext File Attributes   81A40000 (2175008768)\n+D0241 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-CFC38 Local Header Offset   00029A1F (170527)\n-CFC3C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+D0245 Local Header Offset   000299EE (170478)\n+D0249 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCFC3C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xD0249: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-CFCB8 CENTRAL HEADER #321   02014B50 (33639248)\n-CFCBC Created Zip Spec      14 (20) '2.0'\n-CFCBD Created OS            03 (3) 'Unix'\n-CFCBE Extract Zip Spec      14 (20) '2.0'\n-CFCBF Extract OS            00 (0) 'MS-DOS'\n-CFCC0 General Purpose Flag  0800 (2048)\n+D02C5 CENTRAL HEADER #321   02014B50 (33639248)\n+D02C9 Created Zip Spec      14 (20) '2.0'\n+D02CA Created OS            03 (3) 'Unix'\n+D02CB Extract Zip Spec      14 (20) '2.0'\n+D02CC Extract OS            00 (0) 'MS-DOS'\n+D02CD General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-CFCC2 Compression Method    0008 (8) 'Deflated'\n-CFCC4 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CFCC8 CRC                   A57691CD (2776011213)\n-CFCCC Compressed Size       00000316 (790)\n-CFCD0 Uncompressed Size     000005C2 (1474)\n-CFCD4 Filename Length       007C (124)\n-CFCD6 Extra Length          0000 (0)\n-CFCD8 Comment Length        0000 (0)\n-CFCDA Disk Start            0000 (0)\n-CFCDC Int File Attributes   0000 (0)\n+D02CF Compression Method    0008 (8) 'Deflated'\n+D02D1 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+D02D5 CRC                   A57691CD (2776011213)\n+D02D9 Compressed Size       00000316 (790)\n+D02DD Uncompressed Size     000005C2 (1474)\n+D02E1 Filename Length       007C (124)\n+D02E3 Extra Length          0000 (0)\n+D02E5 Comment Length        0000 (0)\n+D02E7 Disk Start            0000 (0)\n+D02E9 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CFCDE Ext File Attributes   81A40000 (2175008768)\n+D02EB 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-CFCE2 Local Header Offset   00029DE9 (171497)\n-CFCE6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+D02EF Local Header Offset   00029DB8 (171448)\n+D02F3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCFCE6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xD02F3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-CFD62 CENTRAL HEADER #322   02014B50 (33639248)\n-CFD66 Created Zip Spec      14 (20) '2.0'\n-CFD67 Created OS            03 (3) 'Unix'\n-CFD68 Extract Zip Spec      14 (20) '2.0'\n-CFD69 Extract OS            00 (0) 'MS-DOS'\n-CFD6A General Purpose Flag  0800 (2048)\n+D036F CENTRAL HEADER #322   02014B50 (33639248)\n+D0373 Created Zip Spec      14 (20) '2.0'\n+D0374 Created OS            03 (3) 'Unix'\n+D0375 Extract Zip Spec      14 (20) '2.0'\n+D0376 Extract OS            00 (0) 'MS-DOS'\n+D0377 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-CFD6C Compression Method    0008 (8) 'Deflated'\n-CFD6E Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CFD72 CRC                   6CD31445 (1825772613)\n-CFD76 Compressed Size       000003CA (970)\n-CFD7A Uncompressed Size     0000073A (1850)\n-CFD7E Filename Length       007B (123)\n-CFD80 Extra Length          0000 (0)\n-CFD82 Comment Length        0000 (0)\n-CFD84 Disk Start            0000 (0)\n-CFD86 Int File Attributes   0000 (0)\n+D0379 Compression Method    0008 (8) 'Deflated'\n+D037B Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+D037F CRC                   6CD31445 (1825772613)\n+D0383 Compressed Size       000003CA (970)\n+D0387 Uncompressed Size     0000073A (1850)\n+D038B Filename Length       007B (123)\n+D038D Extra Length          0000 (0)\n+D038F Comment Length        0000 (0)\n+D0391 Disk Start            0000 (0)\n+D0393 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CFD88 Ext File Attributes   81A40000 (2175008768)\n+D0395 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-CFD8C Local Header Offset   0002A199 (172441)\n-CFD90 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+D0399 Local Header Offset   0002A168 (172392)\n+D039D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCFD90: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xD039D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-CFE0B CENTRAL HEADER #323   02014B50 (33639248)\n-CFE0F Created Zip Spec      14 (20) '2.0'\n-CFE10 Created OS            03 (3) 'Unix'\n-CFE11 Extract Zip Spec      14 (20) '2.0'\n-CFE12 Extract OS            00 (0) 'MS-DOS'\n-CFE13 General Purpose Flag  0800 (2048)\n+D0418 CENTRAL HEADER #323   02014B50 (33639248)\n+D041C Created Zip Spec      14 (20) '2.0'\n+D041D Created OS            03 (3) 'Unix'\n+D041E Extract Zip Spec      14 (20) '2.0'\n+D041F Extract OS            00 (0) 'MS-DOS'\n+D0420 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-CFE15 Compression Method    0008 (8) 'Deflated'\n-CFE17 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CFE1B CRC                   C97DF8D6 (3380476118)\n-CFE1F Compressed Size       00000522 (1314)\n-CFE23 Uncompressed Size     00000A92 (2706)\n-CFE27 Filename Length       0079 (121)\n-CFE29 Extra Length          0000 (0)\n-CFE2B Comment Length        0000 (0)\n-CFE2D Disk Start            0000 (0)\n-CFE2F Int File Attributes   0000 (0)\n+D0422 Compression Method    0008 (8) 'Deflated'\n+D0424 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+D0428 CRC                   C97DF8D6 (3380476118)\n+D042C Compressed Size       00000522 (1314)\n+D0430 Uncompressed Size     00000A92 (2706)\n+D0434 Filename Length       0079 (121)\n+D0436 Extra Length          0000 (0)\n+D0438 Comment Length        0000 (0)\n+D043A Disk Start            0000 (0)\n+D043C Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CFE31 Ext File Attributes   81A40000 (2175008768)\n+D043E 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-CFE35 Local Header Offset   0002A5FC (173564)\n-CFE39 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+D0442 Local Header Offset   0002A5CB (173515)\n+D0446 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCFE39: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xD0446: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-CFEB2 CENTRAL HEADER #324   02014B50 (33639248)\n-CFEB6 Created Zip Spec      14 (20) '2.0'\n-CFEB7 Created OS            03 (3) 'Unix'\n-CFEB8 Extract Zip Spec      14 (20) '2.0'\n-CFEB9 Extract OS            00 (0) 'MS-DOS'\n-CFEBA General Purpose Flag  0800 (2048)\n+D04BF CENTRAL HEADER #324   02014B50 (33639248)\n+D04C3 Created Zip Spec      14 (20) '2.0'\n+D04C4 Created OS            03 (3) 'Unix'\n+D04C5 Extract Zip Spec      14 (20) '2.0'\n+D04C6 Extract OS            00 (0) 'MS-DOS'\n+D04C7 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-CFEBC Compression Method    0008 (8) 'Deflated'\n-CFEBE Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CFEC2 CRC                   0B04A112 (184852754)\n-CFEC6 Compressed Size       000003C7 (967)\n-CFECA Uncompressed Size     00000795 (1941)\n-CFECE Filename Length       006E (110)\n-CFED0 Extra Length          0000 (0)\n-CFED2 Comment Length        0000 (0)\n-CFED4 Disk Start            0000 (0)\n-CFED6 Int File Attributes   0000 (0)\n+D04C9 Compression Method    0008 (8) 'Deflated'\n+D04CB Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+D04CF CRC                   0B04A112 (184852754)\n+D04D3 Compressed Size       000003C7 (967)\n+D04D7 Uncompressed Size     00000795 (1941)\n+D04DB Filename Length       006E (110)\n+D04DD Extra Length          0000 (0)\n+D04DF Comment Length        0000 (0)\n+D04E1 Disk Start            0000 (0)\n+D04E3 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CFED8 Ext File Attributes   81A40000 (2175008768)\n+D04E5 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-CFEDC Local Header Offset   0002ABB5 (175029)\n-CFEE0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+D04E9 Local Header Offset   0002AB84 (174980)\n+D04ED Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCFEE0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xD04ED: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-CFF4E CENTRAL HEADER #325   02014B50 (33639248)\n-CFF52 Created Zip Spec      14 (20) '2.0'\n-CFF53 Created OS            03 (3) 'Unix'\n-CFF54 Extract Zip Spec      14 (20) '2.0'\n-CFF55 Extract OS            00 (0) 'MS-DOS'\n-CFF56 General Purpose Flag  0800 (2048)\n+D055B CENTRAL HEADER #325   02014B50 (33639248)\n+D055F Created Zip Spec      14 (20) '2.0'\n+D0560 Created OS            03 (3) 'Unix'\n+D0561 Extract Zip Spec      14 (20) '2.0'\n+D0562 Extract OS            00 (0) 'MS-DOS'\n+D0563 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-CFF58 Compression Method    0008 (8) 'Deflated'\n-CFF5A Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-CFF5E CRC                   9A51A289 (2589041289)\n-CFF62 Compressed Size       00000425 (1061)\n-CFF66 Uncompressed Size     000008AB (2219)\n-CFF6A Filename Length       0082 (130)\n-CFF6C Extra Length          0000 (0)\n-CFF6E Comment Length        0000 (0)\n-CFF70 Disk Start            0000 (0)\n-CFF72 Int File Attributes   0000 (0)\n+D0565 Compression Method    0008 (8) 'Deflated'\n+D0567 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+D056B CRC                   9A51A289 (2589041289)\n+D056F Compressed Size       00000425 (1061)\n+D0573 Uncompressed Size     000008AB (2219)\n+D0577 Filename Length       0082 (130)\n+D0579 Extra Length          0000 (0)\n+D057B Comment Length        0000 (0)\n+D057D Disk Start            0000 (0)\n+D057F Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-CFF74 Ext File Attributes   81A40000 (2175008768)\n+D0581 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-CFF78 Local Header Offset   0002B008 (176136)\n-CFF7C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+D0585 Local Header Offset   0002AFD7 (176087)\n+D0589 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCFF7C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xD0589: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-CFFFE CENTRAL HEADER #326   02014B50 (33639248)\n-D0002 Created Zip Spec      14 (20) '2.0'\n-D0003 Created OS            03 (3) 'Unix'\n-D0004 Extract Zip Spec      14 (20) '2.0'\n-D0005 Extract OS            00 (0) 'MS-DOS'\n-D0006 General Purpose Flag  0800 (2048)\n+D060B CENTRAL HEADER #326   02014B50 (33639248)\n+D060F Created Zip Spec      14 (20) '2.0'\n+D0610 Created OS            03 (3) 'Unix'\n+D0611 Extract Zip Spec      14 (20) '2.0'\n+D0612 Extract OS            00 (0) 'MS-DOS'\n+D0613 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-D0008 Compression Method    0008 (8) 'Deflated'\n-D000A Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-D000E CRC                   BEAE3D9C (3199090076)\n-D0012 Compressed Size       0000127D (4733)\n-D0016 Uncompressed Size     0000396F (14703)\n-D001A Filename Length       0063 (99)\n-D001C Extra Length          0000 (0)\n-D001E Comment Length        0000 (0)\n-D0020 Disk Start            0000 (0)\n-D0022 Int File Attributes   0000 (0)\n+D0615 Compression Method    0008 (8) 'Deflated'\n+D0617 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+D061B CRC                   BEAE3D9C (3199090076)\n+D061F Compressed Size       0000127D (4733)\n+D0623 Uncompressed Size     0000396F (14703)\n+D0627 Filename Length       0063 (99)\n+D0629 Extra Length          0000 (0)\n+D062B Comment Length        0000 (0)\n+D062D Disk Start            0000 (0)\n+D062F Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-D0024 Ext File Attributes   81A40000 (2175008768)\n+D0631 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-D0028 Local Header Offset   0002B4CD (177357)\n-D002C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+D0635 Local Header Offset   0002B49C (177308)\n+D0639 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xD002C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xD0639: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-D008F CENTRAL HEADER #327   02014B50 (33639248)\n-D0093 Created Zip Spec      14 (20) '2.0'\n-D0094 Created OS            03 (3) 'Unix'\n-D0095 Extract Zip Spec      14 (20) '2.0'\n-D0096 Extract OS            00 (0) 'MS-DOS'\n-D0097 General Purpose Flag  0800 (2048)\n+D069C CENTRAL HEADER #327   02014B50 (33639248)\n+D06A0 Created Zip Spec      14 (20) '2.0'\n+D06A1 Created OS            03 (3) 'Unix'\n+D06A2 Extract Zip Spec      14 (20) '2.0'\n+D06A3 Extract OS            00 (0) 'MS-DOS'\n+D06A4 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-D0099 Compression Method    0008 (8) 'Deflated'\n-D009B Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-D009F CRC                   29D620BA (701898938)\n-D00A3 Compressed Size       00000BC2 (3010)\n-D00A7 Uncompressed Size     00002421 (9249)\n-D00AB Filename Length       0080 (128)\n-D00AD Extra Length          0000 (0)\n-D00AF Comment Length        0000 (0)\n-D00B1 Disk Start            0000 (0)\n-D00B3 Int File Attributes   0000 (0)\n+D06A6 Compression Method    0008 (8) 'Deflated'\n+D06A8 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+D06AC CRC                   29D620BA (701898938)\n+D06B0 Compressed Size       00000BC2 (3010)\n+D06B4 Uncompressed Size     00002421 (9249)\n+D06B8 Filename Length       0080 (128)\n+D06BA Extra Length          0000 (0)\n+D06BC Comment Length        0000 (0)\n+D06BE Disk Start            0000 (0)\n+D06C0 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-D00B5 Ext File Attributes   81A40000 (2175008768)\n+D06C2 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-D00B9 Local Header Offset   0002C7CB (182219)\n-D00BD Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+D06C6 Local Header Offset   0002C79A (182170)\n+D06CA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xD00BD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xD06CA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-D013D CENTRAL HEADER #328   02014B50 (33639248)\n-D0141 Created Zip Spec      14 (20) '2.0'\n-D0142 Created OS            03 (3) 'Unix'\n-D0143 Extract Zip Spec      14 (20) '2.0'\n-D0144 Extract OS            00 (0) 'MS-DOS'\n-D0145 General Purpose Flag  0800 (2048)\n+D074A CENTRAL HEADER #328   02014B50 (33639248)\n+D074E Created Zip Spec      14 (20) '2.0'\n+D074F Created OS            03 (3) 'Unix'\n+D0750 Extract Zip Spec      14 (20) '2.0'\n+D0751 Extract OS            00 (0) 'MS-DOS'\n+D0752 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-D0147 Compression Method    0008 (8) 'Deflated'\n-D0149 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-D014D CRC                   9ED7BE90 (2664939152)\n-D0151 Compressed Size       00001217 (4631)\n-D0155 Uncompressed Size     000036E7 (14055)\n-D0159 Filename Length       0079 (121)\n-D015B Extra Length          0000 (0)\n-D015D Comment Length        0000 (0)\n-D015F Disk Start            0000 (0)\n-D0161 Int File Attributes   0000 (0)\n+D0754 Compression Method    0008 (8) 'Deflated'\n+D0756 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+D075A CRC                   9ED7BE90 (2664939152)\n+D075E Compressed Size       00001217 (4631)\n+D0762 Uncompressed Size     000036E7 (14055)\n+D0766 Filename Length       0079 (121)\n+D0768 Extra Length          0000 (0)\n+D076A Comment Length        0000 (0)\n+D076C Disk Start            0000 (0)\n+D076E Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-D0163 Ext File Attributes   81A40000 (2175008768)\n+D0770 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-D0167 Local Header Offset   0002D42B (185387)\n-D016B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+D0774 Local Header Offset   0002D3FA (185338)\n+D0778 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xD016B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xD0778: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-D01E4 CENTRAL HEADER #329   02014B50 (33639248)\n-D01E8 Created Zip Spec      14 (20) '2.0'\n-D01E9 Created OS            03 (3) 'Unix'\n-D01EA Extract Zip Spec      14 (20) '2.0'\n-D01EB Extract OS            00 (0) 'MS-DOS'\n-D01EC General Purpose Flag  0800 (2048)\n+D07F1 CENTRAL HEADER #329   02014B50 (33639248)\n+D07F5 Created Zip Spec      14 (20) '2.0'\n+D07F6 Created OS            03 (3) 'Unix'\n+D07F7 Extract Zip Spec      14 (20) '2.0'\n+D07F8 Extract OS            00 (0) 'MS-DOS'\n+D07F9 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-D01EE Compression Method    0008 (8) 'Deflated'\n-D01F0 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-D01F4 CRC                   B51FDD91 (3038764433)\n-D01F8 Compressed Size       0000156C (5484)\n-D01FC Uncompressed Size     00004792 (18322)\n-D0200 Filename Length       0079 (121)\n-D0202 Extra Length          0000 (0)\n-D0204 Comment Length        0000 (0)\n-D0206 Disk Start            0000 (0)\n-D0208 Int File Attributes   0000 (0)\n+D07FB Compression Method    0008 (8) 'Deflated'\n+D07FD Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+D0801 CRC                   B51FDD91 (3038764433)\n+D0805 Compressed Size       0000156C (5484)\n+D0809 Uncompressed Size     00004792 (18322)\n+D080D Filename Length       0079 (121)\n+D080F Extra Length          0000 (0)\n+D0811 Comment Length        0000 (0)\n+D0813 Disk Start            0000 (0)\n+D0815 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-D020A Ext File Attributes   81A40000 (2175008768)\n+D0817 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-D020E Local Header Offset   0002E6D9 (190169)\n-D0212 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+D081B Local Header Offset   0002E6A8 (190120)\n+D081F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xD0212: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xD081F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-D028B CENTRAL HEADER #330   02014B50 (33639248)\n-D028F Created Zip Spec      14 (20) '2.0'\n-D0290 Created OS            03 (3) 'Unix'\n-D0291 Extract Zip Spec      14 (20) '2.0'\n-D0292 Extract OS            00 (0) 'MS-DOS'\n-D0293 General Purpose Flag  0800 (2048)\n+D0898 CENTRAL HEADER #330   02014B50 (33639248)\n+D089C Created Zip Spec      14 (20) '2.0'\n+D089D Created OS            03 (3) 'Unix'\n+D089E Extract Zip Spec      14 (20) '2.0'\n+D089F Extract OS            00 (0) 'MS-DOS'\n+D08A0 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-D0295 Compression Method    0008 (8) 'Deflated'\n-D0297 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-D029B CRC                   27CFA48B (667919499)\n-D029F Compressed Size       000018CC (6348)\n-D02A3 Uncompressed Size     00005DDC (24028)\n-D02A7 Filename Length       007B (123)\n-D02A9 Extra Length          0000 (0)\n-D02AB Comment Length        0000 (0)\n-D02AD Disk Start            0000 (0)\n-D02AF Int File Attributes   0000 (0)\n+D08A2 Compression Method    0008 (8) 'Deflated'\n+D08A4 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+D08A8 CRC                   27CFA48B (667919499)\n+D08AC Compressed Size       000018CC (6348)\n+D08B0 Uncompressed Size     00005DDC (24028)\n+D08B4 Filename Length       007B (123)\n+D08B6 Extra Length          0000 (0)\n+D08B8 Comment Length        0000 (0)\n+D08BA Disk Start            0000 (0)\n+D08BC Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-D02B1 Ext File Attributes   81A40000 (2175008768)\n+D08BE 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-D02B5 Local Header Offset   0002FCDC (195804)\n-D02B9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+D08C2 Local Header Offset   0002FCAB (195755)\n+D08C6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xD02B9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xD08C6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-D0334 CENTRAL HEADER #331   02014B50 (33639248)\n-D0338 Created Zip Spec      14 (20) '2.0'\n-D0339 Created OS            03 (3) 'Unix'\n-D033A Extract Zip Spec      14 (20) '2.0'\n-D033B Extract OS            00 (0) 'MS-DOS'\n-D033C General Purpose Flag  0800 (2048)\n+D0941 CENTRAL HEADER #331   02014B50 (33639248)\n+D0945 Created Zip Spec      14 (20) '2.0'\n+D0946 Created OS            03 (3) 'Unix'\n+D0947 Extract Zip Spec      14 (20) '2.0'\n+D0948 Extract OS            00 (0) 'MS-DOS'\n+D0949 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-D033E Compression Method    0008 (8) 'Deflated'\n-D0340 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-D0344 CRC                   620AB78F (1644869519)\n-D0348 Compressed Size       000012CF (4815)\n-D034C Uncompressed Size     00003B3A (15162)\n-D0350 Filename Length       007F (127)\n-D0352 Extra Length          0000 (0)\n-D0354 Comment Length        0000 (0)\n-D0356 Disk Start            0000 (0)\n-D0358 Int File Attributes   0000 (0)\n+D094B Compression Method    0008 (8) 'Deflated'\n+D094D Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+D0951 CRC                   620AB78F (1644869519)\n+D0955 Compressed Size       000012CF (4815)\n+D0959 Uncompressed Size     00003B3A (15162)\n+D095D Filename Length       007F (127)\n+D095F Extra Length          0000 (0)\n+D0961 Comment Length        0000 (0)\n+D0963 Disk Start            0000 (0)\n+D0965 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-D035A Ext File Attributes   81A40000 (2175008768)\n+D0967 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-D035E Local Header Offset   00031641 (202305)\n-D0362 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+D096B Local Header Offset   00031610 (202256)\n+D096F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xD0362: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xD096F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-D03E1 CENTRAL HEADER #332   02014B50 (33639248)\n-D03E5 Created Zip Spec      14 (20) '2.0'\n-D03E6 Created OS            03 (3) 'Unix'\n-D03E7 Extract Zip Spec      14 (20) '2.0'\n-D03E8 Extract OS            00 (0) 'MS-DOS'\n-D03E9 General Purpose Flag  0800 (2048)\n+D09EE CENTRAL HEADER #332   02014B50 (33639248)\n+D09F2 Created Zip Spec      14 (20) '2.0'\n+D09F3 Created OS            03 (3) 'Unix'\n+D09F4 Extract Zip Spec      14 (20) '2.0'\n+D09F5 Extract OS            00 (0) 'MS-DOS'\n+D09F6 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-D03EB Compression Method    0008 (8) 'Deflated'\n-D03ED Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-D03F1 CRC                   937A07E6 (2474248166)\n-D03F5 Compressed Size       000013A9 (5033)\n-D03F9 Uncompressed Size     00004869 (18537)\n-D03FD Filename Length       007F (127)\n-D03FF Extra Length          0000 (0)\n-D0401 Comment Length        0000 (0)\n-D0403 Disk Start            0000 (0)\n-D0405 Int File Attributes   0000 (0)\n+D09F8 Compression Method    0008 (8) 'Deflated'\n+D09FA Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+D09FE CRC                   937A07E6 (2474248166)\n+D0A02 Compressed Size       000013A9 (5033)\n+D0A06 Uncompressed Size     00004869 (18537)\n+D0A0A Filename Length       007F (127)\n+D0A0C Extra Length          0000 (0)\n+D0A0E Comment Length        0000 (0)\n+D0A10 Disk Start            0000 (0)\n+D0A12 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-D0407 Ext File Attributes   81A40000 (2175008768)\n+D0A14 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-D040B Local Header Offset   000329AD (207277)\n-D040F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+D0A18 Local Header Offset   0003297C (207228)\n+D0A1C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xD040F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xD0A1C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-D048E CENTRAL HEADER #333   02014B50 (33639248)\n-D0492 Created Zip Spec      14 (20) '2.0'\n-D0493 Created OS            03 (3) 'Unix'\n-D0494 Extract Zip Spec      14 (20) '2.0'\n-D0495 Extract OS            00 (0) 'MS-DOS'\n-D0496 General Purpose Flag  0800 (2048)\n+D0A9B CENTRAL HEADER #333   02014B50 (33639248)\n+D0A9F Created Zip Spec      14 (20) '2.0'\n+D0AA0 Created OS            03 (3) 'Unix'\n+D0AA1 Extract Zip Spec      14 (20) '2.0'\n+D0AA2 Extract OS            00 (0) 'MS-DOS'\n+D0AA3 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-D0498 Compression Method    0008 (8) 'Deflated'\n-D049A Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-D049E CRC                   53DFF1D7 (1407185367)\n-D04A2 Compressed Size       00000442 (1090)\n-D04A6 Uncompressed Size     00000ADF (2783)\n-D04AA Filename Length       0083 (131)\n-D04AC Extra Length          0000 (0)\n-D04AE Comment Length        0000 (0)\n-D04B0 Disk Start            0000 (0)\n-D04B2 Int File Attributes   0000 (0)\n+D0AA5 Compression Method    0008 (8) 'Deflated'\n+D0AA7 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+D0AAB CRC                   53DFF1D7 (1407185367)\n+D0AAF Compressed Size       00000442 (1090)\n+D0AB3 Uncompressed Size     00000ADF (2783)\n+D0AB7 Filename Length       0083 (131)\n+D0AB9 Extra Length          0000 (0)\n+D0ABB Comment Length        0000 (0)\n+D0ABD Disk Start            0000 (0)\n+D0ABF Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-D04B4 Ext File Attributes   81A40000 (2175008768)\n+D0AC1 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-D04B8 Local Header Offset   00033DF3 (212467)\n-D04BC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+D0AC5 Local Header Offset   00033DC2 (212418)\n+D0AC9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xD04BC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xD0AC9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-D053F CENTRAL HEADER #334   02014B50 (33639248)\n-D0543 Created Zip Spec      14 (20) '2.0'\n-D0544 Created OS            03 (3) 'Unix'\n-D0545 Extract Zip Spec      14 (20) '2.0'\n-D0546 Extract OS            00 (0) 'MS-DOS'\n-D0547 General Purpose Flag  0800 (2048)\n+D0B4C CENTRAL HEADER #334   02014B50 (33639248)\n+D0B50 Created Zip Spec      14 (20) '2.0'\n+D0B51 Created OS            03 (3) 'Unix'\n+D0B52 Extract Zip Spec      14 (20) '2.0'\n+D0B53 Extract OS            00 (0) 'MS-DOS'\n+D0B54 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-D0549 Compression Method    0008 (8) 'Deflated'\n-D054B Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-D054F CRC                   6D3A5445 (1832539205)\n-D0553 Compressed Size       000003FF (1023)\n-D0557 Uncompressed Size     00000939 (2361)\n-D055B Filename Length       007F (127)\n-D055D Extra Length          0000 (0)\n-D055F Comment Length        0000 (0)\n-D0561 Disk Start            0000 (0)\n-D0563 Int File Attributes   0000 (0)\n+D0B56 Compression Method    0008 (8) 'Deflated'\n+D0B58 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+D0B5C CRC                   6D3A5445 (1832539205)\n+D0B60 Compressed Size       000003FF (1023)\n+D0B64 Uncompressed Size     00000939 (2361)\n+D0B68 Filename Length       007F (127)\n+D0B6A Extra Length          0000 (0)\n+D0B6C Comment Length        0000 (0)\n+D0B6E Disk Start            0000 (0)\n+D0B70 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-D0565 Ext File Attributes   81A40000 (2175008768)\n+D0B72 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-D0569 Local Header Offset   000342D6 (213718)\n-D056D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+D0B76 Local Header Offset   000342A5 (213669)\n+D0B7A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xD056D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xD0B7A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-D05EC CENTRAL HEADER #335   02014B50 (33639248)\n-D05F0 Created Zip Spec      14 (20) '2.0'\n-D05F1 Created OS            03 (3) 'Unix'\n-D05F2 Extract Zip Spec      14 (20) '2.0'\n-D05F3 Extract OS            00 (0) 'MS-DOS'\n-D05F4 General Purpose Flag  0800 (2048)\n+D0BF9 CENTRAL HEADER #335   02014B50 (33639248)\n+D0BFD Created Zip Spec      14 (20) '2.0'\n+D0BFE Created OS            03 (3) 'Unix'\n+D0BFF Extract Zip Spec      14 (20) '2.0'\n+D0C00 Extract OS            00 (0) 'MS-DOS'\n+D0C01 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-D05F6 Compression Method    0008 (8) 'Deflated'\n-D05F8 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-D05FC CRC                   5C6B1924 (1550522660)\n-D0600 Compressed Size       000005D8 (1496)\n-D0604 Uncompressed Size     00000DDD (3549)\n-D0608 Filename Length       008E (142)\n-D060A Extra Length          0000 (0)\n-D060C Comment Length        0000 (0)\n-D060E Disk Start            0000 (0)\n-D0610 Int File Attributes   0000 (0)\n+D0C03 Compression Method    0008 (8) 'Deflated'\n+D0C05 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+D0C09 CRC                   5C6B1924 (1550522660)\n+D0C0D Compressed Size       000005D8 (1496)\n+D0C11 Uncompressed Size     00000DDD (3549)\n+D0C15 Filename Length       008E (142)\n+D0C17 Extra Length          0000 (0)\n+D0C19 Comment Length        0000 (0)\n+D0C1B Disk Start            0000 (0)\n+D0C1D Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-D0612 Ext File Attributes   81A40000 (2175008768)\n+D0C1F 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-D0616 Local Header Offset   00034772 (214898)\n-D061A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+D0C23 Local Header Offset   00034741 (214849)\n+D0C27 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXXXXXX'\n #\n-# WARNING: Offset 0xD061A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xD0C27: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-D06A8 CENTRAL HEADER #336   02014B50 (33639248)\n-D06AC Created Zip Spec      14 (20) '2.0'\n-D06AD Created OS            03 (3) 'Unix'\n-D06AE Extract Zip Spec      14 (20) '2.0'\n-D06AF Extract OS            00 (0) 'MS-DOS'\n-D06B0 General Purpose Flag  0800 (2048)\n+D0CB5 CENTRAL HEADER #336   02014B50 (33639248)\n+D0CB9 Created Zip Spec      14 (20) '2.0'\n+D0CBA Created OS            03 (3) 'Unix'\n+D0CBB Extract Zip Spec      14 (20) '2.0'\n+D0CBC Extract OS            00 (0) 'MS-DOS'\n+D0CBD General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-D06B2 Compression Method    0008 (8) 'Deflated'\n-D06B4 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-D06B8 CRC                   C7DF88BB (3353315515)\n-D06BC Compressed Size       00001C38 (7224)\n-D06C0 Uncompressed Size     00009335 (37685)\n-D06C4 Filename Length       0079 (121)\n-D06C6 Extra Length          0000 (0)\n-D06C8 Comment Length        0000 (0)\n-D06CA Disk Start            0000 (0)\n-D06CC Int File Attributes   0000 (0)\n+D0CBF Compression Method    0008 (8) 'Deflated'\n+D0CC1 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+D0CC5 CRC                   C7DF88BB (3353315515)\n+D0CC9 Compressed Size       00001C38 (7224)\n+D0CCD Uncompressed Size     00009335 (37685)\n+D0CD1 Filename Length       0079 (121)\n+D0CD3 Extra Length          0000 (0)\n+D0CD5 Comment Length        0000 (0)\n+D0CD7 Disk Start            0000 (0)\n+D0CD9 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-D06CE Ext File Attributes   81A40000 (2175008768)\n+D0CDB 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-D06D2 Local Header Offset   00034DF6 (216566)\n-D06D6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+D0CDF Local Header Offset   00034DC5 (216517)\n+D0CE3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xD06D6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xD0CE3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-D074F CENTRAL HEADER #337   02014B50 (33639248)\n-D0753 Created Zip Spec      14 (20) '2.0'\n-D0754 Created OS            03 (3) 'Unix'\n-D0755 Extract Zip Spec      14 (20) '2.0'\n-D0756 Extract OS            00 (0) 'MS-DOS'\n-D0757 General Purpose Flag  0800 (2048)\n+D0D5C CENTRAL HEADER #337   02014B50 (33639248)\n+D0D60 Created Zip Spec      14 (20) '2.0'\n+D0D61 Created OS            03 (3) 'Unix'\n+D0D62 Extract Zip Spec      14 (20) '2.0'\n+D0D63 Extract OS            00 (0) 'MS-DOS'\n+D0D64 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-D0759 Compression Method    0008 (8) 'Deflated'\n-D075B Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-D075F CRC                   217BBE0B (561757707)\n-D0763 Compressed Size       00000651 (1617)\n-D0767 Uncompressed Size     00001BB1 (7089)\n-D076B Filename Length       0082 (130)\n-D076D Extra Length          0000 (0)\n-D076F Comment Length        0000 (0)\n-D0771 Disk Start            0000 (0)\n-D0773 Int File Attributes   0000 (0)\n+D0D66 Compression Method    0008 (8) 'Deflated'\n+D0D68 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+D0D6C CRC                   217BBE0B (561757707)\n+D0D70 Compressed Size       00000651 (1617)\n+D0D74 Uncompressed Size     00001BB1 (7089)\n+D0D78 Filename Length       0082 (130)\n+D0D7A Extra Length          0000 (0)\n+D0D7C Comment Length        0000 (0)\n+D0D7E Disk Start            0000 (0)\n+D0D80 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-D0775 Ext File Attributes   81A40000 (2175008768)\n+D0D82 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-D0779 Local Header Offset   00036AC5 (223941)\n-D077D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+D0D86 Local Header Offset   00036A94 (223892)\n+D0D8A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xD077D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xD0D8A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-D07FF CENTRAL HEADER #338   02014B50 (33639248)\n-D0803 Created Zip Spec      14 (20) '2.0'\n-D0804 Created OS            03 (3) 'Unix'\n-D0805 Extract Zip Spec      14 (20) '2.0'\n-D0806 Extract OS            00 (0) 'MS-DOS'\n-D0807 General Purpose Flag  0800 (2048)\n+D0E0C CENTRAL HEADER #338   02014B50 (33639248)\n+D0E10 Created Zip Spec      14 (20) '2.0'\n+D0E11 Created OS            03 (3) 'Unix'\n+D0E12 Extract Zip Spec      14 (20) '2.0'\n+D0E13 Extract OS            00 (0) 'MS-DOS'\n+D0E14 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-D0809 Compression Method    0008 (8) 'Deflated'\n-D080B Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-D080F CRC                   CF72F6D0 (3480418000)\n-D0813 Compressed Size       00001400 (5120)\n-D0817 Uncompressed Size     00004A6A (19050)\n-D081B Filename Length       007F (127)\n-D081D Extra Length          0000 (0)\n-D081F Comment Length        0000 (0)\n-D0821 Disk Start            0000 (0)\n-D0823 Int File Attributes   0000 (0)\n+D0E16 Compression Method    0008 (8) 'Deflated'\n+D0E18 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+D0E1C CRC                   CF72F6D0 (3480418000)\n+D0E20 Compressed Size       00001400 (5120)\n+D0E24 Uncompressed Size     00004A6A (19050)\n+D0E28 Filename Length       007F (127)\n+D0E2A Extra Length          0000 (0)\n+D0E2C Comment Length        0000 (0)\n+D0E2E Disk Start            0000 (0)\n+D0E30 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-D0825 Ext File Attributes   81A40000 (2175008768)\n+D0E32 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-D0829 Local Header Offset   000371B6 (225718)\n-D082D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+D0E36 Local Header Offset   00037185 (225669)\n+D0E3A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xD082D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xD0E3A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-D08AC CENTRAL HEADER #339   02014B50 (33639248)\n-D08B0 Created Zip Spec      14 (20) '2.0'\n-D08B1 Created OS            03 (3) 'Unix'\n-D08B2 Extract Zip Spec      14 (20) '2.0'\n-D08B3 Extract OS            00 (0) 'MS-DOS'\n-D08B4 General Purpose Flag  0800 (2048)\n+D0EB9 CENTRAL HEADER #339   02014B50 (33639248)\n+D0EBD Created Zip Spec      14 (20) '2.0'\n+D0EBE Created OS            03 (3) 'Unix'\n+D0EBF Extract Zip Spec      14 (20) '2.0'\n+D0EC0 Extract OS            00 (0) 'MS-DOS'\n+D0EC1 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-D08B6 Compression Method    0008 (8) 'Deflated'\n-D08B8 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-D08BC CRC                   DCEFA272 (3706692210)\n-D08C0 Compressed Size       0000049C (1180)\n-D08C4 Uncompressed Size     000009D3 (2515)\n-D08C8 Filename Length       0082 (130)\n-D08CA Extra Length          0000 (0)\n-D08CC Comment Length        0000 (0)\n-D08CE Disk Start            0000 (0)\n-D08D0 Int File Attributes   0000 (0)\n+D0EC3 Compression Method    0008 (8) 'Deflated'\n+D0EC5 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+D0EC9 CRC                   DCEFA272 (3706692210)\n+D0ECD Compressed Size       0000049C (1180)\n+D0ED1 Uncompressed Size     000009D3 (2515)\n+D0ED5 Filename Length       0082 (130)\n+D0ED7 Extra Length          0000 (0)\n+D0ED9 Comment Length        0000 (0)\n+D0EDB Disk Start            0000 (0)\n+D0EDD Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-D08D2 Ext File Attributes   81A40000 (2175008768)\n+D0EDF 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-D08D6 Local Header Offset   00038653 (230995)\n-D08DA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+D0EE3 Local Header Offset   00038622 (230946)\n+D0EE7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xD08DA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xD0EE7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-D095C CENTRAL HEADER #340   02014B50 (33639248)\n-D0960 Created Zip Spec      14 (20) '2.0'\n-D0961 Created OS            03 (3) 'Unix'\n-D0962 Extract Zip Spec      14 (20) '2.0'\n-D0963 Extract OS            00 (0) 'MS-DOS'\n-D0964 General Purpose Flag  0800 (2048)\n+D0F69 CENTRAL HEADER #340   02014B50 (33639248)\n+D0F6D Created Zip Spec      14 (20) '2.0'\n+D0F6E Created OS            03 (3) 'Unix'\n+D0F6F Extract Zip Spec      14 (20) '2.0'\n+D0F70 Extract OS            00 (0) 'MS-DOS'\n+D0F71 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-D0966 Compression Method    0008 (8) 'Deflated'\n-D0968 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-D096C CRC                   26E963FE (652829694)\n-D0970 Compressed Size       0000080C (2060)\n-D0974 Uncompressed Size     00001276 (4726)\n-D0978 Filename Length       0084 (132)\n-D097A Extra Length          0000 (0)\n-D097C Comment Length        0000 (0)\n-D097E Disk Start            0000 (0)\n-D0980 Int File Attributes   0000 (0)\n+D0F73 Compression Method    0008 (8) 'Deflated'\n+D0F75 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+D0F79 CRC                   26E963FE (652829694)\n+D0F7D Compressed Size       0000080C (2060)\n+D0F81 Uncompressed Size     00001276 (4726)\n+D0F85 Filename Length       0084 (132)\n+D0F87 Extra Length          0000 (0)\n+D0F89 Comment Length        0000 (0)\n+D0F8B Disk Start            0000 (0)\n+D0F8D Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-D0982 Ext File Attributes   81A40000 (2175008768)\n+D0F8F 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-D0986 Local Header Offset   00038B8F (232335)\n-D098A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+D0F93 Local Header Offset   00038B5E (232286)\n+D0F97 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             '\n #\n-# WARNING: Offset 0xD098A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xD0F97: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-D0A0E CENTRAL HEADER #341   02014B50 (33639248)\n-D0A12 Created Zip Spec      14 (20) '2.0'\n-D0A13 Created OS            03 (3) 'Unix'\n-D0A14 Extract Zip Spec      14 (20) '2.0'\n-D0A15 Extract OS            00 (0) 'MS-DOS'\n-D0A16 General Purpose Flag  0800 (2048)\n+D101B CENTRAL HEADER #341   02014B50 (33639248)\n+D101F Created Zip Spec      14 (20) '2.0'\n+D1020 Created OS            03 (3) 'Unix'\n+D1021 Extract Zip Spec      14 (20) '2.0'\n+D1022 Extract OS            00 (0) 'MS-DOS'\n+D1023 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-D0A18 Compression Method    0008 (8) 'Deflated'\n-D0A1A Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-D0A1E CRC                   9B32EF54 (2603806548)\n-D0A22 Compressed Size       0000175B (5979)\n-D0A26 Uncompressed Size     000054C4 (21700)\n-D0A2A Filename Length       0077 (119)\n-D0A2C Extra Length          0000 (0)\n-D0A2E Comment Length        0000 (0)\n-D0A30 Disk Start            0000 (0)\n-D0A32 Int File Attributes   0000 (0)\n+D1025 Compression Method    0008 (8) 'Deflated'\n+D1027 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+D102B CRC                   9B32EF54 (2603806548)\n+D102F Compressed Size       0000175B (5979)\n+D1033 Uncompressed Size     000054C4 (21700)\n+D1037 Filename Length       0077 (119)\n+D1039 Extra Length          0000 (0)\n+D103B Comment Length        0000 (0)\n+D103D Disk Start            0000 (0)\n+D103F Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-D0A34 Ext File Attributes   81A40000 (2175008768)\n+D1041 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-D0A38 Local Header Offset   0003943D (234557)\n-D0A3C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+D1045 Local Header Offset   0003940C (234508)\n+D1049 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xD0A3C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xD1049: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-D0AB3 CENTRAL HEADER #342   02014B50 (33639248)\n-D0AB7 Created Zip Spec      14 (20) '2.0'\n-D0AB8 Created OS            03 (3) 'Unix'\n-D0AB9 Extract Zip Spec      14 (20) '2.0'\n-D0ABA Extract OS            00 (0) 'MS-DOS'\n-D0ABB General Purpose Flag  0800 (2048)\n+D10C0 CENTRAL HEADER #342   02014B50 (33639248)\n+D10C4 Created Zip Spec      14 (20) '2.0'\n+D10C5 Created OS            03 (3) 'Unix'\n+D10C6 Extract Zip Spec      14 (20) '2.0'\n+D10C7 Extract OS            00 (0) 'MS-DOS'\n+D10C8 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-D0ABD Compression Method    0008 (8) 'Deflated'\n-D0ABF Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-D0AC3 CRC                   4975042F (1232405551)\n-D0AC7 Compressed Size       000009BF (2495)\n-D0ACB Uncompressed Size     00001B21 (6945)\n-D0ACF Filename Length       007E (126)\n-D0AD1 Extra Length          0000 (0)\n-D0AD3 Comment Length        0000 (0)\n-D0AD5 Disk Start            0000 (0)\n-D0AD7 Int File Attributes   0000 (0)\n+D10CA Compression Method    0008 (8) 'Deflated'\n+D10CC Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+D10D0 CRC                   4975042F (1232405551)\n+D10D4 Compressed Size       000009BF (2495)\n+D10D8 Uncompressed Size     00001B21 (6945)\n+D10DC Filename Length       007E (126)\n+D10DE Extra Length          0000 (0)\n+D10E0 Comment Length        0000 (0)\n+D10E2 Disk Start            0000 (0)\n+D10E4 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-D0AD9 Ext File Attributes   81A40000 (2175008768)\n+D10E6 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-D0ADD Local Header Offset   0003AC2D (240685)\n-D0AE1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+D10EA Local Header Offset   0003ABFC (240636)\n+D10EE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xD0AE1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xD10EE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-D0B5F CENTRAL HEADER #343   02014B50 (33639248)\n-D0B63 Created Zip Spec      14 (20) '2.0'\n-D0B64 Created OS            03 (3) 'Unix'\n-D0B65 Extract Zip Spec      14 (20) '2.0'\n-D0B66 Extract OS            00 (0) 'MS-DOS'\n-D0B67 General Purpose Flag  0800 (2048)\n+D116C CENTRAL HEADER #343   02014B50 (33639248)\n+D1170 Created Zip Spec      14 (20) '2.0'\n+D1171 Created OS            03 (3) 'Unix'\n+D1172 Extract Zip Spec      14 (20) '2.0'\n+D1173 Extract OS            00 (0) 'MS-DOS'\n+D1174 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-D0B69 Compression Method    0008 (8) 'Deflated'\n-D0B6B Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-D0B6F CRC                   27E12F4C (669069132)\n-D0B73 Compressed Size       0000086D (2157)\n-D0B77 Uncompressed Size     000014EA (5354)\n-D0B7B Filename Length       0081 (129)\n-D0B7D Extra Length          0000 (0)\n-D0B7F Comment Length        0000 (0)\n-D0B81 Disk Start            0000 (0)\n-D0B83 Int File Attributes   0000 (0)\n+D1176 Compression Method    0008 (8) 'Deflated'\n+D1178 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+D117C CRC                   27E12F4C (669069132)\n+D1180 Compressed Size       0000086D (2157)\n+D1184 Uncompressed Size     000014EA (5354)\n+D1188 Filename Length       0081 (129)\n+D118A Extra Length          0000 (0)\n+D118C Comment Length        0000 (0)\n+D118E Disk Start            0000 (0)\n+D1190 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-D0B85 Ext File Attributes   81A40000 (2175008768)\n+D1192 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-D0B89 Local Header Offset   0003B688 (243336)\n-D0B8D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+D1196 Local Header Offset   0003B657 (243287)\n+D119A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xD0B8D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xD119A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-D0C0E CENTRAL HEADER #344   02014B50 (33639248)\n-D0C12 Created Zip Spec      14 (20) '2.0'\n-D0C13 Created OS            03 (3) 'Unix'\n-D0C14 Extract Zip Spec      14 (20) '2.0'\n-D0C15 Extract OS            00 (0) 'MS-DOS'\n-D0C16 General Purpose Flag  0800 (2048)\n+D121B CENTRAL HEADER #344   02014B50 (33639248)\n+D121F Created Zip Spec      14 (20) '2.0'\n+D1220 Created OS            03 (3) 'Unix'\n+D1221 Extract Zip Spec      14 (20) '2.0'\n+D1222 Extract OS            00 (0) 'MS-DOS'\n+D1223 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-D0C18 Compression Method    0008 (8) 'Deflated'\n-D0C1A Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-D0C1E CRC                   3E8950DE (1049186526)\n-D0C22 Compressed Size       0000120A (4618)\n-D0C26 Uncompressed Size     000036E0 (14048)\n-D0C2A Filename Length       0081 (129)\n-D0C2C Extra Length          0000 (0)\n-D0C2E Comment Length        0000 (0)\n-D0C30 Disk Start            0000 (0)\n-D0C32 Int File Attributes   0000 (0)\n+D1225 Compression Method    0008 (8) 'Deflated'\n+D1227 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+D122B CRC                   3E8950DE (1049186526)\n+D122F Compressed Size       0000120A (4618)\n+D1233 Uncompressed Size     000036E0 (14048)\n+D1237 Filename Length       0081 (129)\n+D1239 Extra Length          0000 (0)\n+D123B Comment Length        0000 (0)\n+D123D Disk Start            0000 (0)\n+D123F Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-D0C34 Ext File Attributes   81A40000 (2175008768)\n+D1241 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-D0C38 Local Header Offset   0003BF94 (245652)\n-D0C3C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+D1245 Local Header Offset   0003BF63 (245603)\n+D1249 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xD0C3C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xD1249: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-D0CBD CENTRAL HEADER #345   02014B50 (33639248)\n-D0CC1 Created Zip Spec      14 (20) '2.0'\n-D0CC2 Created OS            03 (3) 'Unix'\n-D0CC3 Extract Zip Spec      14 (20) '2.0'\n-D0CC4 Extract OS            00 (0) 'MS-DOS'\n-D0CC5 General Purpose Flag  0800 (2048)\n+D12CA CENTRAL HEADER #345   02014B50 (33639248)\n+D12CE Created Zip Spec      14 (20) '2.0'\n+D12CF Created OS            03 (3) 'Unix'\n+D12D0 Extract Zip Spec      14 (20) '2.0'\n+D12D1 Extract OS            00 (0) 'MS-DOS'\n+D12D2 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-D0CC7 Compression Method    0008 (8) 'Deflated'\n-D0CC9 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-D0CCD CRC                   A9B3A4D7 (2847122647)\n-D0CD1 Compressed Size       00000A9A (2714)\n-D0CD5 Uncompressed Size     00002051 (8273)\n-D0CD9 Filename Length       0080 (128)\n-D0CDB Extra Length          0000 (0)\n-D0CDD Comment Length        0000 (0)\n-D0CDF Disk Start            0000 (0)\n-D0CE1 Int File Attributes   0000 (0)\n+D12D4 Compression Method    0008 (8) 'Deflated'\n+D12D6 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+D12DA CRC                   A9B3A4D7 (2847122647)\n+D12DE Compressed Size       00000A9A (2714)\n+D12E2 Uncompressed Size     00002051 (8273)\n+D12E6 Filename Length       0080 (128)\n+D12E8 Extra Length          0000 (0)\n+D12EA Comment Length        0000 (0)\n+D12EC Disk Start            0000 (0)\n+D12EE Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-D0CE3 Ext File Attributes   81A40000 (2175008768)\n+D12F0 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-D0CE7 Local Header Offset   0003D23D (250429)\n-D0CEB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+D12F4 Local Header Offset   0003D20C (250380)\n+D12F8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xD0CEB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xD12F8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-D0D6B CENTRAL HEADER #346   02014B50 (33639248)\n-D0D6F Created Zip Spec      14 (20) '2.0'\n-D0D70 Created OS            03 (3) 'Unix'\n-D0D71 Extract Zip Spec      14 (20) '2.0'\n-D0D72 Extract OS            00 (0) 'MS-DOS'\n-D0D73 General Purpose Flag  0800 (2048)\n+D1378 CENTRAL HEADER #346   02014B50 (33639248)\n+D137C Created Zip Spec      14 (20) '2.0'\n+D137D Created OS            03 (3) 'Unix'\n+D137E Extract Zip Spec      14 (20) '2.0'\n+D137F Extract OS            00 (0) 'MS-DOS'\n+D1380 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-D0D75 Compression Method    0008 (8) 'Deflated'\n-D0D77 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-D0D7B CRC                   B12610E6 (2972061926)\n-D0D7F Compressed Size       00000441 (1089)\n-D0D83 Uncompressed Size     00000A5B (2651)\n-D0D87 Filename Length       0073 (115)\n-D0D89 Extra Length          0000 (0)\n-D0D8B Comment Length        0000 (0)\n-D0D8D Disk Start            0000 (0)\n-D0D8F Int File Attributes   0000 (0)\n+D1382 Compression Method    0008 (8) 'Deflated'\n+D1384 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+D1388 CRC                   B12610E6 (2972061926)\n+D138C Compressed Size       00000441 (1089)\n+D1390 Uncompressed Size     00000A5B (2651)\n+D1394 Filename Length       0073 (115)\n+D1396 Extra Length          0000 (0)\n+D1398 Comment Length        0000 (0)\n+D139A Disk Start            0000 (0)\n+D139C Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-D0D91 Ext File Attributes   81A40000 (2175008768)\n+D139E 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-D0D95 Local Header Offset   0003DD75 (253301)\n-D0D99 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+D13A2 Local Header Offset   0003DD44 (253252)\n+D13A6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xD0D99: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xD13A6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-D0E0C CENTRAL HEADER #347   02014B50 (33639248)\n-D0E10 Created Zip Spec      14 (20) '2.0'\n-D0E11 Created OS            03 (3) 'Unix'\n-D0E12 Extract Zip Spec      14 (20) '2.0'\n-D0E13 Extract OS            00 (0) 'MS-DOS'\n-D0E14 General Purpose Flag  0800 (2048)\n+D1419 CENTRAL HEADER #347   02014B50 (33639248)\n+D141D Created Zip Spec      14 (20) '2.0'\n+D141E Created OS            03 (3) 'Unix'\n+D141F Extract Zip Spec      14 (20) '2.0'\n+D1420 Extract OS            00 (0) 'MS-DOS'\n+D1421 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-D0E16 Compression Method    0008 (8) 'Deflated'\n-D0E18 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-D0E1C CRC                   041CE92B (69003563)\n-D0E20 Compressed Size       0000046E (1134)\n-D0E24 Uncompressed Size     00000B22 (2850)\n-D0E28 Filename Length       008E (142)\n-D0E2A Extra Length          0000 (0)\n-D0E2C Comment Length        0000 (0)\n-D0E2E Disk Start            0000 (0)\n-D0E30 Int File Attributes   0000 (0)\n+D1423 Compression Method    0008 (8) 'Deflated'\n+D1425 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+D1429 CRC                   041CE92B (69003563)\n+D142D Compressed Size       0000046E (1134)\n+D1431 Uncompressed Size     00000B22 (2850)\n+D1435 Filename Length       008E (142)\n+D1437 Extra Length          0000 (0)\n+D1439 Comment Length        0000 (0)\n+D143B Disk Start            0000 (0)\n+D143D Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-D0E32 Ext File Attributes   81A40000 (2175008768)\n+D143F 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-D0E36 Local Header Offset   0003E247 (254535)\n-D0E3A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+D1443 Local Header Offset   0003E216 (254486)\n+D1447 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXXXXXX'\n #\n-# WARNING: Offset 0xD0E3A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xD1447: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-D0EC8 CENTRAL HEADER #348   02014B50 (33639248)\n-D0ECC Created Zip Spec      14 (20) '2.0'\n-D0ECD Created OS            03 (3) 'Unix'\n-D0ECE Extract Zip Spec      14 (20) '2.0'\n-D0ECF Extract OS            00 (0) 'MS-DOS'\n-D0ED0 General Purpose Flag  0800 (2048)\n+D14D5 CENTRAL HEADER #348   02014B50 (33639248)\n+D14D9 Created Zip Spec      14 (20) '2.0'\n+D14DA Created OS            03 (3) 'Unix'\n+D14DB Extract Zip Spec      14 (20) '2.0'\n+D14DC Extract OS            00 (0) 'MS-DOS'\n+D14DD General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-D0ED2 Compression Method    0008 (8) 'Deflated'\n-D0ED4 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-D0ED8 CRC                   16A4BA93 (379894419)\n-D0EDC Compressed Size       000006D2 (1746)\n-D0EE0 Uncompressed Size     000016E4 (5860)\n-D0EE4 Filename Length       008D (141)\n-D0EE6 Extra Length          0000 (0)\n-D0EE8 Comment Length        0000 (0)\n-D0EEA Disk Start            0000 (0)\n-D0EEC Int File Attributes   0000 (0)\n+D14DF Compression Method    0008 (8) 'Deflated'\n+D14E1 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+D14E5 CRC                   16A4BA93 (379894419)\n+D14E9 Compressed Size       000006D2 (1746)\n+D14ED Uncompressed Size     000016E4 (5860)\n+D14F1 Filename Length       008D (141)\n+D14F3 Extra Length          0000 (0)\n+D14F5 Comment Length        0000 (0)\n+D14F7 Disk Start            0000 (0)\n+D14F9 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-D0EEE Ext File Attributes   81A40000 (2175008768)\n+D14FB 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-D0EF2 Local Header Offset   0003E761 (255841)\n-D0EF6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+D14FF Local Header Offset   0003E730 (255792)\n+D1503 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXXXXX'\n #\n-# WARNING: Offset 0xD0EF6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xD1503: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-D0F83 CENTRAL HEADER #349   02014B50 (33639248)\n-D0F87 Created Zip Spec      14 (20) '2.0'\n-D0F88 Created OS            03 (3) 'Unix'\n-D0F89 Extract Zip Spec      14 (20) '2.0'\n-D0F8A Extract OS            00 (0) 'MS-DOS'\n-D0F8B General Purpose Flag  0800 (2048)\n+D1590 CENTRAL HEADER #349   02014B50 (33639248)\n+D1594 Created Zip Spec      14 (20) '2.0'\n+D1595 Created OS            03 (3) 'Unix'\n+D1596 Extract Zip Spec      14 (20) '2.0'\n+D1597 Extract OS            00 (0) 'MS-DOS'\n+D1598 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-D0F8D Compression Method    0008 (8) 'Deflated'\n-D0F8F Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-D0F93 CRC                   390AB403 (957002755)\n-D0F97 Compressed Size       000005D3 (1491)\n-D0F9B Uncompressed Size     00001068 (4200)\n-D0F9F Filename Length       0090 (144)\n-D0FA1 Extra Length          0000 (0)\n-D0FA3 Comment Length        0000 (0)\n-D0FA5 Disk Start            0000 (0)\n-D0FA7 Int File Attributes   0000 (0)\n+D159A Compression Method    0008 (8) 'Deflated'\n+D159C Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+D15A0 CRC                   390AB403 (957002755)\n+D15A4 Compressed Size       000005D3 (1491)\n+D15A8 Uncompressed Size     00001068 (4200)\n+D15AC Filename Length       0090 (144)\n+D15AE Extra Length          0000 (0)\n+D15B0 Comment Length        0000 (0)\n+D15B2 Disk Start            0000 (0)\n+D15B4 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-D0FA9 Ext File Attributes   81A40000 (2175008768)\n+D15B6 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-D0FAD Local Header Offset   0003EEDE (257758)\n-D0FB1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+D15BA Local Header Offset   0003EEAD (257709)\n+D15BE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xD0FB1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xD15BE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-D1041 CENTRAL HEADER #350   02014B50 (33639248)\n-D1045 Created Zip Spec      14 (20) '2.0'\n-D1046 Created OS            03 (3) 'Unix'\n-D1047 Extract Zip Spec      14 (20) '2.0'\n-D1048 Extract OS            00 (0) 'MS-DOS'\n-D1049 General Purpose Flag  0800 (2048)\n+D164E CENTRAL HEADER #350   02014B50 (33639248)\n+D1652 Created Zip Spec      14 (20) '2.0'\n+D1653 Created OS            03 (3) 'Unix'\n+D1654 Extract Zip Spec      14 (20) '2.0'\n+D1655 Extract OS            00 (0) 'MS-DOS'\n+D1656 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-D104B Compression Method    0008 (8) 'Deflated'\n-D104D Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-D1051 CRC                   3DE98548 (1038714184)\n-D1055 Compressed Size       0000064F (1615)\n-D1059 Uncompressed Size     000016AA (5802)\n-D105D Filename Length       008C (140)\n-D105F Extra Length          0000 (0)\n-D1061 Comment Length        0000 (0)\n-D1063 Disk Start            0000 (0)\n-D1065 Int File Attributes   0000 (0)\n+D1658 Compression Method    0008 (8) 'Deflated'\n+D165A Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+D165E CRC                   3DE98548 (1038714184)\n+D1662 Compressed Size       0000064F (1615)\n+D1666 Uncompressed Size     000016AA (5802)\n+D166A Filename Length       008C (140)\n+D166C Extra Length          0000 (0)\n+D166E Comment Length        0000 (0)\n+D1670 Disk Start            0000 (0)\n+D1672 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-D1067 Ext File Attributes   81A40000 (2175008768)\n+D1674 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-D106B Local Header Offset   0003F55F (259423)\n-D106F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+D1678 Local Header Offset   0003F52E (259374)\n+D167C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXXXX'\n #\n-# WARNING: Offset 0xD106F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xD167C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-D10FB CENTRAL HEADER #351   02014B50 (33639248)\n-D10FF Created Zip Spec      14 (20) '2.0'\n-D1100 Created OS            03 (3) 'Unix'\n-D1101 Extract Zip Spec      14 (20) '2.0'\n-D1102 Extract OS            00 (0) 'MS-DOS'\n-D1103 General Purpose Flag  0800 (2048)\n+D1708 CENTRAL HEADER #351   02014B50 (33639248)\n+D170C Created Zip Spec      14 (20) '2.0'\n+D170D Created OS            03 (3) 'Unix'\n+D170E Extract Zip Spec      14 (20) '2.0'\n+D170F Extract OS            00 (0) 'MS-DOS'\n+D1710 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-D1105 Compression Method    0008 (8) 'Deflated'\n-D1107 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-D110B CRC                   561A3BB2 (1444559794)\n-D110F Compressed Size       000009BA (2490)\n-D1113 Uncompressed Size     000018A8 (6312)\n-D1117 Filename Length       0071 (113)\n-D1119 Extra Length          0000 (0)\n-D111B Comment Length        0000 (0)\n-D111D Disk Start            0000 (0)\n-D111F Int File Attributes   0000 (0)\n+D1712 Compression Method    0008 (8) 'Deflated'\n+D1714 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+D1718 CRC                   561A3BB2 (1444559794)\n+D171C Compressed Size       000009BA (2490)\n+D1720 Uncompressed Size     000018A8 (6312)\n+D1724 Filename Length       0071 (113)\n+D1726 Extra Length          0000 (0)\n+D1728 Comment Length        0000 (0)\n+D172A Disk Start            0000 (0)\n+D172C Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-D1121 Ext File Attributes   81A40000 (2175008768)\n+D172E 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-D1125 Local Header Offset   0003FC58 (261208)\n-D1129 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+D1732 Local Header Offset   0003FC27 (261159)\n+D1736 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xD1129: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xD1736: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-D119A CENTRAL HEADER #352   02014B50 (33639248)\n-D119E Created Zip Spec      14 (20) '2.0'\n-D119F Created OS            03 (3) 'Unix'\n-D11A0 Extract Zip Spec      14 (20) '2.0'\n-D11A1 Extract OS            00 (0) 'MS-DOS'\n-D11A2 General Purpose Flag  0800 (2048)\n+D17A7 CENTRAL HEADER #352   02014B50 (33639248)\n+D17AB Created Zip Spec      14 (20) '2.0'\n+D17AC Created OS            03 (3) 'Unix'\n+D17AD Extract Zip Spec      14 (20) '2.0'\n+D17AE Extract OS            00 (0) 'MS-DOS'\n+D17AF General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-D11A4 Compression Method    0008 (8) 'Deflated'\n-D11A6 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-D11AA CRC                   A1D18B9C (2714864540)\n-D11AE Compressed Size       00000A70 (2672)\n-D11B2 Uncompressed Size     00001AC2 (6850)\n-D11B6 Filename Length       0070 (112)\n-D11B8 Extra Length          0000 (0)\n-D11BA Comment Length        0000 (0)\n-D11BC Disk Start            0000 (0)\n-D11BE Int File Attributes   0000 (0)\n+D17B1 Compression Method    0008 (8) 'Deflated'\n+D17B3 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+D17B7 CRC                   A1D18B9C (2714864540)\n+D17BB Compressed Size       00000A70 (2672)\n+D17BF Uncompressed Size     00001AC2 (6850)\n+D17C3 Filename Length       0070 (112)\n+D17C5 Extra Length          0000 (0)\n+D17C7 Comment Length        0000 (0)\n+D17C9 Disk Start            0000 (0)\n+D17CB Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-D11C0 Ext File Attributes   81A40000 (2175008768)\n+D17CD 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-D11C4 Local Header Offset   000406A1 (263841)\n-D11C8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+D17D1 Local Header Offset   00040670 (263792)\n+D17D5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xD11C8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xD17D5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-D1238 CENTRAL HEADER #353   02014B50 (33639248)\n-D123C Created Zip Spec      14 (20) '2.0'\n-D123D Created OS            03 (3) 'Unix'\n-D123E Extract Zip Spec      14 (20) '2.0'\n-D123F Extract OS            00 (0) 'MS-DOS'\n-D1240 General Purpose Flag  0800 (2048)\n+D1845 CENTRAL HEADER #353   02014B50 (33639248)\n+D1849 Created Zip Spec      14 (20) '2.0'\n+D184A Created OS            03 (3) 'Unix'\n+D184B Extract Zip Spec      14 (20) '2.0'\n+D184C Extract OS            00 (0) 'MS-DOS'\n+D184D General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-D1242 Compression Method    0008 (8) 'Deflated'\n-D1244 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-D1248 CRC                   33231FD5 (857939925)\n-D124C Compressed Size       0000082D (2093)\n-D1250 Uncompressed Size     00001399 (5017)\n-D1254 Filename Length       0071 (113)\n-D1256 Extra Length          0000 (0)\n-D1258 Comment Length        0000 (0)\n-D125A Disk Start            0000 (0)\n-D125C Int File Attributes   0000 (0)\n+D184F Compression Method    0008 (8) 'Deflated'\n+D1851 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+D1855 CRC                   33231FD5 (857939925)\n+D1859 Compressed Size       0000082D (2093)\n+D185D Uncompressed Size     00001399 (5017)\n+D1861 Filename Length       0071 (113)\n+D1863 Extra Length          0000 (0)\n+D1865 Comment Length        0000 (0)\n+D1867 Disk Start            0000 (0)\n+D1869 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-D125E Ext File Attributes   81A40000 (2175008768)\n+D186B 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-D1262 Local Header Offset   0004119F (266655)\n-D1266 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+D186F Local Header Offset   0004116E (266606)\n+D1873 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xD1266: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xD1873: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-D12D7 CENTRAL HEADER #354   02014B50 (33639248)\n-D12DB Created Zip Spec      14 (20) '2.0'\n-D12DC Created OS            03 (3) 'Unix'\n-D12DD Extract Zip Spec      14 (20) '2.0'\n-D12DE Extract OS            00 (0) 'MS-DOS'\n-D12DF General Purpose Flag  0800 (2048)\n+D18E4 CENTRAL HEADER #354   02014B50 (33639248)\n+D18E8 Created Zip Spec      14 (20) '2.0'\n+D18E9 Created OS            03 (3) 'Unix'\n+D18EA Extract Zip Spec      14 (20) '2.0'\n+D18EB Extract OS            00 (0) 'MS-DOS'\n+D18EC General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-D12E1 Compression Method    0008 (8) 'Deflated'\n-D12E3 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-D12E7 CRC                   63C353AF (1673745327)\n-D12EB Compressed Size       000005DA (1498)\n-D12EF Uncompressed Size     00000CF8 (3320)\n-D12F3 Filename Length       006A (106)\n-D12F5 Extra Length          0000 (0)\n-D12F7 Comment Length        0000 (0)\n-D12F9 Disk Start            0000 (0)\n-D12FB Int File Attributes   0000 (0)\n+D18EE Compression Method    0008 (8) 'Deflated'\n+D18F0 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+D18F4 CRC                   63C353AF (1673745327)\n+D18F8 Compressed Size       000005DA (1498)\n+D18FC Uncompressed Size     00000CF8 (3320)\n+D1900 Filename Length       006A (106)\n+D1902 Extra Length          0000 (0)\n+D1904 Comment Length        0000 (0)\n+D1906 Disk Start            0000 (0)\n+D1908 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-D12FD Ext File Attributes   81A40000 (2175008768)\n+D190A 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-D1301 Local Header Offset   00041A5B (268891)\n-D1305 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+D190E Local Header Offset   00041A2A (268842)\n+D1912 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xD1305: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xD1912: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-D136F CENTRAL HEADER #355   02014B50 (33639248)\n-D1373 Created Zip Spec      14 (20) '2.0'\n-D1374 Created OS            03 (3) 'Unix'\n-D1375 Extract Zip Spec      14 (20) '2.0'\n-D1376 Extract OS            00 (0) 'MS-DOS'\n-D1377 General Purpose Flag  0800 (2048)\n+D197C CENTRAL HEADER #355   02014B50 (33639248)\n+D1980 Created Zip Spec      14 (20) '2.0'\n+D1981 Created OS            03 (3) 'Unix'\n+D1982 Extract Zip Spec      14 (20) '2.0'\n+D1983 Extract OS            00 (0) 'MS-DOS'\n+D1984 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-D1379 Compression Method    0008 (8) 'Deflated'\n-D137B Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-D137F CRC                   C64481A5 (3326378405)\n-D1383 Compressed Size       000003AA (938)\n-D1387 Uncompressed Size     00000723 (1827)\n-D138B Filename Length       0071 (113)\n-D138D Extra Length          0000 (0)\n-D138F Comment Length        0000 (0)\n-D1391 Disk Start            0000 (0)\n-D1393 Int File Attributes   0000 (0)\n+D1986 Compression Method    0008 (8) 'Deflated'\n+D1988 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+D198C CRC                   C64481A5 (3326378405)\n+D1990 Compressed Size       000003AA (938)\n+D1994 Uncompressed Size     00000723 (1827)\n+D1998 Filename Length       0071 (113)\n+D199A Extra Length          0000 (0)\n+D199C Comment Length        0000 (0)\n+D199E Disk Start            0000 (0)\n+D19A0 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-D1395 Ext File Attributes   81A40000 (2175008768)\n+D19A2 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-D1399 Local Header Offset   000420BD (270525)\n-D139D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+D19A6 Local Header Offset   0004208C (270476)\n+D19AA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xD139D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xD19AA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-D140E CENTRAL HEADER #356   02014B50 (33639248)\n-D1412 Created Zip Spec      14 (20) '2.0'\n-D1413 Created OS            03 (3) 'Unix'\n-D1414 Extract Zip Spec      14 (20) '2.0'\n-D1415 Extract OS            00 (0) 'MS-DOS'\n-D1416 General Purpose Flag  0800 (2048)\n+D1A1B CENTRAL HEADER #356   02014B50 (33639248)\n+D1A1F Created Zip Spec      14 (20) '2.0'\n+D1A20 Created OS            03 (3) 'Unix'\n+D1A21 Extract Zip Spec      14 (20) '2.0'\n+D1A22 Extract OS            00 (0) 'MS-DOS'\n+D1A23 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-D1418 Compression Method    0008 (8) 'Deflated'\n-D141A Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-D141E CRC                   39649106 (962892038)\n-D1422 Compressed Size       0000039E (926)\n-D1426 Uncompressed Size     000006E2 (1762)\n-D142A Filename Length       006F (111)\n-D142C Extra Length          0000 (0)\n-D142E Comment Length        0000 (0)\n-D1430 Disk Start            0000 (0)\n-D1432 Int File Attributes   0000 (0)\n+D1A25 Compression Method    0008 (8) 'Deflated'\n+D1A27 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+D1A2B CRC                   39649106 (962892038)\n+D1A2F Compressed Size       0000039E (926)\n+D1A33 Uncompressed Size     000006E2 (1762)\n+D1A37 Filename Length       006F (111)\n+D1A39 Extra Length          0000 (0)\n+D1A3B Comment Length        0000 (0)\n+D1A3D Disk Start            0000 (0)\n+D1A3F Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-D1434 Ext File Attributes   81A40000 (2175008768)\n+D1A41 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-D1438 Local Header Offset   000424F6 (271606)\n-D143C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+D1A45 Local Header Offset   000424C5 (271557)\n+D1A49 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xD143C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xD1A49: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-D14AB CENTRAL HEADER #357   02014B50 (33639248)\n-D14AF Created Zip Spec      14 (20) '2.0'\n-D14B0 Created OS            03 (3) 'Unix'\n-D14B1 Extract Zip Spec      14 (20) '2.0'\n-D14B2 Extract OS            00 (0) 'MS-DOS'\n-D14B3 General Purpose Flag  0800 (2048)\n+D1AB8 CENTRAL HEADER #357   02014B50 (33639248)\n+D1ABC Created Zip Spec      14 (20) '2.0'\n+D1ABD Created OS            03 (3) 'Unix'\n+D1ABE Extract Zip Spec      14 (20) '2.0'\n+D1ABF Extract OS            00 (0) 'MS-DOS'\n+D1AC0 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-D14B5 Compression Method    0008 (8) 'Deflated'\n-D14B7 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-D14BB CRC                   8DC8B44C (2378740812)\n-D14BF Compressed Size       000003E3 (995)\n-D14C3 Uncompressed Size     00000782 (1922)\n-D14C7 Filename Length       006A (106)\n-D14C9 Extra Length          0000 (0)\n-D14CB Comment Length        0000 (0)\n-D14CD Disk Start            0000 (0)\n-D14CF Int File Attributes   0000 (0)\n+D1AC2 Compression Method    0008 (8) 'Deflated'\n+D1AC4 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+D1AC8 CRC                   8DC8B44C (2378740812)\n+D1ACC Compressed Size       000003E3 (995)\n+D1AD0 Uncompressed Size     00000782 (1922)\n+D1AD4 Filename Length       006A (106)\n+D1AD6 Extra Length          0000 (0)\n+D1AD8 Comment Length        0000 (0)\n+D1ADA Disk Start            0000 (0)\n+D1ADC Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-D14D1 Ext File Attributes   81A40000 (2175008768)\n+D1ADE 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-D14D5 Local Header Offset   00042921 (272673)\n-D14D9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+D1AE2 Local Header Offset   000428F0 (272624)\n+D1AE6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xD14D9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xD1AE6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-D1543 CENTRAL HEADER #358   02014B50 (33639248)\n-D1547 Created Zip Spec      14 (20) '2.0'\n-D1548 Created OS            03 (3) 'Unix'\n-D1549 Extract Zip Spec      14 (20) '2.0'\n-D154A Extract OS            00 (0) 'MS-DOS'\n-D154B General Purpose Flag  0800 (2048)\n+D1B50 CENTRAL HEADER #358   02014B50 (33639248)\n+D1B54 Created Zip Spec      14 (20) '2.0'\n+D1B55 Created OS            03 (3) 'Unix'\n+D1B56 Extract Zip Spec      14 (20) '2.0'\n+D1B57 Extract OS            00 (0) 'MS-DOS'\n+D1B58 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-D154D Compression Method    0008 (8) 'Deflated'\n-D154F Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-D1553 CRC                   335CA1CD (861708749)\n-D1557 Compressed Size       0000068B (1675)\n-D155B Uncompressed Size     00000E9A (3738)\n-D155F Filename Length       0074 (116)\n-D1561 Extra Length          0000 (0)\n-D1563 Comment Length        0000 (0)\n-D1565 Disk Start            0000 (0)\n-D1567 Int File Attributes   0000 (0)\n+D1B5A Compression Method    0008 (8) 'Deflated'\n+D1B5C Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+D1B60 CRC                   335CA1CD (861708749)\n+D1B64 Compressed Size       0000068B (1675)\n+D1B68 Uncompressed Size     00000E9A (3738)\n+D1B6C Filename Length       0074 (116)\n+D1B6E Extra Length          0000 (0)\n+D1B70 Comment Length        0000 (0)\n+D1B72 Disk Start            0000 (0)\n+D1B74 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-D1569 Ext File Attributes   81A40000 (2175008768)\n+D1B76 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-D156D Local Header Offset   00042D8C (273804)\n-D1571 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+D1B7A Local Header Offset   00042D5B (273755)\n+D1B7E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xD1571: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xD1B7E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-D15E5 CENTRAL HEADER #359   02014B50 (33639248)\n-D15E9 Created Zip Spec      14 (20) '2.0'\n-D15EA Created OS            03 (3) 'Unix'\n-D15EB Extract Zip Spec      14 (20) '2.0'\n-D15EC Extract OS            00 (0) 'MS-DOS'\n-D15ED General Purpose Flag  0800 (2048)\n+D1BF2 CENTRAL HEADER #359   02014B50 (33639248)\n+D1BF6 Created Zip Spec      14 (20) '2.0'\n+D1BF7 Created OS            03 (3) 'Unix'\n+D1BF8 Extract Zip Spec      14 (20) '2.0'\n+D1BF9 Extract OS            00 (0) 'MS-DOS'\n+D1BFA General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-D15EF Compression Method    0008 (8) 'Deflated'\n-D15F1 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-D15F5 CRC                   3EE7FDDD (1055391197)\n-D15F9 Compressed Size       00000723 (1827)\n-D15FD Uncompressed Size     00001059 (4185)\n-D1601 Filename Length       0080 (128)\n-D1603 Extra Length          0000 (0)\n-D1605 Comment Length        0000 (0)\n-D1607 Disk Start            0000 (0)\n-D1609 Int File Attributes   0000 (0)\n+D1BFC Compression Method    0008 (8) 'Deflated'\n+D1BFE Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+D1C02 CRC                   3EE7FDDD (1055391197)\n+D1C06 Compressed Size       00000723 (1827)\n+D1C0A Uncompressed Size     00001059 (4185)\n+D1C0E Filename Length       0080 (128)\n+D1C10 Extra Length          0000 (0)\n+D1C12 Comment Length        0000 (0)\n+D1C14 Disk Start            0000 (0)\n+D1C16 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-D160B Ext File Attributes   81A40000 (2175008768)\n+D1C18 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-D160F Local Header Offset   000434A9 (275625)\n-D1613 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+D1C1C Local Header Offset   00043478 (275576)\n+D1C20 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xD1613: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xD1C20: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-D1693 CENTRAL HEADER #360   02014B50 (33639248)\n-D1697 Created Zip Spec      14 (20) '2.0'\n-D1698 Created OS            03 (3) 'Unix'\n-D1699 Extract Zip Spec      14 (20) '2.0'\n-D169A Extract OS            00 (0) 'MS-DOS'\n-D169B General Purpose Flag  0800 (2048)\n+D1CA0 CENTRAL HEADER #360   02014B50 (33639248)\n+D1CA4 Created Zip Spec      14 (20) '2.0'\n+D1CA5 Created OS            03 (3) 'Unix'\n+D1CA6 Extract Zip Spec      14 (20) '2.0'\n+D1CA7 Extract OS            00 (0) 'MS-DOS'\n+D1CA8 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-D169D Compression Method    0008 (8) 'Deflated'\n-D169F Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-D16A3 CRC                   67FA3A91 (1744452241)\n-D16A7 Compressed Size       000004A5 (1189)\n-D16AB Uncompressed Size     00000C5B (3163)\n-D16AF Filename Length       007F (127)\n-D16B1 Extra Length          0000 (0)\n-D16B3 Comment Length        0000 (0)\n-D16B5 Disk Start            0000 (0)\n-D16B7 Int File Attributes   0000 (0)\n+D1CAA Compression Method    0008 (8) 'Deflated'\n+D1CAC Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+D1CB0 CRC                   67FA3A91 (1744452241)\n+D1CB4 Compressed Size       000004A5 (1189)\n+D1CB8 Uncompressed Size     00000C5B (3163)\n+D1CBC Filename Length       007F (127)\n+D1CBE Extra Length          0000 (0)\n+D1CC0 Comment Length        0000 (0)\n+D1CC2 Disk Start            0000 (0)\n+D1CC4 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-D16B9 Ext File Attributes   81A40000 (2175008768)\n+D1CC6 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-D16BD Local Header Offset   00043C6A (277610)\n-D16C1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+D1CCA Local Header Offset   00043C39 (277561)\n+D1CCE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xD16C1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xD1CCE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-D1740 CENTRAL HEADER #361   02014B50 (33639248)\n-D1744 Created Zip Spec      14 (20) '2.0'\n-D1745 Created OS            03 (3) 'Unix'\n-D1746 Extract Zip Spec      14 (20) '2.0'\n-D1747 Extract OS            00 (0) 'MS-DOS'\n-D1748 General Purpose Flag  0800 (2048)\n+D1D4D CENTRAL HEADER #361   02014B50 (33639248)\n+D1D51 Created Zip Spec      14 (20) '2.0'\n+D1D52 Created OS            03 (3) 'Unix'\n+D1D53 Extract Zip Spec      14 (20) '2.0'\n+D1D54 Extract OS            00 (0) 'MS-DOS'\n+D1D55 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-D174A Compression Method    0008 (8) 'Deflated'\n-D174C Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-D1750 CRC                   63513D5C (1666268508)\n-D1754 Compressed Size       000003E5 (997)\n-D1758 Uncompressed Size     000007C0 (1984)\n-D175C Filename Length       007F (127)\n-D175E Extra Length          0000 (0)\n-D1760 Comment Length        0000 (0)\n-D1762 Disk Start            0000 (0)\n-D1764 Int File Attributes   0000 (0)\n+D1D57 Compression Method    0008 (8) 'Deflated'\n+D1D59 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+D1D5D CRC                   63513D5C (1666268508)\n+D1D61 Compressed Size       000003E5 (997)\n+D1D65 Uncompressed Size     000007C0 (1984)\n+D1D69 Filename Length       007F (127)\n+D1D6B Extra Length          0000 (0)\n+D1D6D Comment Length        0000 (0)\n+D1D6F Disk Start            0000 (0)\n+D1D71 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-D1766 Ext File Attributes   81A40000 (2175008768)\n+D1D73 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-D176A Local Header Offset   000441AC (278956)\n-D176E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+D1D77 Local Header Offset   0004417B (278907)\n+D1D7B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xD176E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xD1D7B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-D17ED CENTRAL HEADER #362   02014B50 (33639248)\n-D17F1 Created Zip Spec      14 (20) '2.0'\n-D17F2 Created OS            03 (3) 'Unix'\n-D17F3 Extract Zip Spec      14 (20) '2.0'\n-D17F4 Extract OS            00 (0) 'MS-DOS'\n-D17F5 General Purpose Flag  0800 (2048)\n+D1DFA CENTRAL HEADER #362   02014B50 (33639248)\n+D1DFE Created Zip Spec      14 (20) '2.0'\n+D1DFF Created OS            03 (3) 'Unix'\n+D1E00 Extract Zip Spec      14 (20) '2.0'\n+D1E01 Extract OS            00 (0) 'MS-DOS'\n+D1E02 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-D17F7 Compression Method    0008 (8) 'Deflated'\n-D17F9 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-D17FD CRC                   99929518 (2576520472)\n-D1801 Compressed Size       00000586 (1414)\n-D1805 Uncompressed Size     00000EDA (3802)\n-D1809 Filename Length       0076 (118)\n-D180B Extra Length          0000 (0)\n-D180D Comment Length        0000 (0)\n-D180F Disk Start            0000 (0)\n-D1811 Int File Attributes   0000 (0)\n+D1E04 Compression Method    0008 (8) 'Deflated'\n+D1E06 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+D1E0A CRC                   99929518 (2576520472)\n+D1E0E Compressed Size       00000586 (1414)\n+D1E12 Uncompressed Size     00000EDA (3802)\n+D1E16 Filename Length       0076 (118)\n+D1E18 Extra Length          0000 (0)\n+D1E1A Comment Length        0000 (0)\n+D1E1C Disk Start            0000 (0)\n+D1E1E Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-D1813 Ext File Attributes   81A40000 (2175008768)\n+D1E20 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-D1817 Local Header Offset   0004462E (280110)\n-D181B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+D1E24 Local Header Offset   000445FD (280061)\n+D1E28 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xD181B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xD1E28: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-D1891 CENTRAL HEADER #363   02014B50 (33639248)\n-D1895 Created Zip Spec      14 (20) '2.0'\n-D1896 Created OS            03 (3) 'Unix'\n-D1897 Extract Zip Spec      14 (20) '2.0'\n-D1898 Extract OS            00 (0) 'MS-DOS'\n-D1899 General Purpose Flag  0800 (2048)\n+D1E9E CENTRAL HEADER #363   02014B50 (33639248)\n+D1EA2 Created Zip Spec      14 (20) '2.0'\n+D1EA3 Created OS            03 (3) 'Unix'\n+D1EA4 Extract Zip Spec      14 (20) '2.0'\n+D1EA5 Extract OS            00 (0) 'MS-DOS'\n+D1EA6 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-D189B Compression Method    0008 (8) 'Deflated'\n-D189D Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-D18A1 CRC                   E6BF62E0 (3871302368)\n-D18A5 Compressed Size       000003A3 (931)\n-D18A9 Uncompressed Size     000008F8 (2296)\n-D18AD Filename Length       0074 (116)\n-D18AF Extra Length          0000 (0)\n-D18B1 Comment Length        0000 (0)\n-D18B3 Disk Start            0000 (0)\n-D18B5 Int File Attributes   0000 (0)\n+D1EA8 Compression Method    0008 (8) 'Deflated'\n+D1EAA Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+D1EAE CRC                   E6BF62E0 (3871302368)\n+D1EB2 Compressed Size       000003A3 (931)\n+D1EB6 Uncompressed Size     000008F8 (2296)\n+D1EBA Filename Length       0074 (116)\n+D1EBC Extra Length          0000 (0)\n+D1EBE Comment Length        0000 (0)\n+D1EC0 Disk Start            0000 (0)\n+D1EC2 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-D18B7 Ext File Attributes   81A40000 (2175008768)\n+D1EC4 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-D18BB Local Header Offset   00044C48 (281672)\n-D18BF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+D1EC8 Local Header Offset   00044C17 (281623)\n+D1ECC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xD18BF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xD1ECC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-D1933 CENTRAL HEADER #364   02014B50 (33639248)\n-D1937 Created Zip Spec      14 (20) '2.0'\n-D1938 Created OS            03 (3) 'Unix'\n-D1939 Extract Zip Spec      14 (20) '2.0'\n-D193A Extract OS            00 (0) 'MS-DOS'\n-D193B General Purpose Flag  0800 (2048)\n+D1F40 CENTRAL HEADER #364   02014B50 (33639248)\n+D1F44 Created Zip Spec      14 (20) '2.0'\n+D1F45 Created OS            03 (3) 'Unix'\n+D1F46 Extract Zip Spec      14 (20) '2.0'\n+D1F47 Extract OS            00 (0) 'MS-DOS'\n+D1F48 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-D193D Compression Method    0008 (8) 'Deflated'\n-D193F Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-D1943 CRC                   F05E2331 (4032701233)\n-D1947 Compressed Size       00000408 (1032)\n-D194B Uncompressed Size     00000831 (2097)\n-D194F Filename Length       007B (123)\n-D1951 Extra Length          0000 (0)\n-D1953 Comment Length        0000 (0)\n-D1955 Disk Start            0000 (0)\n-D1957 Int File Attributes   0000 (0)\n+D1F4A Compression Method    0008 (8) 'Deflated'\n+D1F4C Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+D1F50 CRC                   F05E2331 (4032701233)\n+D1F54 Compressed Size       00000408 (1032)\n+D1F58 Uncompressed Size     00000831 (2097)\n+D1F5C Filename Length       007B (123)\n+D1F5E Extra Length          0000 (0)\n+D1F60 Comment Length        0000 (0)\n+D1F62 Disk Start            0000 (0)\n+D1F64 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-D1959 Ext File Attributes   81A40000 (2175008768)\n+D1F66 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-D195D Local Header Offset   0004507D (282749)\n-D1961 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+D1F6A Local Header Offset   0004504C (282700)\n+D1F6E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xD1961: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xD1F6E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-D19DC CENTRAL HEADER #365   02014B50 (33639248)\n-D19E0 Created Zip Spec      14 (20) '2.0'\n-D19E1 Created OS            03 (3) 'Unix'\n-D19E2 Extract Zip Spec      14 (20) '2.0'\n-D19E3 Extract OS            00 (0) 'MS-DOS'\n-D19E4 General Purpose Flag  0800 (2048)\n+D1FE9 CENTRAL HEADER #365   02014B50 (33639248)\n+D1FED Created Zip Spec      14 (20) '2.0'\n+D1FEE Created OS            03 (3) 'Unix'\n+D1FEF Extract Zip Spec      14 (20) '2.0'\n+D1FF0 Extract OS            00 (0) 'MS-DOS'\n+D1FF1 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-D19E6 Compression Method    0008 (8) 'Deflated'\n-D19E8 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-D19EC CRC                   80ED3BA4 (2163030948)\n-D19F0 Compressed Size       0000055C (1372)\n-D19F4 Uncompressed Size     000015D0 (5584)\n-D19F8 Filename Length       0079 (121)\n-D19FA Extra Length          0000 (0)\n-D19FC Comment Length        0000 (0)\n-D19FE Disk Start            0000 (0)\n-D1A00 Int File Attributes   0000 (0)\n+D1FF3 Compression Method    0008 (8) 'Deflated'\n+D1FF5 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+D1FF9 CRC                   80ED3BA4 (2163030948)\n+D1FFD Compressed Size       0000055C (1372)\n+D2001 Uncompressed Size     000015D0 (5584)\n+D2005 Filename Length       0079 (121)\n+D2007 Extra Length          0000 (0)\n+D2009 Comment Length        0000 (0)\n+D200B Disk Start            0000 (0)\n+D200D Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-D1A02 Ext File Attributes   81A40000 (2175008768)\n+D200F 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-D1A06 Local Header Offset   0004551E (283934)\n-D1A0A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+D2013 Local Header Offset   000454ED (283885)\n+D2017 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xD1A0A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xD2017: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-D1A83 CENTRAL HEADER #366   02014B50 (33639248)\n-D1A87 Created Zip Spec      14 (20) '2.0'\n-D1A88 Created OS            03 (3) 'Unix'\n-D1A89 Extract Zip Spec      14 (20) '2.0'\n-D1A8A Extract OS            00 (0) 'MS-DOS'\n-D1A8B General Purpose Flag  0800 (2048)\n+D2090 CENTRAL HEADER #366   02014B50 (33639248)\n+D2094 Created Zip Spec      14 (20) '2.0'\n+D2095 Created OS            03 (3) 'Unix'\n+D2096 Extract Zip Spec      14 (20) '2.0'\n+D2097 Extract OS            00 (0) 'MS-DOS'\n+D2098 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-D1A8D Compression Method    0008 (8) 'Deflated'\n-D1A8F Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-D1A93 CRC                   7018E446 (1880679494)\n-D1A97 Compressed Size       000009A0 (2464)\n-D1A9B Uncompressed Size     00001FAE (8110)\n-D1A9F Filename Length       007F (127)\n-D1AA1 Extra Length          0000 (0)\n-D1AA3 Comment Length        0000 (0)\n-D1AA5 Disk Start            0000 (0)\n-D1AA7 Int File Attributes   0000 (0)\n+D209A Compression Method    0008 (8) 'Deflated'\n+D209C Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+D20A0 CRC                   7018E446 (1880679494)\n+D20A4 Compressed Size       000009A0 (2464)\n+D20A8 Uncompressed Size     00001FAE (8110)\n+D20AC Filename Length       007F (127)\n+D20AE Extra Length          0000 (0)\n+D20B0 Comment Length        0000 (0)\n+D20B2 Disk Start            0000 (0)\n+D20B4 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-D1AA9 Ext File Attributes   81A40000 (2175008768)\n+D20B6 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-D1AAD Local Header Offset   00045B11 (285457)\n-D1AB1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+D20BA Local Header Offset   00045AE0 (285408)\n+D20BE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xD1AB1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xD20BE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-D1B30 CENTRAL HEADER #367   02014B50 (33639248)\n-D1B34 Created Zip Spec      14 (20) '2.0'\n-D1B35 Created OS            03 (3) 'Unix'\n-D1B36 Extract Zip Spec      14 (20) '2.0'\n-D1B37 Extract OS            00 (0) 'MS-DOS'\n-D1B38 General Purpose Flag  0800 (2048)\n+D213D CENTRAL HEADER #367   02014B50 (33639248)\n+D2141 Created Zip Spec      14 (20) '2.0'\n+D2142 Created OS            03 (3) 'Unix'\n+D2143 Extract Zip Spec      14 (20) '2.0'\n+D2144 Extract OS            00 (0) 'MS-DOS'\n+D2145 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-D1B3A Compression Method    0008 (8) 'Deflated'\n-D1B3C Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-D1B40 CRC                   61A0CE5A (1637928538)\n-D1B44 Compressed Size       0000049F (1183)\n-D1B48 Uncompressed Size     000012FA (4858)\n-D1B4C Filename Length       0076 (118)\n-D1B4E Extra Length          0000 (0)\n-D1B50 Comment Length        0000 (0)\n-D1B52 Disk Start            0000 (0)\n-D1B54 Int File Attributes   0000 (0)\n+D2147 Compression Method    0008 (8) 'Deflated'\n+D2149 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+D214D CRC                   61A0CE5A (1637928538)\n+D2151 Compressed Size       0000049F (1183)\n+D2155 Uncompressed Size     000012FA (4858)\n+D2159 Filename Length       0076 (118)\n+D215B Extra Length          0000 (0)\n+D215D Comment Length        0000 (0)\n+D215F Disk Start            0000 (0)\n+D2161 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-D1B56 Ext File Attributes   81A40000 (2175008768)\n+D2163 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-D1B5A Local Header Offset   0004654E (288078)\n-D1B5E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+D2167 Local Header Offset   0004651D (288029)\n+D216B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xD1B5E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xD216B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-D1BD4 CENTRAL HEADER #368   02014B50 (33639248)\n-D1BD8 Created Zip Spec      14 (20) '2.0'\n-D1BD9 Created OS            03 (3) 'Unix'\n-D1BDA Extract Zip Spec      14 (20) '2.0'\n-D1BDB Extract OS            00 (0) 'MS-DOS'\n-D1BDC General Purpose Flag  0800 (2048)\n+D21E1 CENTRAL HEADER #368   02014B50 (33639248)\n+D21E5 Created Zip Spec      14 (20) '2.0'\n+D21E6 Created OS            03 (3) 'Unix'\n+D21E7 Extract Zip Spec      14 (20) '2.0'\n+D21E8 Extract OS            00 (0) 'MS-DOS'\n+D21E9 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-D1BDE Compression Method    0008 (8) 'Deflated'\n-D1BE0 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-D1BE4 CRC                   5A804AEF (1518357231)\n-D1BE8 Compressed Size       00000762 (1890)\n-D1BEC Uncompressed Size     00001311 (4881)\n-D1BF0 Filename Length       0079 (121)\n-D1BF2 Extra Length          0000 (0)\n-D1BF4 Comment Length        0000 (0)\n-D1BF6 Disk Start            0000 (0)\n-D1BF8 Int File Attributes   0000 (0)\n+D21EB Compression Method    0008 (8) 'Deflated'\n+D21ED Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+D21F1 CRC                   5A804AEF (1518357231)\n+D21F5 Compressed Size       00000762 (1890)\n+D21F9 Uncompressed Size     00001311 (4881)\n+D21FD Filename Length       0079 (121)\n+D21FF Extra Length          0000 (0)\n+D2201 Comment Length        0000 (0)\n+D2203 Disk Start            0000 (0)\n+D2205 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-D1BFA Ext File Attributes   81A40000 (2175008768)\n+D2207 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-D1BFE Local Header Offset   00046A81 (289409)\n-D1C02 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+D220B Local Header Offset   00046A50 (289360)\n+D220F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xD1C02: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xD220F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-D1C7B CENTRAL HEADER #369   02014B50 (33639248)\n-D1C7F Created Zip Spec      14 (20) '2.0'\n-D1C80 Created OS            03 (3) 'Unix'\n-D1C81 Extract Zip Spec      14 (20) '2.0'\n-D1C82 Extract OS            00 (0) 'MS-DOS'\n-D1C83 General Purpose Flag  0800 (2048)\n+D2288 CENTRAL HEADER #369   02014B50 (33639248)\n+D228C Created Zip Spec      14 (20) '2.0'\n+D228D Created OS            03 (3) 'Unix'\n+D228E Extract Zip Spec      14 (20) '2.0'\n+D228F Extract OS            00 (0) 'MS-DOS'\n+D2290 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-D1C85 Compression Method    0008 (8) 'Deflated'\n-D1C87 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-D1C8B CRC                   F4A07CA3 (4104158371)\n-D1C8F Compressed Size       00000978 (2424)\n-D1C93 Uncompressed Size     000027E4 (10212)\n-D1C97 Filename Length       0075 (117)\n-D1C99 Extra Length          0000 (0)\n-D1C9B Comment Length        0000 (0)\n-D1C9D Disk Start            0000 (0)\n-D1C9F Int File Attributes   0000 (0)\n+D2292 Compression Method    0008 (8) 'Deflated'\n+D2294 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+D2298 CRC                   F4A07CA3 (4104158371)\n+D229C Compressed Size       00000978 (2424)\n+D22A0 Uncompressed Size     000027E4 (10212)\n+D22A4 Filename Length       0075 (117)\n+D22A6 Extra Length          0000 (0)\n+D22A8 Comment Length        0000 (0)\n+D22AA Disk Start            0000 (0)\n+D22AC Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-D1CA1 Ext File Attributes   81A40000 (2175008768)\n+D22AE 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-D1CA5 Local Header Offset   0004727A (291450)\n-D1CA9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+D22B2 Local Header Offset   00047249 (291401)\n+D22B6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xD1CA9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xD22B6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-D1D1E CENTRAL HEADER #370   02014B50 (33639248)\n-D1D22 Created Zip Spec      14 (20) '2.0'\n-D1D23 Created OS            03 (3) 'Unix'\n-D1D24 Extract Zip Spec      14 (20) '2.0'\n-D1D25 Extract OS            00 (0) 'MS-DOS'\n-D1D26 General Purpose Flag  0800 (2048)\n+D232B CENTRAL HEADER #370   02014B50 (33639248)\n+D232F Created Zip Spec      14 (20) '2.0'\n+D2330 Created OS            03 (3) 'Unix'\n+D2331 Extract Zip Spec      14 (20) '2.0'\n+D2332 Extract OS            00 (0) 'MS-DOS'\n+D2333 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-D1D28 Compression Method    0008 (8) 'Deflated'\n-D1D2A Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-D1D2E CRC                   6E031E40 (1845698112)\n-D1D32 Compressed Size       0000075F (1887)\n-D1D36 Uncompressed Size     00001276 (4726)\n-D1D3A Filename Length       007D (125)\n-D1D3C Extra Length          0000 (0)\n-D1D3E Comment Length        0000 (0)\n-D1D40 Disk Start            0000 (0)\n-D1D42 Int File Attributes   0000 (0)\n+D2335 Compression Method    0008 (8) 'Deflated'\n+D2337 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+D233B CRC                   6E031E40 (1845698112)\n+D233F Compressed Size       0000075F (1887)\n+D2343 Uncompressed Size     00001276 (4726)\n+D2347 Filename Length       007D (125)\n+D2349 Extra Length          0000 (0)\n+D234B Comment Length        0000 (0)\n+D234D Disk Start            0000 (0)\n+D234F Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-D1D44 Ext File Attributes   81A40000 (2175008768)\n+D2351 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-D1D48 Local Header Offset   00047C85 (294021)\n-D1D4C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+D2355 Local Header Offset   00047C54 (293972)\n+D2359 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xD1D4C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xD2359: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-D1DC9 CENTRAL HEADER #371   02014B50 (33639248)\n-D1DCD Created Zip Spec      14 (20) '2.0'\n-D1DCE Created OS            03 (3) 'Unix'\n-D1DCF Extract Zip Spec      14 (20) '2.0'\n-D1DD0 Extract OS            00 (0) 'MS-DOS'\n-D1DD1 General Purpose Flag  0800 (2048)\n+D23D6 CENTRAL HEADER #371   02014B50 (33639248)\n+D23DA Created Zip Spec      14 (20) '2.0'\n+D23DB Created OS            03 (3) 'Unix'\n+D23DC Extract Zip Spec      14 (20) '2.0'\n+D23DD Extract OS            00 (0) 'MS-DOS'\n+D23DE General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-D1DD3 Compression Method    0008 (8) 'Deflated'\n-D1DD5 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-D1DD9 CRC                   5987930A (1502057226)\n-D1DDD Compressed Size       00000501 (1281)\n-D1DE1 Uncompressed Size     00000BDE (3038)\n-D1DE5 Filename Length       007C (124)\n-D1DE7 Extra Length          0000 (0)\n-D1DE9 Comment Length        0000 (0)\n-D1DEB Disk Start            0000 (0)\n-D1DED Int File Attributes   0000 (0)\n+D23E0 Compression Method    0008 (8) 'Deflated'\n+D23E2 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+D23E6 CRC                   5987930A (1502057226)\n+D23EA Compressed Size       00000501 (1281)\n+D23EE Uncompressed Size     00000BDE (3038)\n+D23F2 Filename Length       007C (124)\n+D23F4 Extra Length          0000 (0)\n+D23F6 Comment Length        0000 (0)\n+D23F8 Disk Start            0000 (0)\n+D23FA Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-D1DEF Ext File Attributes   81A40000 (2175008768)\n+D23FC 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-D1DF3 Local Header Offset   0004847F (296063)\n-D1DF7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+D2400 Local Header Offset   0004844E (296014)\n+D2404 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xD1DF7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xD2404: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-D1E73 CENTRAL HEADER #372   02014B50 (33639248)\n-D1E77 Created Zip Spec      14 (20) '2.0'\n-D1E78 Created OS            03 (3) 'Unix'\n-D1E79 Extract Zip Spec      14 (20) '2.0'\n-D1E7A Extract OS            00 (0) 'MS-DOS'\n-D1E7B General Purpose Flag  0800 (2048)\n+D2480 CENTRAL HEADER #372   02014B50 (33639248)\n+D2484 Created Zip Spec      14 (20) '2.0'\n+D2485 Created OS            03 (3) 'Unix'\n+D2486 Extract Zip Spec      14 (20) '2.0'\n+D2487 Extract OS            00 (0) 'MS-DOS'\n+D2488 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-D1E7D Compression Method    0008 (8) 'Deflated'\n-D1E7F Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-D1E83 CRC                   CA93F7B9 (3398694841)\n-D1E87 Compressed Size       000003F5 (1013)\n-D1E8B Uncompressed Size     000008CF (2255)\n-D1E8F Filename Length       007D (125)\n-D1E91 Extra Length          0000 (0)\n-D1E93 Comment Length        0000 (0)\n-D1E95 Disk Start            0000 (0)\n-D1E97 Int File Attributes   0000 (0)\n+D248A Compression Method    0008 (8) 'Deflated'\n+D248C Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+D2490 CRC                   CA93F7B9 (3398694841)\n+D2494 Compressed Size       000003F5 (1013)\n+D2498 Uncompressed Size     000008CF (2255)\n+D249C Filename Length       007D (125)\n+D249E Extra Length          0000 (0)\n+D24A0 Comment Length        0000 (0)\n+D24A2 Disk Start            0000 (0)\n+D24A4 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-D1E99 Ext File Attributes   81A40000 (2175008768)\n+D24A6 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-D1E9D Local Header Offset   00048A1A (297498)\n-D1EA1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+D24AA Local Header Offset   000489E9 (297449)\n+D24AE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xD1EA1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xD24AE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-D1F1E CENTRAL HEADER #373   02014B50 (33639248)\n-D1F22 Created Zip Spec      14 (20) '2.0'\n-D1F23 Created OS            03 (3) 'Unix'\n-D1F24 Extract Zip Spec      14 (20) '2.0'\n-D1F25 Extract OS            00 (0) 'MS-DOS'\n-D1F26 General Purpose Flag  0800 (2048)\n+D252B CENTRAL HEADER #373   02014B50 (33639248)\n+D252F Created Zip Spec      14 (20) '2.0'\n+D2530 Created OS            03 (3) 'Unix'\n+D2531 Extract Zip Spec      14 (20) '2.0'\n+D2532 Extract OS            00 (0) 'MS-DOS'\n+D2533 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-D1F28 Compression Method    0008 (8) 'Deflated'\n-D1F2A Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-D1F2E CRC                   673E5975 (1732139381)\n-D1F32 Compressed Size       00000507 (1287)\n-D1F36 Uncompressed Size     00000CA9 (3241)\n-D1F3A Filename Length       007B (123)\n-D1F3C Extra Length          0000 (0)\n-D1F3E Comment Length        0000 (0)\n-D1F40 Disk Start            0000 (0)\n-D1F42 Int File Attributes   0000 (0)\n+D2535 Compression Method    0008 (8) 'Deflated'\n+D2537 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+D253B CRC                   673E5975 (1732139381)\n+D253F Compressed Size       00000507 (1287)\n+D2543 Uncompressed Size     00000CA9 (3241)\n+D2547 Filename Length       007B (123)\n+D2549 Extra Length          0000 (0)\n+D254B Comment Length        0000 (0)\n+D254D Disk Start            0000 (0)\n+D254F Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-D1F44 Ext File Attributes   81A40000 (2175008768)\n+D2551 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-D1F48 Local Header Offset   00048EAA (298666)\n-D1F4C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+D2555 Local Header Offset   00048E79 (298617)\n+D2559 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xD1F4C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xD2559: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-D1FC7 CENTRAL HEADER #374   02014B50 (33639248)\n-D1FCB Created Zip Spec      14 (20) '2.0'\n-D1FCC Created OS            03 (3) 'Unix'\n-D1FCD Extract Zip Spec      14 (20) '2.0'\n-D1FCE Extract OS            00 (0) 'MS-DOS'\n-D1FCF General Purpose Flag  0800 (2048)\n+D25D4 CENTRAL HEADER #374   02014B50 (33639248)\n+D25D8 Created Zip Spec      14 (20) '2.0'\n+D25D9 Created OS            03 (3) 'Unix'\n+D25DA Extract Zip Spec      14 (20) '2.0'\n+D25DB Extract OS            00 (0) 'MS-DOS'\n+D25DC General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-D1FD1 Compression Method    0008 (8) 'Deflated'\n-D1FD3 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-D1FD7 CRC                   2D1E752C (756970796)\n-D1FDB Compressed Size       0000177A (6010)\n-D1FDF Uncompressed Size     00005038 (20536)\n-D1FE3 Filename Length       0079 (121)\n-D1FE5 Extra Length          0000 (0)\n-D1FE7 Comment Length        0000 (0)\n-D1FE9 Disk Start            0000 (0)\n-D1FEB Int File Attributes   0000 (0)\n+D25DE Compression Method    0008 (8) 'Deflated'\n+D25E0 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+D25E4 CRC                   2D1E752C (756970796)\n+D25E8 Compressed Size       0000177A (6010)\n+D25EC Uncompressed Size     00005038 (20536)\n+D25F0 Filename Length       0079 (121)\n+D25F2 Extra Length          0000 (0)\n+D25F4 Comment Length        0000 (0)\n+D25F6 Disk Start            0000 (0)\n+D25F8 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-D1FED Ext File Attributes   81A40000 (2175008768)\n+D25FA 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-D1FF1 Local Header Offset   0004944A (300106)\n-D1FF5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+D25FE Local Header Offset   00049419 (300057)\n+D2602 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xD1FF5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xD2602: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-D206E CENTRAL HEADER #375   02014B50 (33639248)\n-D2072 Created Zip Spec      14 (20) '2.0'\n-D2073 Created OS            03 (3) 'Unix'\n-D2074 Extract Zip Spec      14 (20) '2.0'\n-D2075 Extract OS            00 (0) 'MS-DOS'\n-D2076 General Purpose Flag  0800 (2048)\n+D267B CENTRAL HEADER #375   02014B50 (33639248)\n+D267F Created Zip Spec      14 (20) '2.0'\n+D2680 Created OS            03 (3) 'Unix'\n+D2681 Extract Zip Spec      14 (20) '2.0'\n+D2682 Extract OS            00 (0) 'MS-DOS'\n+D2683 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-D2078 Compression Method    0008 (8) 'Deflated'\n-D207A Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-D207E CRC                   DB187B38 (3675814712)\n-D2082 Compressed Size       00000A58 (2648)\n-D2086 Uncompressed Size     00001A85 (6789)\n-D208A Filename Length       0072 (114)\n-D208C Extra Length          0000 (0)\n-D208E Comment Length        0000 (0)\n-D2090 Disk Start            0000 (0)\n-D2092 Int File Attributes   0000 (0)\n+D2685 Compression Method    0008 (8) 'Deflated'\n+D2687 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+D268B CRC                   DB187B38 (3675814712)\n+D268F Compressed Size       00000A58 (2648)\n+D2693 Uncompressed Size     00001A85 (6789)\n+D2697 Filename Length       0072 (114)\n+D2699 Extra Length          0000 (0)\n+D269B Comment Length        0000 (0)\n+D269D Disk Start            0000 (0)\n+D269F Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-D2094 Ext File Attributes   81A40000 (2175008768)\n+D26A1 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-D2098 Local Header Offset   0004AC5B (306267)\n-D209C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+D26A5 Local Header Offset   0004AC2A (306218)\n+D26A9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xD209C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xD26A9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-D210E CENTRAL HEADER #376   02014B50 (33639248)\n-D2112 Created Zip Spec      14 (20) '2.0'\n-D2113 Created OS            03 (3) 'Unix'\n-D2114 Extract Zip Spec      14 (20) '2.0'\n-D2115 Extract OS            00 (0) 'MS-DOS'\n-D2116 General Purpose Flag  0800 (2048)\n+D271B CENTRAL HEADER #376   02014B50 (33639248)\n+D271F Created Zip Spec      14 (20) '2.0'\n+D2720 Created OS            03 (3) 'Unix'\n+D2721 Extract Zip Spec      14 (20) '2.0'\n+D2722 Extract OS            00 (0) 'MS-DOS'\n+D2723 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-D2118 Compression Method    0008 (8) 'Deflated'\n-D211A Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-D211E CRC                   CD183667 (3440916071)\n-D2122 Compressed Size       00000A45 (2629)\n-D2126 Uncompressed Size     00001A6E (6766)\n-D212A Filename Length       0073 (115)\n-D212C Extra Length          0000 (0)\n-D212E Comment Length        0000 (0)\n-D2130 Disk Start            0000 (0)\n-D2132 Int File Attributes   0000 (0)\n+D2725 Compression Method    0008 (8) 'Deflated'\n+D2727 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+D272B CRC                   CD183667 (3440916071)\n+D272F Compressed Size       00000A45 (2629)\n+D2733 Uncompressed Size     00001A6E (6766)\n+D2737 Filename Length       0073 (115)\n+D2739 Extra Length          0000 (0)\n+D273B Comment Length        0000 (0)\n+D273D Disk Start            0000 (0)\n+D273F Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-D2134 Ext File Attributes   81A40000 (2175008768)\n+D2741 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-D2138 Local Header Offset   0004B743 (309059)\n-D213C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+D2745 Local Header Offset   0004B712 (309010)\n+D2749 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xD213C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xD2749: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-D21AF CENTRAL HEADER #377   02014B50 (33639248)\n-D21B3 Created Zip Spec      14 (20) '2.0'\n-D21B4 Created OS            03 (3) 'Unix'\n-D21B5 Extract Zip Spec      14 (20) '2.0'\n-D21B6 Extract OS            00 (0) 'MS-DOS'\n-D21B7 General Purpose Flag  0800 (2048)\n+D27BC CENTRAL HEADER #377   02014B50 (33639248)\n+D27C0 Created Zip Spec      14 (20) '2.0'\n+D27C1 Created OS            03 (3) 'Unix'\n+D27C2 Extract Zip Spec      14 (20) '2.0'\n+D27C3 Extract OS            00 (0) 'MS-DOS'\n+D27C4 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-D21B9 Compression Method    0008 (8) 'Deflated'\n-D21BB Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-D21BF CRC                   0C7DD276 (209572470)\n-D21C3 Compressed Size       00000A5A (2650)\n-D21C7 Uncompressed Size     00001A92 (6802)\n-D21CB Filename Length       0073 (115)\n-D21CD Extra Length          0000 (0)\n-D21CF Comment Length        0000 (0)\n-D21D1 Disk Start            0000 (0)\n-D21D3 Int File Attributes   0000 (0)\n+D27C6 Compression Method    0008 (8) 'Deflated'\n+D27C8 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+D27CC CRC                   0C7DD276 (209572470)\n+D27D0 Compressed Size       00000A5A (2650)\n+D27D4 Uncompressed Size     00001A92 (6802)\n+D27D8 Filename Length       0073 (115)\n+D27DA Extra Length          0000 (0)\n+D27DC Comment Length        0000 (0)\n+D27DE Disk Start            0000 (0)\n+D27E0 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-D21D5 Ext File Attributes   81A40000 (2175008768)\n+D27E2 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-D21D9 Local Header Offset   0004C219 (311833)\n-D21DD Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+D27E6 Local Header Offset   0004C1E8 (311784)\n+D27EA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xD21DD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xD27EA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-D2250 CENTRAL HEADER #378   02014B50 (33639248)\n-D2254 Created Zip Spec      14 (20) '2.0'\n-D2255 Created OS            03 (3) 'Unix'\n-D2256 Extract Zip Spec      14 (20) '2.0'\n-D2257 Extract OS            00 (0) 'MS-DOS'\n-D2258 General Purpose Flag  0800 (2048)\n+D285D CENTRAL HEADER #378   02014B50 (33639248)\n+D2861 Created Zip Spec      14 (20) '2.0'\n+D2862 Created OS            03 (3) 'Unix'\n+D2863 Extract Zip Spec      14 (20) '2.0'\n+D2864 Extract OS            00 (0) 'MS-DOS'\n+D2865 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-D225A Compression Method    0008 (8) 'Deflated'\n-D225C Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-D2260 CRC                   60EA12C2 (1625952962)\n-D2264 Compressed Size       000008AB (2219)\n-D2268 Uncompressed Size     00001733 (5939)\n-D226C Filename Length       0074 (116)\n-D226E Extra Length          0000 (0)\n-D2270 Comment Length        0000 (0)\n-D2272 Disk Start            0000 (0)\n-D2274 Int File Attributes   0000 (0)\n+D2867 Compression Method    0008 (8) 'Deflated'\n+D2869 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+D286D CRC                   60EA12C2 (1625952962)\n+D2871 Compressed Size       000008AB (2219)\n+D2875 Uncompressed Size     00001733 (5939)\n+D2879 Filename Length       0074 (116)\n+D287B Extra Length          0000 (0)\n+D287D Comment Length        0000 (0)\n+D287F Disk Start            0000 (0)\n+D2881 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-D2276 Ext File Attributes   81A40000 (2175008768)\n+D2883 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-D227A Local Header Offset   0004CD04 (314628)\n-D227E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+D2887 Local Header Offset   0004CCD3 (314579)\n+D288B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xD227E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xD288B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-D22F2 CENTRAL HEADER #379   02014B50 (33639248)\n-D22F6 Created Zip Spec      14 (20) '2.0'\n-D22F7 Created OS            03 (3) 'Unix'\n-D22F8 Extract Zip Spec      14 (20) '2.0'\n-D22F9 Extract OS            00 (0) 'MS-DOS'\n-D22FA General Purpose Flag  0800 (2048)\n+D28FF CENTRAL HEADER #379   02014B50 (33639248)\n+D2903 Created Zip Spec      14 (20) '2.0'\n+D2904 Created OS            03 (3) 'Unix'\n+D2905 Extract Zip Spec      14 (20) '2.0'\n+D2906 Extract OS            00 (0) 'MS-DOS'\n+D2907 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-D22FC Compression Method    0008 (8) 'Deflated'\n-D22FE Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-D2302 CRC                   4BB1EABD (1269951165)\n-D2306 Compressed Size       00000764 (1892)\n-D230A Uncompressed Size     0000167D (5757)\n-D230E Filename Length       0077 (119)\n-D2310 Extra Length          0000 (0)\n-D2312 Comment Length        0000 (0)\n-D2314 Disk Start            0000 (0)\n-D2316 Int File Attributes   0000 (0)\n+D2909 Compression Method    0008 (8) 'Deflated'\n+D290B Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+D290F CRC                   4BB1EABD (1269951165)\n+D2913 Compressed Size       00000764 (1892)\n+D2917 Uncompressed Size     0000167D (5757)\n+D291B Filename Length       0077 (119)\n+D291D Extra Length          0000 (0)\n+D291F Comment Length        0000 (0)\n+D2921 Disk Start            0000 (0)\n+D2923 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-D2318 Ext File Attributes   81A40000 (2175008768)\n+D2925 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-D231C Local Header Offset   0004D641 (316993)\n-D2320 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+D2929 Local Header Offset   0004D610 (316944)\n+D292D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xD2320: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xD292D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-D2397 CENTRAL HEADER #380   02014B50 (33639248)\n-D239B Created Zip Spec      14 (20) '2.0'\n-D239C Created OS            03 (3) 'Unix'\n-D239D Extract Zip Spec      14 (20) '2.0'\n-D239E Extract OS            00 (0) 'MS-DOS'\n-D239F General Purpose Flag  0800 (2048)\n+D29A4 CENTRAL HEADER #380   02014B50 (33639248)\n+D29A8 Created Zip Spec      14 (20) '2.0'\n+D29A9 Created OS            03 (3) 'Unix'\n+D29AA Extract Zip Spec      14 (20) '2.0'\n+D29AB Extract OS            00 (0) 'MS-DOS'\n+D29AC General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-D23A1 Compression Method    0008 (8) 'Deflated'\n-D23A3 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-D23A7 CRC                   A18A8EB9 (2710212281)\n-D23AB Compressed Size       000011B4 (4532)\n-D23AF Uncompressed Size     0000328A (12938)\n-D23B3 Filename Length       0077 (119)\n-D23B5 Extra Length          0000 (0)\n-D23B7 Comment Length        0000 (0)\n-D23B9 Disk Start            0000 (0)\n-D23BB Int File Attributes   0000 (0)\n+D29AE Compression Method    0008 (8) 'Deflated'\n+D29B0 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+D29B4 CRC                   A18A8EB9 (2710212281)\n+D29B8 Compressed Size       000011B4 (4532)\n+D29BC Uncompressed Size     0000328A (12938)\n+D29C0 Filename Length       0077 (119)\n+D29C2 Extra Length          0000 (0)\n+D29C4 Comment Length        0000 (0)\n+D29C6 Disk Start            0000 (0)\n+D29C8 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-D23BD Ext File Attributes   81A40000 (2175008768)\n+D29CA 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-D23C1 Local Header Offset   0004DE3A (319034)\n-D23C5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+D29CE Local Header Offset   0004DE09 (318985)\n+D29D2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xD23C5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xD29D2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-D243C CENTRAL HEADER #381   02014B50 (33639248)\n-D2440 Created Zip Spec      14 (20) '2.0'\n-D2441 Created OS            03 (3) 'Unix'\n-D2442 Extract Zip Spec      14 (20) '2.0'\n-D2443 Extract OS            00 (0) 'MS-DOS'\n-D2444 General Purpose Flag  0800 (2048)\n+D2A49 CENTRAL HEADER #381   02014B50 (33639248)\n+D2A4D Created Zip Spec      14 (20) '2.0'\n+D2A4E Created OS            03 (3) 'Unix'\n+D2A4F Extract Zip Spec      14 (20) '2.0'\n+D2A50 Extract OS            00 (0) 'MS-DOS'\n+D2A51 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-D2446 Compression Method    0008 (8) 'Deflated'\n-D2448 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-D244C CRC                   B7B762D6 (3082248918)\n-D2450 Compressed Size       0000132C (4908)\n-D2454 Uncompressed Size     00003879 (14457)\n-D2458 Filename Length       0076 (118)\n-D245A Extra Length          0000 (0)\n-D245C Comment Length        0000 (0)\n-D245E Disk Start            0000 (0)\n-D2460 Int File Attributes   0000 (0)\n+D2A53 Compression Method    0008 (8) 'Deflated'\n+D2A55 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+D2A59 CRC                   B7B762D6 (3082248918)\n+D2A5D Compressed Size       0000132C (4908)\n+D2A61 Uncompressed Size     00003879 (14457)\n+D2A65 Filename Length       0076 (118)\n+D2A67 Extra Length          0000 (0)\n+D2A69 Comment Length        0000 (0)\n+D2A6B Disk Start            0000 (0)\n+D2A6D Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-D2462 Ext File Attributes   81A40000 (2175008768)\n+D2A6F 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-D2466 Local Header Offset   0004F083 (323715)\n-D246A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+D2A73 Local Header Offset   0004F052 (323666)\n+D2A77 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xD246A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xD2A77: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-D24E0 CENTRAL HEADER #382   02014B50 (33639248)\n-D24E4 Created Zip Spec      14 (20) '2.0'\n-D24E5 Created OS            03 (3) 'Unix'\n-D24E6 Extract Zip Spec      14 (20) '2.0'\n-D24E7 Extract OS            00 (0) 'MS-DOS'\n-D24E8 General Purpose Flag  0800 (2048)\n+D2AED CENTRAL HEADER #382   02014B50 (33639248)\n+D2AF1 Created Zip Spec      14 (20) '2.0'\n+D2AF2 Created OS            03 (3) 'Unix'\n+D2AF3 Extract Zip Spec      14 (20) '2.0'\n+D2AF4 Extract OS            00 (0) 'MS-DOS'\n+D2AF5 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-D24EA Compression Method    0008 (8) 'Deflated'\n-D24EC Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-D24F0 CRC                   A2B9D29A (2730087066)\n-D24F4 Compressed Size       00000B19 (2841)\n-D24F8 Uncompressed Size     00002150 (8528)\n-D24FC Filename Length       007A (122)\n-D24FE Extra Length          0000 (0)\n-D2500 Comment Length        0000 (0)\n-D2502 Disk Start            0000 (0)\n-D2504 Int File Attributes   0000 (0)\n+D2AF7 Compression Method    0008 (8) 'Deflated'\n+D2AF9 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+D2AFD CRC                   A2B9D29A (2730087066)\n+D2B01 Compressed Size       00000B19 (2841)\n+D2B05 Uncompressed Size     00002150 (8528)\n+D2B09 Filename Length       007A (122)\n+D2B0B Extra Length          0000 (0)\n+D2B0D Comment Length        0000 (0)\n+D2B0F Disk Start            0000 (0)\n+D2B11 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-D2506 Ext File Attributes   81A40000 (2175008768)\n+D2B13 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-D250A Local Header Offset   00050443 (328771)\n-D250E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+D2B17 Local Header Offset   00050412 (328722)\n+D2B1B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xD250E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xD2B1B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-D2588 CENTRAL HEADER #383   02014B50 (33639248)\n-D258C Created Zip Spec      14 (20) '2.0'\n-D258D Created OS            03 (3) 'Unix'\n-D258E Extract Zip Spec      14 (20) '2.0'\n-D258F Extract OS            00 (0) 'MS-DOS'\n-D2590 General Purpose Flag  0800 (2048)\n+D2B95 CENTRAL HEADER #383   02014B50 (33639248)\n+D2B99 Created Zip Spec      14 (20) '2.0'\n+D2B9A Created OS            03 (3) 'Unix'\n+D2B9B Extract Zip Spec      14 (20) '2.0'\n+D2B9C Extract OS            00 (0) 'MS-DOS'\n+D2B9D General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-D2592 Compression Method    0008 (8) 'Deflated'\n-D2594 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-D2598 CRC                   C4FC7EA2 (3304881826)\n-D259C Compressed Size       00000790 (1936)\n-D25A0 Uncompressed Size     000011DC (4572)\n-D25A4 Filename Length       0073 (115)\n-D25A6 Extra Length          0000 (0)\n-D25A8 Comment Length        0000 (0)\n-D25AA Disk Start            0000 (0)\n-D25AC Int File Attributes   0000 (0)\n+D2B9F Compression Method    0008 (8) 'Deflated'\n+D2BA1 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+D2BA5 CRC                   C4FC7EA2 (3304881826)\n+D2BA9 Compressed Size       00000790 (1936)\n+D2BAD Uncompressed Size     000011DC (4572)\n+D2BB1 Filename Length       0073 (115)\n+D2BB3 Extra Length          0000 (0)\n+D2BB5 Comment Length        0000 (0)\n+D2BB7 Disk Start            0000 (0)\n+D2BB9 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-D25AE Ext File Attributes   81A40000 (2175008768)\n+D2BBB 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-D25B2 Local Header Offset   00050FF4 (331764)\n-D25B6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+D2BBF Local Header Offset   00050FC3 (331715)\n+D2BC3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xD25B6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xD2BC3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-D2629 CENTRAL HEADER #384   02014B50 (33639248)\n-D262D Created Zip Spec      14 (20) '2.0'\n-D262E Created OS            03 (3) 'Unix'\n-D262F Extract Zip Spec      14 (20) '2.0'\n-D2630 Extract OS            00 (0) 'MS-DOS'\n-D2631 General Purpose Flag  0800 (2048)\n+D2C36 CENTRAL HEADER #384   02014B50 (33639248)\n+D2C3A Created Zip Spec      14 (20) '2.0'\n+D2C3B Created OS            03 (3) 'Unix'\n+D2C3C Extract Zip Spec      14 (20) '2.0'\n+D2C3D Extract OS            00 (0) 'MS-DOS'\n+D2C3E General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-D2633 Compression Method    0008 (8) 'Deflated'\n-D2635 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-D2639 CRC                   EE30A8D8 (3996166360)\n-D263D Compressed Size       00001911 (6417)\n-D2641 Uncompressed Size     000072FB (29435)\n-D2645 Filename Length       0076 (118)\n-D2647 Extra Length          0000 (0)\n-D2649 Comment Length        0000 (0)\n-D264B Disk Start            0000 (0)\n-D264D Int File Attributes   0000 (0)\n+D2C40 Compression Method    0008 (8) 'Deflated'\n+D2C42 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+D2C46 CRC                   EE30A8D8 (3996166360)\n+D2C4A Compressed Size       00001911 (6417)\n+D2C4E Uncompressed Size     000072FB (29435)\n+D2C52 Filename Length       0076 (118)\n+D2C54 Extra Length          0000 (0)\n+D2C56 Comment Length        0000 (0)\n+D2C58 Disk Start            0000 (0)\n+D2C5A Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-D264F Ext File Attributes   81A40000 (2175008768)\n+D2C5C 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-D2653 Local Header Offset   00051815 (333845)\n-D2657 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+D2C60 Local Header Offset   000517E4 (333796)\n+D2C64 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xD2657: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xD2C64: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-D26CD CENTRAL HEADER #385   02014B50 (33639248)\n-D26D1 Created Zip Spec      14 (20) '2.0'\n-D26D2 Created OS            03 (3) 'Unix'\n-D26D3 Extract Zip Spec      14 (20) '2.0'\n-D26D4 Extract OS            00 (0) 'MS-DOS'\n-D26D5 General Purpose Flag  0800 (2048)\n+D2CDA CENTRAL HEADER #385   02014B50 (33639248)\n+D2CDE Created Zip Spec      14 (20) '2.0'\n+D2CDF Created OS            03 (3) 'Unix'\n+D2CE0 Extract Zip Spec      14 (20) '2.0'\n+D2CE1 Extract OS            00 (0) 'MS-DOS'\n+D2CE2 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-D26D7 Compression Method    0008 (8) 'Deflated'\n-D26D9 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-D26DD CRC                   EA36353C (3929421116)\n-D26E1 Compressed Size       0000104B (4171)\n-D26E5 Uncompressed Size     0000480E (18446)\n-D26E9 Filename Length       007C (124)\n-D26EB Extra Length          0000 (0)\n-D26ED Comment Length        0000 (0)\n-D26EF Disk Start            0000 (0)\n-D26F1 Int File Attributes   0000 (0)\n+D2CE4 Compression Method    0008 (8) 'Deflated'\n+D2CE6 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+D2CEA CRC                   EA36353C (3929421116)\n+D2CEE Compressed Size       0000104B (4171)\n+D2CF2 Uncompressed Size     0000480E (18446)\n+D2CF6 Filename Length       007C (124)\n+D2CF8 Extra Length          0000 (0)\n+D2CFA Comment Length        0000 (0)\n+D2CFC Disk Start            0000 (0)\n+D2CFE Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-D26F3 Ext File Attributes   81A40000 (2175008768)\n+D2D00 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-D26F7 Local Header Offset   000531BA (340410)\n-D26FB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+D2D04 Local Header Offset   00053189 (340361)\n+D2D08 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xD26FB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xD2D08: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-D2777 CENTRAL HEADER #386   02014B50 (33639248)\n-D277B Created Zip Spec      14 (20) '2.0'\n-D277C Created OS            03 (3) 'Unix'\n-D277D Extract Zip Spec      14 (20) '2.0'\n-D277E Extract OS            00 (0) 'MS-DOS'\n-D277F General Purpose Flag  0800 (2048)\n+D2D84 CENTRAL HEADER #386   02014B50 (33639248)\n+D2D88 Created Zip Spec      14 (20) '2.0'\n+D2D89 Created OS            03 (3) 'Unix'\n+D2D8A Extract Zip Spec      14 (20) '2.0'\n+D2D8B Extract OS            00 (0) 'MS-DOS'\n+D2D8C General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-D2781 Compression Method    0008 (8) 'Deflated'\n-D2783 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-D2787 CRC                   CA474DE0 (3393670624)\n-D278B Compressed Size       0000039D (925)\n-D278F Uncompressed Size     000007B6 (1974)\n-D2793 Filename Length       007B (123)\n-D2795 Extra Length          0000 (0)\n-D2797 Comment Length        0000 (0)\n-D2799 Disk Start            0000 (0)\n-D279B Int File Attributes   0000 (0)\n+D2D8E Compression Method    0008 (8) 'Deflated'\n+D2D90 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+D2D94 CRC                   CA474DE0 (3393670624)\n+D2D98 Compressed Size       0000039D (925)\n+D2D9C Uncompressed Size     000007B6 (1974)\n+D2DA0 Filename Length       007B (123)\n+D2DA2 Extra Length          0000 (0)\n+D2DA4 Comment Length        0000 (0)\n+D2DA6 Disk Start            0000 (0)\n+D2DA8 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-D279D Ext File Attributes   81A40000 (2175008768)\n+D2DAA 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-D27A1 Local Header Offset   0005429F (344735)\n-D27A5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+D2DAE Local Header Offset   0005426E (344686)\n+D2DB2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xD27A5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xD2DB2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-D2820 CENTRAL HEADER #387   02014B50 (33639248)\n-D2824 Created Zip Spec      14 (20) '2.0'\n-D2825 Created OS            03 (3) 'Unix'\n-D2826 Extract Zip Spec      14 (20) '2.0'\n-D2827 Extract OS            00 (0) 'MS-DOS'\n-D2828 General Purpose Flag  0800 (2048)\n+D2E2D CENTRAL HEADER #387   02014B50 (33639248)\n+D2E31 Created Zip Spec      14 (20) '2.0'\n+D2E32 Created OS            03 (3) 'Unix'\n+D2E33 Extract Zip Spec      14 (20) '2.0'\n+D2E34 Extract OS            00 (0) 'MS-DOS'\n+D2E35 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-D282A Compression Method    0008 (8) 'Deflated'\n-D282C Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-D2830 CRC                   A19F99D4 (2711591380)\n-D2834 Compressed Size       0000065E (1630)\n-D2838 Uncompressed Size     000011CB (4555)\n-D283C Filename Length       0077 (119)\n-D283E Extra Length          0000 (0)\n-D2840 Comment Length        0000 (0)\n-D2842 Disk Start            0000 (0)\n-D2844 Int File Attributes   0000 (0)\n+D2E37 Compression Method    0008 (8) 'Deflated'\n+D2E39 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+D2E3D CRC                   A19F99D4 (2711591380)\n+D2E41 Compressed Size       0000065E (1630)\n+D2E45 Uncompressed Size     000011CB (4555)\n+D2E49 Filename Length       0077 (119)\n+D2E4B Extra Length          0000 (0)\n+D2E4D Comment Length        0000 (0)\n+D2E4F Disk Start            0000 (0)\n+D2E51 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-D2846 Ext File Attributes   81A40000 (2175008768)\n+D2E53 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-D284A Local Header Offset   000546D5 (345813)\n-D284E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+D2E57 Local Header Offset   000546A4 (345764)\n+D2E5B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xD284E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xD2E5B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-D28C5 CENTRAL HEADER #388   02014B50 (33639248)\n-D28C9 Created Zip Spec      14 (20) '2.0'\n-D28CA Created OS            03 (3) 'Unix'\n-D28CB Extract Zip Spec      14 (20) '2.0'\n-D28CC Extract OS            00 (0) 'MS-DOS'\n-D28CD General Purpose Flag  0800 (2048)\n+D2ED2 CENTRAL HEADER #388   02014B50 (33639248)\n+D2ED6 Created Zip Spec      14 (20) '2.0'\n+D2ED7 Created OS            03 (3) 'Unix'\n+D2ED8 Extract Zip Spec      14 (20) '2.0'\n+D2ED9 Extract OS            00 (0) 'MS-DOS'\n+D2EDA General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-D28CF Compression Method    0008 (8) 'Deflated'\n-D28D1 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-D28D5 CRC                   7573E84B (1970530379)\n-D28D9 Compressed Size       00000ED9 (3801)\n-D28DD Uncompressed Size     0000284F (10319)\n-D28E1 Filename Length       0073 (115)\n-D28E3 Extra Length          0000 (0)\n-D28E5 Comment Length        0000 (0)\n-D28E7 Disk Start            0000 (0)\n-D28E9 Int File Attributes   0000 (0)\n+D2EDC Compression Method    0008 (8) 'Deflated'\n+D2EDE Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+D2EE2 CRC                   7573E84B (1970530379)\n+D2EE6 Compressed Size       00000ED9 (3801)\n+D2EEA Uncompressed Size     0000284F (10319)\n+D2EEE Filename Length       0073 (115)\n+D2EF0 Extra Length          0000 (0)\n+D2EF2 Comment Length        0000 (0)\n+D2EF4 Disk Start            0000 (0)\n+D2EF6 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-D28EB Ext File Attributes   81A40000 (2175008768)\n+D2EF8 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-D28EF Local Header Offset   00054DC8 (347592)\n-D28F3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+D2EFC Local Header Offset   00054D97 (347543)\n+D2F00 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xD28F3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xD2F00: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-D2966 CENTRAL HEADER #389   02014B50 (33639248)\n-D296A Created Zip Spec      14 (20) '2.0'\n-D296B Created OS            03 (3) 'Unix'\n-D296C Extract Zip Spec      14 (20) '2.0'\n-D296D Extract OS            00 (0) 'MS-DOS'\n-D296E General Purpose Flag  0800 (2048)\n+D2F73 CENTRAL HEADER #389   02014B50 (33639248)\n+D2F77 Created Zip Spec      14 (20) '2.0'\n+D2F78 Created OS            03 (3) 'Unix'\n+D2F79 Extract Zip Spec      14 (20) '2.0'\n+D2F7A Extract OS            00 (0) 'MS-DOS'\n+D2F7B General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-D2970 Compression Method    0008 (8) 'Deflated'\n-D2972 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-D2976 CRC                   131CB9D8 (320649688)\n-D297A Compressed Size       00000B4D (2893)\n-D297E Uncompressed Size     00002777 (10103)\n-D2982 Filename Length       0077 (119)\n-D2984 Extra Length          0000 (0)\n-D2986 Comment Length        0000 (0)\n-D2988 Disk Start            0000 (0)\n-D298A Int File Attributes   0000 (0)\n+D2F7D Compression Method    0008 (8) 'Deflated'\n+D2F7F Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+D2F83 CRC                   131CB9D8 (320649688)\n+D2F87 Compressed Size       00000B4D (2893)\n+D2F8B Uncompressed Size     00002777 (10103)\n+D2F8F Filename Length       0077 (119)\n+D2F91 Extra Length          0000 (0)\n+D2F93 Comment Length        0000 (0)\n+D2F95 Disk Start            0000 (0)\n+D2F97 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-D298C Ext File Attributes   81A40000 (2175008768)\n+D2F99 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-D2990 Local Header Offset   00055D32 (351538)\n-D2994 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+D2F9D Local Header Offset   00055D01 (351489)\n+D2FA1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xD2994: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xD2FA1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-D2A0B CENTRAL HEADER #390   02014B50 (33639248)\n-D2A0F Created Zip Spec      14 (20) '2.0'\n-D2A10 Created OS            03 (3) 'Unix'\n-D2A11 Extract Zip Spec      14 (20) '2.0'\n-D2A12 Extract OS            00 (0) 'MS-DOS'\n-D2A13 General Purpose Flag  0800 (2048)\n+D3018 CENTRAL HEADER #390   02014B50 (33639248)\n+D301C Created Zip Spec      14 (20) '2.0'\n+D301D Created OS            03 (3) 'Unix'\n+D301E Extract Zip Spec      14 (20) '2.0'\n+D301F Extract OS            00 (0) 'MS-DOS'\n+D3020 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-D2A15 Compression Method    0008 (8) 'Deflated'\n-D2A17 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-D2A1B CRC                   95FAB1DA (2516234714)\n-D2A1F Compressed Size       00000678 (1656)\n-D2A23 Uncompressed Size     0000110D (4365)\n-D2A27 Filename Length       0076 (118)\n-D2A29 Extra Length          0000 (0)\n-D2A2B Comment Length        0000 (0)\n-D2A2D Disk Start            0000 (0)\n-D2A2F Int File Attributes   0000 (0)\n+D3022 Compression Method    0008 (8) 'Deflated'\n+D3024 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+D3028 CRC                   95FAB1DA (2516234714)\n+D302C Compressed Size       00000678 (1656)\n+D3030 Uncompressed Size     0000110D (4365)\n+D3034 Filename Length       0076 (118)\n+D3036 Extra Length          0000 (0)\n+D3038 Comment Length        0000 (0)\n+D303A Disk Start            0000 (0)\n+D303C Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-D2A31 Ext File Attributes   81A40000 (2175008768)\n+D303E 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-D2A35 Local Header Offset   00056914 (354580)\n-D2A39 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+D3042 Local Header Offset   000568E3 (354531)\n+D3046 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xD2A39: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xD3046: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-D2AAF CENTRAL HEADER #391   02014B50 (33639248)\n-D2AB3 Created Zip Spec      14 (20) '2.0'\n-D2AB4 Created OS            03 (3) 'Unix'\n-D2AB5 Extract Zip Spec      14 (20) '2.0'\n-D2AB6 Extract OS            00 (0) 'MS-DOS'\n-D2AB7 General Purpose Flag  0800 (2048)\n+D30BC CENTRAL HEADER #391   02014B50 (33639248)\n+D30C0 Created Zip Spec      14 (20) '2.0'\n+D30C1 Created OS            03 (3) 'Unix'\n+D30C2 Extract Zip Spec      14 (20) '2.0'\n+D30C3 Extract OS            00 (0) 'MS-DOS'\n+D30C4 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-D2AB9 Compression Method    0008 (8) 'Deflated'\n-D2ABB Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-D2ABF CRC                   B1E82858 (2984781912)\n-D2AC3 Compressed Size       000007DE (2014)\n-D2AC7 Uncompressed Size     000019D6 (6614)\n-D2ACB Filename Length       0079 (121)\n-D2ACD Extra Length          0000 (0)\n-D2ACF Comment Length        0000 (0)\n-D2AD1 Disk Start            0000 (0)\n-D2AD3 Int File Attributes   0000 (0)\n+D30C6 Compression Method    0008 (8) 'Deflated'\n+D30C8 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+D30CC CRC                   B1E82858 (2984781912)\n+D30D0 Compressed Size       000007DE (2014)\n+D30D4 Uncompressed Size     000019D6 (6614)\n+D30D8 Filename Length       0079 (121)\n+D30DA Extra Length          0000 (0)\n+D30DC Comment Length        0000 (0)\n+D30DE Disk Start            0000 (0)\n+D30E0 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-D2AD5 Ext File Attributes   81A40000 (2175008768)\n+D30E2 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-D2AD9 Local Header Offset   00057020 (356384)\n-D2ADD Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+D30E6 Local Header Offset   00056FEF (356335)\n+D30EA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xD2ADD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xD30EA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-D2B56 CENTRAL HEADER #392   02014B50 (33639248)\n-D2B5A Created Zip Spec      14 (20) '2.0'\n-D2B5B Created OS            03 (3) 'Unix'\n-D2B5C Extract Zip Spec      14 (20) '2.0'\n-D2B5D Extract OS            00 (0) 'MS-DOS'\n-D2B5E General Purpose Flag  0800 (2048)\n+D3163 CENTRAL HEADER #392   02014B50 (33639248)\n+D3167 Created Zip Spec      14 (20) '2.0'\n+D3168 Created OS            03 (3) 'Unix'\n+D3169 Extract Zip Spec      14 (20) '2.0'\n+D316A Extract OS            00 (0) 'MS-DOS'\n+D316B General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-D2B60 Compression Method    0008 (8) 'Deflated'\n-D2B62 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-D2B66 CRC                   EA13965E (3927152222)\n-D2B6A Compressed Size       00000529 (1321)\n-D2B6E Uncompressed Size     00000F7E (3966)\n-D2B72 Filename Length       0076 (118)\n-D2B74 Extra Length          0000 (0)\n-D2B76 Comment Length        0000 (0)\n-D2B78 Disk Start            0000 (0)\n-D2B7A Int File Attributes   0000 (0)\n+D316D Compression Method    0008 (8) 'Deflated'\n+D316F Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+D3173 CRC                   EA13965E (3927152222)\n+D3177 Compressed Size       00000529 (1321)\n+D317B Uncompressed Size     00000F7E (3966)\n+D317F Filename Length       0076 (118)\n+D3181 Extra Length          0000 (0)\n+D3183 Comment Length        0000 (0)\n+D3185 Disk Start            0000 (0)\n+D3187 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-D2B7C Ext File Attributes   81A40000 (2175008768)\n+D3189 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-D2B80 Local Header Offset   00057895 (358549)\n-D2B84 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+D318D Local Header Offset   00057864 (358500)\n+D3191 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xD2B84: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xD3191: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-D2BFA CENTRAL HEADER #393   02014B50 (33639248)\n-D2BFE Created Zip Spec      14 (20) '2.0'\n-D2BFF Created OS            03 (3) 'Unix'\n-D2C00 Extract Zip Spec      14 (20) '2.0'\n-D2C01 Extract OS            00 (0) 'MS-DOS'\n-D2C02 General Purpose Flag  0800 (2048)\n+D3207 CENTRAL HEADER #393   02014B50 (33639248)\n+D320B Created Zip Spec      14 (20) '2.0'\n+D320C Created OS            03 (3) 'Unix'\n+D320D Extract Zip Spec      14 (20) '2.0'\n+D320E Extract OS            00 (0) 'MS-DOS'\n+D320F General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-D2C04 Compression Method    0008 (8) 'Deflated'\n-D2C06 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-D2C0A CRC                   C8903588 (3364894088)\n-D2C0E Compressed Size       00000D5E (3422)\n-D2C12 Uncompressed Size     00002CD6 (11478)\n-D2C16 Filename Length       006F (111)\n-D2C18 Extra Length          0000 (0)\n-D2C1A Comment Length        0000 (0)\n-D2C1C Disk Start            0000 (0)\n-D2C1E Int File Attributes   0000 (0)\n+D3211 Compression Method    0008 (8) 'Deflated'\n+D3213 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+D3217 CRC                   C8903588 (3364894088)\n+D321B Compressed Size       00000D5E (3422)\n+D321F Uncompressed Size     00002CD6 (11478)\n+D3223 Filename Length       006F (111)\n+D3225 Extra Length          0000 (0)\n+D3227 Comment Length        0000 (0)\n+D3229 Disk Start            0000 (0)\n+D322B Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-D2C20 Ext File Attributes   81A40000 (2175008768)\n+D322D 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-D2C24 Local Header Offset   00057E52 (360018)\n-D2C28 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+D3231 Local Header Offset   00057E21 (359969)\n+D3235 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xD2C28: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xD3235: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-D2C97 CENTRAL HEADER #394   02014B50 (33639248)\n-D2C9B Created Zip Spec      14 (20) '2.0'\n-D2C9C Created OS            03 (3) 'Unix'\n-D2C9D Extract Zip Spec      14 (20) '2.0'\n-D2C9E Extract OS            00 (0) 'MS-DOS'\n-D2C9F General Purpose Flag  0800 (2048)\n+D32A4 CENTRAL HEADER #394   02014B50 (33639248)\n+D32A8 Created Zip Spec      14 (20) '2.0'\n+D32A9 Created OS            03 (3) 'Unix'\n+D32AA Extract Zip Spec      14 (20) '2.0'\n+D32AB Extract OS            00 (0) 'MS-DOS'\n+D32AC General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-D2CA1 Compression Method    0008 (8) 'Deflated'\n-D2CA3 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-D2CA7 CRC                   D19560D0 (3516227792)\n-D2CAB Compressed Size       000003BB (955)\n-D2CAF Uncompressed Size     00000A2F (2607)\n-D2CB3 Filename Length       0080 (128)\n-D2CB5 Extra Length          0000 (0)\n-D2CB7 Comment Length        0000 (0)\n-D2CB9 Disk Start            0000 (0)\n-D2CBB Int File Attributes   0000 (0)\n+D32AE Compression Method    0008 (8) 'Deflated'\n+D32B0 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+D32B4 CRC                   D19560D0 (3516227792)\n+D32B8 Compressed Size       000003BB (955)\n+D32BC Uncompressed Size     00000A2F (2607)\n+D32C0 Filename Length       0080 (128)\n+D32C2 Extra Length          0000 (0)\n+D32C4 Comment Length        0000 (0)\n+D32C6 Disk Start            0000 (0)\n+D32C8 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-D2CBD Ext File Attributes   81A40000 (2175008768)\n+D32CA 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-D2CC1 Local Header Offset   00058C3D (363581)\n-D2CC5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+D32CE Local Header Offset   00058C0C (363532)\n+D32D2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xD2CC5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xD32D2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-D2D45 CENTRAL HEADER #395   02014B50 (33639248)\n-D2D49 Created Zip Spec      14 (20) '2.0'\n-D2D4A Created OS            03 (3) 'Unix'\n-D2D4B Extract Zip Spec      14 (20) '2.0'\n-D2D4C Extract OS            00 (0) 'MS-DOS'\n-D2D4D General Purpose Flag  0800 (2048)\n+D3352 CENTRAL HEADER #395   02014B50 (33639248)\n+D3356 Created Zip Spec      14 (20) '2.0'\n+D3357 Created OS            03 (3) 'Unix'\n+D3358 Extract Zip Spec      14 (20) '2.0'\n+D3359 Extract OS            00 (0) 'MS-DOS'\n+D335A General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-D2D4F Compression Method    0008 (8) 'Deflated'\n-D2D51 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-D2D55 CRC                   CB05D09B (3406155931)\n-D2D59 Compressed Size       000017FC (6140)\n-D2D5D Uncompressed Size     00005230 (21040)\n-D2D61 Filename Length       0084 (132)\n-D2D63 Extra Length          0000 (0)\n-D2D65 Comment Length        0000 (0)\n-D2D67 Disk Start            0000 (0)\n-D2D69 Int File Attributes   0000 (0)\n+D335C Compression Method    0008 (8) 'Deflated'\n+D335E Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+D3362 CRC                   CB05D09B (3406155931)\n+D3366 Compressed Size       000017FC (6140)\n+D336A Uncompressed Size     00005230 (21040)\n+D336E Filename Length       0084 (132)\n+D3370 Extra Length          0000 (0)\n+D3372 Comment Length        0000 (0)\n+D3374 Disk Start            0000 (0)\n+D3376 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-D2D6B Ext File Attributes   81A40000 (2175008768)\n+D3378 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-D2D6F Local Header Offset   00059096 (364694)\n-D2D73 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+D337C Local Header Offset   00059065 (364645)\n+D3380 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             '\n #\n-# WARNING: Offset 0xD2D73: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xD3380: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-D2DF7 CENTRAL HEADER #396   02014B50 (33639248)\n-D2DFB Created Zip Spec      14 (20) '2.0'\n-D2DFC Created OS            03 (3) 'Unix'\n-D2DFD Extract Zip Spec      14 (20) '2.0'\n-D2DFE Extract OS            00 (0) 'MS-DOS'\n-D2DFF General Purpose Flag  0800 (2048)\n+D3404 CENTRAL HEADER #396   02014B50 (33639248)\n+D3408 Created Zip Spec      14 (20) '2.0'\n+D3409 Created OS            03 (3) 'Unix'\n+D340A Extract Zip Spec      14 (20) '2.0'\n+D340B Extract OS            00 (0) 'MS-DOS'\n+D340C General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-D2E01 Compression Method    0008 (8) 'Deflated'\n-D2E03 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-D2E07 CRC                   17E2323C (400699964)\n-D2E0B Compressed Size       00000487 (1159)\n-D2E0F Uncompressed Size     00000904 (2308)\n-D2E13 Filename Length       0088 (136)\n-D2E15 Extra Length          0000 (0)\n-D2E17 Comment Length        0000 (0)\n-D2E19 Disk Start            0000 (0)\n-D2E1B Int File Attributes   0000 (0)\n+D340E Compression Method    0008 (8) 'Deflated'\n+D3410 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+D3414 CRC                   17E2323C (400699964)\n+D3418 Compressed Size       00000487 (1159)\n+D341C Uncompressed Size     00000904 (2308)\n+D3420 Filename Length       0088 (136)\n+D3422 Extra Length          0000 (0)\n+D3424 Comment Length        0000 (0)\n+D3426 Disk Start            0000 (0)\n+D3428 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-D2E1D Ext File Attributes   81A40000 (2175008768)\n+D342A 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-D2E21 Local Header Offset   0005A934 (370996)\n-D2E25 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+D342E Local Header Offset   0005A903 (370947)\n+D3432 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXX'\n #\n-# WARNING: Offset 0xD2E25: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xD3432: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-D2EAD CENTRAL HEADER #397   02014B50 (33639248)\n-D2EB1 Created Zip Spec      14 (20) '2.0'\n-D2EB2 Created OS            03 (3) 'Unix'\n-D2EB3 Extract Zip Spec      14 (20) '2.0'\n-D2EB4 Extract OS            00 (0) 'MS-DOS'\n-D2EB5 General Purpose Flag  0800 (2048)\n+D34BA CENTRAL HEADER #397   02014B50 (33639248)\n+D34BE Created Zip Spec      14 (20) '2.0'\n+D34BF Created OS            03 (3) 'Unix'\n+D34C0 Extract Zip Spec      14 (20) '2.0'\n+D34C1 Extract OS            00 (0) 'MS-DOS'\n+D34C2 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-D2EB7 Compression Method    0008 (8) 'Deflated'\n-D2EB9 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-D2EBD CRC                   CC28EBBC (3425233852)\n-D2EC1 Compressed Size       00000776 (1910)\n-D2EC5 Uncompressed Size     00001036 (4150)\n-D2EC9 Filename Length       0093 (147)\n-D2ECB Extra Length          0000 (0)\n-D2ECD Comment Length        0000 (0)\n-D2ECF Disk Start            0000 (0)\n-D2ED1 Int File Attributes   0000 (0)\n+D34C4 Compression Method    0008 (8) 'Deflated'\n+D34C6 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+D34CA CRC                   CC28EBBC (3425233852)\n+D34CE Compressed Size       00000776 (1910)\n+D34D2 Uncompressed Size     00001036 (4150)\n+D34D6 Filename Length       0093 (147)\n+D34D8 Extra Length          0000 (0)\n+D34DA Comment Length        0000 (0)\n+D34DC Disk Start            0000 (0)\n+D34DE Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-D2ED3 Ext File Attributes   81A40000 (2175008768)\n+D34E0 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-D2ED7 Local Header Offset   0005AE61 (372321)\n-D2EDB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+D34E4 Local Header Offset   0005AE30 (372272)\n+D34E8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xD2EDB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xD34E8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-D2F6E CENTRAL HEADER #398   02014B50 (33639248)\n-D2F72 Created Zip Spec      14 (20) '2.0'\n-D2F73 Created OS            03 (3) 'Unix'\n-D2F74 Extract Zip Spec      14 (20) '2.0'\n-D2F75 Extract OS            00 (0) 'MS-DOS'\n-D2F76 General Purpose Flag  0800 (2048)\n+D357B CENTRAL HEADER #398   02014B50 (33639248)\n+D357F Created Zip Spec      14 (20) '2.0'\n+D3580 Created OS            03 (3) 'Unix'\n+D3581 Extract Zip Spec      14 (20) '2.0'\n+D3582 Extract OS            00 (0) 'MS-DOS'\n+D3583 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-D2F78 Compression Method    0008 (8) 'Deflated'\n-D2F7A Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-D2F7E CRC                   3FC95820 (1070159904)\n-D2F82 Compressed Size       000004B8 (1208)\n-D2F86 Uncompressed Size     00000AD4 (2772)\n-D2F8A Filename Length       0084 (132)\n-D2F8C Extra Length          0000 (0)\n-D2F8E Comment Length        0000 (0)\n-D2F90 Disk Start            0000 (0)\n-D2F92 Int File Attributes   0000 (0)\n+D3585 Compression Method    0008 (8) 'Deflated'\n+D3587 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+D358B CRC                   3FC95820 (1070159904)\n+D358F Compressed Size       000004B8 (1208)\n+D3593 Uncompressed Size     00000AD4 (2772)\n+D3597 Filename Length       0084 (132)\n+D3599 Extra Length          0000 (0)\n+D359B Comment Length        0000 (0)\n+D359D Disk Start            0000 (0)\n+D359F Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-D2F94 Ext File Attributes   81A40000 (2175008768)\n+D35A1 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-D2F98 Local Header Offset   0005B688 (374408)\n-D2F9C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+D35A5 Local Header Offset   0005B657 (374359)\n+D35A9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             '\n #\n-# WARNING: Offset 0xD2F9C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xD35A9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-D3020 CENTRAL HEADER #399   02014B50 (33639248)\n-D3024 Created Zip Spec      14 (20) '2.0'\n-D3025 Created OS            03 (3) 'Unix'\n-D3026 Extract Zip Spec      14 (20) '2.0'\n-D3027 Extract OS            00 (0) 'MS-DOS'\n-D3028 General Purpose Flag  0800 (2048)\n+D362D CENTRAL HEADER #399   02014B50 (33639248)\n+D3631 Created Zip Spec      14 (20) '2.0'\n+D3632 Created OS            03 (3) 'Unix'\n+D3633 Extract Zip Spec      14 (20) '2.0'\n+D3634 Extract OS            00 (0) 'MS-DOS'\n+D3635 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-D302A Compression Method    0008 (8) 'Deflated'\n-D302C Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-D3030 CRC                   41CBDE11 (1103879697)\n-D3034 Compressed Size       000005EA (1514)\n-D3038 Uncompressed Size     00000D2F (3375)\n-D303C Filename Length       0073 (115)\n-D303E Extra Length          0000 (0)\n-D3040 Comment Length        0000 (0)\n-D3042 Disk Start            0000 (0)\n-D3044 Int File Attributes   0000 (0)\n+D3637 Compression Method    0008 (8) 'Deflated'\n+D3639 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+D363D CRC                   41CBDE11 (1103879697)\n+D3641 Compressed Size       000005EA (1514)\n+D3645 Uncompressed Size     00000D2F (3375)\n+D3649 Filename Length       0073 (115)\n+D364B Extra Length          0000 (0)\n+D364D Comment Length        0000 (0)\n+D364F Disk Start            0000 (0)\n+D3651 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-D3046 Ext File Attributes   81A40000 (2175008768)\n+D3653 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-D304A Local Header Offset   0005BBE2 (375778)\n-D304E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+D3657 Local Header Offset   0005BBB1 (375729)\n+D365B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xD304E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xD365B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-D30C1 CENTRAL HEADER #400   02014B50 (33639248)\n-D30C5 Created Zip Spec      14 (20) '2.0'\n-D30C6 Created OS            03 (3) 'Unix'\n-D30C7 Extract Zip Spec      14 (20) '2.0'\n-D30C8 Extract OS            00 (0) 'MS-DOS'\n-D30C9 General Purpose Flag  0800 (2048)\n+D36CE CENTRAL HEADER #400   02014B50 (33639248)\n+D36D2 Created Zip Spec      14 (20) '2.0'\n+D36D3 Created OS            03 (3) 'Unix'\n+D36D4 Extract Zip Spec      14 (20) '2.0'\n+D36D5 Extract OS            00 (0) 'MS-DOS'\n+D36D6 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-D30CB Compression Method    0008 (8) 'Deflated'\n-D30CD Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-D30D1 CRC                   1D768ED5 (494309077)\n-D30D5 Compressed Size       00000834 (2100)\n-D30D9 Uncompressed Size     00001C79 (7289)\n-D30DD Filename Length       0079 (121)\n-D30DF Extra Length          0000 (0)\n-D30E1 Comment Length        0000 (0)\n-D30E3 Disk Start            0000 (0)\n-D30E5 Int File Attributes   0000 (0)\n+D36D8 Compression Method    0008 (8) 'Deflated'\n+D36DA Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+D36DE CRC                   1D768ED5 (494309077)\n+D36E2 Compressed Size       00000834 (2100)\n+D36E6 Uncompressed Size     00001C79 (7289)\n+D36EA Filename Length       0079 (121)\n+D36EC Extra Length          0000 (0)\n+D36EE Comment Length        0000 (0)\n+D36F0 Disk Start            0000 (0)\n+D36F2 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-D30E7 Ext File Attributes   81A40000 (2175008768)\n+D36F4 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-D30EB Local Header Offset   0005C25D (377437)\n-D30EF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+D36F8 Local Header Offset   0005C22C (377388)\n+D36FC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xD30EF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xD36FC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-D3168 CENTRAL HEADER #401   02014B50 (33639248)\n-D316C Created Zip Spec      14 (20) '2.0'\n-D316D Created OS            03 (3) 'Unix'\n-D316E Extract Zip Spec      14 (20) '2.0'\n-D316F Extract OS            00 (0) 'MS-DOS'\n-D3170 General Purpose Flag  0800 (2048)\n+D3775 CENTRAL HEADER #401   02014B50 (33639248)\n+D3779 Created Zip Spec      14 (20) '2.0'\n+D377A Created OS            03 (3) 'Unix'\n+D377B Extract Zip Spec      14 (20) '2.0'\n+D377C Extract OS            00 (0) 'MS-DOS'\n+D377D General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-D3172 Compression Method    0008 (8) 'Deflated'\n-D3174 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-D3178 CRC                   7A85C658 (2055587416)\n-D317C Compressed Size       0000085F (2143)\n-D3180 Uncompressed Size     00001D19 (7449)\n-D3184 Filename Length       0081 (129)\n-D3186 Extra Length          0000 (0)\n-D3188 Comment Length        0000 (0)\n-D318A Disk Start            0000 (0)\n-D318C Int File Attributes   0000 (0)\n+D377F Compression Method    0008 (8) 'Deflated'\n+D3781 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+D3785 CRC                   7A85C658 (2055587416)\n+D3789 Compressed Size       0000085F (2143)\n+D378D Uncompressed Size     00001D19 (7449)\n+D3791 Filename Length       0081 (129)\n+D3793 Extra Length          0000 (0)\n+D3795 Comment Length        0000 (0)\n+D3797 Disk Start            0000 (0)\n+D3799 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-D318E Ext File Attributes   81A40000 (2175008768)\n+D379B 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-D3192 Local Header Offset   0005CB28 (379688)\n-D3196 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+D379F Local Header Offset   0005CAF7 (379639)\n+D37A3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xD3196: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xD37A3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-D3217 CENTRAL HEADER #402   02014B50 (33639248)\n-D321B Created Zip Spec      14 (20) '2.0'\n-D321C Created OS            03 (3) 'Unix'\n-D321D Extract Zip Spec      14 (20) '2.0'\n-D321E Extract OS            00 (0) 'MS-DOS'\n-D321F General Purpose Flag  0800 (2048)\n+D3824 CENTRAL HEADER #402   02014B50 (33639248)\n+D3828 Created Zip Spec      14 (20) '2.0'\n+D3829 Created OS            03 (3) 'Unix'\n+D382A Extract Zip Spec      14 (20) '2.0'\n+D382B Extract OS            00 (0) 'MS-DOS'\n+D382C General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-D3221 Compression Method    0008 (8) 'Deflated'\n-D3223 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-D3227 CRC                   C398FE25 (3281583653)\n-D322B Compressed Size       0006744D (422989)\n-D322F Uncompressed Size     00403BAB (4209579)\n-D3233 Filename Length       001A (26)\n-D3235 Extra Length          0000 (0)\n-D3237 Comment Length        0000 (0)\n-D3239 Disk Start            0000 (0)\n-D323B Int File Attributes   0000 (0)\n+D382E Compression Method    0008 (8) 'Deflated'\n+D3830 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+D3834 CRC                   3FE1AA84 (1071753860)\n+D3838 Compressed Size       00067A8B (424587)\n+D383C Uncompressed Size     00403B93 (4209555)\n+D3840 Filename Length       001A (26)\n+D3842 Extra Length          0000 (0)\n+D3844 Comment Length        0000 (0)\n+D3846 Disk Start            0000 (0)\n+D3848 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-D323D Ext File Attributes   81A40000 (2175008768)\n+D384A 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-D3241 Local Header Offset   0005D426 (381990)\n-D3245 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXX'\n+D384E Local Header Offset   0005D3F5 (381941)\n+D3852 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xD3245: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xD3852: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-D325F CENTRAL HEADER #403   02014B50 (33639248)\n-D3263 Created Zip Spec      14 (20) '2.0'\n-D3264 Created OS            03 (3) 'Unix'\n-D3265 Extract Zip Spec      14 (20) '2.0'\n-D3266 Extract OS            00 (0) 'MS-DOS'\n-D3267 General Purpose Flag  0800 (2048)\n+D386C CENTRAL HEADER #403   02014B50 (33639248)\n+D3870 Created Zip Spec      14 (20) '2.0'\n+D3871 Created OS            03 (3) 'Unix'\n+D3872 Extract Zip Spec      14 (20) '2.0'\n+D3873 Extract OS            00 (0) 'MS-DOS'\n+D3874 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-D3269 Compression Method    0008 (8) 'Deflated'\n-D326B Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-D326F CRC                   1814D611 (404018705)\n-D3273 Compressed Size       000007BF (1983)\n-D3277 Uncompressed Size     00001EAA (7850)\n-D327B Filename Length       003C (60)\n-D327D Extra Length          0000 (0)\n-D327F Comment Length        0000 (0)\n-D3281 Disk Start            0000 (0)\n-D3283 Int File Attributes   0000 (0)\n+D3876 Compression Method    0008 (8) 'Deflated'\n+D3878 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+D387C CRC                   1814D611 (404018705)\n+D3880 Compressed Size       000007BF (1983)\n+D3884 Uncompressed Size     00001EAA (7850)\n+D3888 Filename Length       003C (60)\n+D388A Extra Length          0000 (0)\n+D388C Comment Length        0000 (0)\n+D388E Disk Start            0000 (0)\n+D3890 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-D3285 Ext File Attributes   81A40000 (2175008768)\n+D3892 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-D3289 Local Header Offset   000C48AB (805035)\n-D328D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+D3896 Local Header Offset   000C4EB8 (806584)\n+D389A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xD328D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xD389A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-D32C9 CENTRAL HEADER #404   02014B50 (33639248)\n-D32CD Created Zip Spec      14 (20) '2.0'\n-D32CE Created OS            03 (3) 'Unix'\n-D32CF Extract Zip Spec      14 (20) '2.0'\n-D32D0 Extract OS            00 (0) 'MS-DOS'\n-D32D1 General Purpose Flag  0800 (2048)\n+D38D6 CENTRAL HEADER #404   02014B50 (33639248)\n+D38DA Created Zip Spec      14 (20) '2.0'\n+D38DB Created OS            03 (3) 'Unix'\n+D38DC Extract Zip Spec      14 (20) '2.0'\n+D38DD Extract OS            00 (0) 'MS-DOS'\n+D38DE General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-D32D3 Compression Method    0008 (8) 'Deflated'\n-D32D5 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n-D32D9 CRC                   AE8A225E (2928288350)\n-D32DD Compressed Size       00000047 (71)\n-D32E1 Uncompressed Size     0000004A (74)\n-D32E5 Filename Length       0043 (67)\n-D32E7 Extra Length          0000 (0)\n-D32E9 Comment Length        0000 (0)\n-D32EB Disk Start            0000 (0)\n-D32ED Int File Attributes   0000 (0)\n+D38E0 Compression Method    0008 (8) 'Deflated'\n+D38E2 Modification Time     58ADB12A (1487778090) 'Mon May 13 22:09:20 2024'\n+D38E6 CRC                   AE8A225E (2928288350)\n+D38EA Compressed Size       00000047 (71)\n+D38EE Uncompressed Size     0000004A (74)\n+D38F2 Filename Length       0043 (67)\n+D38F4 Extra Length          0000 (0)\n+D38F6 Comment Length        0000 (0)\n+D38F8 Disk Start            0000 (0)\n+D38FA Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-D32EF Ext File Attributes   81A40000 (2175008768)\n+D38FC 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-D32F3 Local Header Offset   000C50C4 (807108)\n-D32F7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+D3900 Local Header Offset   000C56D1 (808657)\n+D3904 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xD32F7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xD3904: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-D333A END CENTRAL HEADER    06054B50 (101010256)\n-D333E Number of this disk   0000 (0)\n-D3340 Central Dir Disk no   0000 (0)\n-D3342 Entries in this disk  0194 (404)\n-D3344 Total Entries         0194 (404)\n-D3346 Size of Central Dir   0000E1CE (57806)\n-D334A Offset to Central Dir 000C516C (807276)\n-D334E Comment Length        0000 (0)\n+D3947 END CENTRAL HEADER    06054B50 (101010256)\n+D394B Number of this disk   0000 (0)\n+D394D Central Dir Disk no   0000 (0)\n+D394F Entries in this disk  0194 (404)\n+D3951 Total Entries         0194 (404)\n+D3953 Size of Central Dir   0000E1CE (57806)\n+D3957 Offset to Central Dir 000C5779 (808825)\n+D395B Comment Length        0000 (0)\n #\n # Error Count: 244\n # Warning Count: 1052\n #\n # Done\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:2.0.0-M3\n Build-Branch:UNKNOWN\n Build-Revision:f2215c6\n-Build-Timestamp:2024-05-14T02:19:44Z\n-Built-By:exceptionfactory\n-Maven-Home:/home/exceptionfactory/.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:/home/exceptionfactory/Applications/zulu21.34.19-ca-jdk21.0.3-linux_x64\n-Build-Jdk:21.0.3\n-Build-Jdk-Vendor:Azul Systems, Inc.\n+Build-Timestamp:2025-01-29T22:38:46Z\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-21-openjdk-amd64\n+Build-Jdk:21.0.4\n+Build-Jdk-Vendor:Ubuntu\n Build-Arch:amd64\n Build-Os:Linux\n-Build-Os-Version:6.5.0-28-generic\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.9668552052282925%", "Differences: {\"'buildInfo'\": \"{'timestamp': 1738190326373, 'compiler': 'Ubuntu 21.0.4'}\",", " \"'bundles'\": \"{0: {'artifact': 'nifi-pgp-nar', 'componentManifest': {'controllerServices': [], \"", "              \"'processors': [OrderedDict({'group': 'org.apache.nifi', 'artifact': 'nifi-pgp-nar', \"", "              \"'version': '2.0.0-M3', 'type': 'org.apache.nifi.processors.pgp.DecryptContentPGP', \"", "              \"'typeDescription': 'Decrypt contents of OpenPGP messages. Using the Packaged \"", "              'Decryption Strategy preserv [\u2026]"], "unified_diff": "@@ -1,3604 +1,4096 @@\n {\n     \"agentType\": \"nifi\",\n     \"buildInfo\": {\n-        \"compiler\": \"Azul Systems, Inc. 21.0.3\",\n+        \"compiler\": \"Ubuntu 21.0.4\",\n         \"revision\": \"f2215c6\",\n-        \"timestamp\": 1715653184479,\n+        \"timestamp\": 1738190326373,\n         \"version\": \"2.0.0-M3\"\n     },\n     \"bundles\": [\n         {\n-            \"artifact\": \"nifi-elasticsearch-client-service-nar\",\n+            \"artifact\": \"nifi-pgp-nar\",\n             \"componentManifest\": {\n-                \"controllerServices\": [\n+                \"controllerServices\": [],\n+                \"processors\": [\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-elasticsearch-client-service-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-pgp-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n-                        \"dynamicProperties\": [\n-                            {\n-                                \"description\": \"Adds the specified property name/value as a Request Header in the Elasticsearch requests.\",\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\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+                            \"TIMER_DRIVEN\": 1\n+                        },\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+                        \"multiProcessorUseCases\": [],\n+                        \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"api-key\": {\n-                                \"dependencies\": [\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-                                    {\n-                                        \"dependentValues\": [\n-                                            \"API_KEY\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Authorization Scheme\",\n-                                        \"propertyName\": \"authorization-scheme\"\n-                                    }\n-                                ],\n-                                \"description\": \"Unique identifier of the API key.\",\n-                                \"displayName\": \"API Key ID\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"api-key-id\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\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\": \"authorization-scheme\",\n-                                \"required\": true,\n-                                \"sensitive\": false\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"el-cs-charset\",\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"el-cs-connect-timeout\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"el-cs-enable-compression\": {\n+                            \"decryption-strategy\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"description\": \"Produce decrypted content read from literal data ignoring signatures\",\n+                                        \"displayName\": \"DECRYPTED\",\n+                                        \"value\": \"DECRYPTED\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"description\": \"Produce decrypted content packaged as an OpenPGP message for additional processing\",\n+                                        \"displayName\": \"PACKAGED\",\n+                                        \"value\": \"PACKAGED\"\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+                                \"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\": \"el-cs-enable-compression\",\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"el-cs-http-hosts\",\n+                                \"name\": \"decryption-strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"el-cs-node-selector\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Select any Elasticsearch node to handle requests\",\n-                                        \"displayName\": \"Any\",\n-                                        \"value\": \"ANY\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Skip dedicated Elasticsearch master nodes for handling request\",\n-                                        \"displayName\": \"Skip Dedicated Masters\",\n-                                        \"value\": \"SKIP_DEDICATED_MASTERS\"\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+                            \"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\": \"el-cs-node-selector\",\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"el-cs-password\",\n+                                \"name\": \"passphrase\",\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+                            \"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\": \"el-cs-path-prefix\",\n+                                \"name\": \"private-key-service\",\n                                 \"required\": false,\n-                                \"sensitive\": 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\": \"2.0.0-M3\"\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+                        \"supportedRelationships\": [\n+                            {\n+                                \"description\": \"Decryption Succeeded\",\n+                                \"name\": \"success\"\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"el-cs-send-meta-header\",\n-                                \"required\": true,\n-                                \"sensitive\": false\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+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\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.pgp.DecryptContentPGP\",\n+                        \"typeDescription\": \"Decrypt contents of OpenPGP messages. Using the Packaged Decryption Strategy preserves OpenPGP encoding to support subsequent signature verification.\",\n+                        \"useCases\": [],\n+                        \"version\": \"2.0.0-M3\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"Filename from decrypted Literal Data\",\n+                                \"name\": \"pgp.literal.data.filename\"\n                             },\n-                            \"el-cs-sniff-cluster-nodes\": {\n-                                \"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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"el-cs-sniff-cluster-nodes\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n+                            {\n+                                \"description\": \"Modified Date from decrypted Literal Data\",\n+                                \"name\": \"pgp.literal.data.modified\"\n                             },\n-                            \"el-cs-sniff-failure\": {\n+                            {\n+                                \"description\": \"Symmetric-Key Algorithm Block Cipher\",\n+                                \"name\": \"pgp.symmetric.key.algorithm.block.cipher\"\n+                            },\n+                            {\n+                                \"description\": \"Symmetric-Key Algorithm Identifier\",\n+                                \"name\": \"pgp.symmetric.key.algorithm.id\"\n+                            }\n+                        ]\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-pgp-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"f2215c6\"\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+                        \"multiProcessorUseCases\": [],\n+                        \"primaryNodeOnly\": false,\n+                        \"propertyDescriptors\": {\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-                                    }\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-                                    }\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\": \"el-cs-sniff-failure\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"el-cs-sniffer-failure-delay\": {\n-                                \"defaultValue\": \"1 min\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"true\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Sniff on Failure\",\n-                                        \"propertyName\": \"el-cs-sniff-failure\"\n+                                        \"displayName\": \"BINARY\",\n+                                        \"value\": \"BINARY\"\n                                     }\n                                 ],\n-                                \"description\": \"Delay between an Elasticsearch request failure and updating available Cluster nodes using the Sniffer\",\n-                                \"displayName\": \"Sniffer Failure Delay\",\n+                                \"defaultValue\": \"BINARY\",\n+                                \"description\": \"File Encoding for encryption\",\n+                                \"displayName\": \"File Encoding\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"el-cs-sniffer-failure-delay\",\n+                                \"name\": \"file-encoding\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"el-cs-sniffer-interval\": {\n-                                \"defaultValue\": \"5 mins\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"true\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Sniff Cluster Nodes\",\n-                                        \"propertyName\": \"el-cs-sniff-cluster-nodes\"\n-                                    }\n-                                ],\n-                                \"description\": \"Interval between Cluster sniffer operations\",\n-                                \"displayName\": \"Sniffer Interval\",\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\": \"el-cs-sniffer-interval\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n+                                \"name\": \"passphrase\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n                             },\n-                            \"el-cs-sniffer-request-timeout\": {\n-                                \"defaultValue\": \"1 sec\",\n+                            \"public-key-search\": {\n                                 \"dependencies\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"true\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Sniff Cluster Nodes\",\n-                                        \"propertyName\": \"el-cs-sniff-cluster-nodes\"\n+                                        \"propertyDisplayName\": \"Public Key Service\",\n+                                        \"propertyName\": \"public-key-service\"\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\": \"el-cs-sniffer-request-timeout\",\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+                                \"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\": \"el-cs-socket-timeout\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"public-key-search\",\n+                                \"required\": false,\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+                            \"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\": \"el-cs-ssl-context-service\",\n+                                \"name\": \"public-key-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.SSLContextService\",\n+                                    \"type\": \"org.apache.nifi.pgp.service.api.PGPPublicKeyService\",\n                                     \"version\": \"2.0.0-M3\"\n                                 }\n                             },\n-                            \"el-cs-strict-deprecation\": {\n+                            \"symmetric-key-algorithm\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"displayName\": \"AES_128\",\n+                                        \"value\": \"AES_128\"\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"el-cs-strict-deprecation\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"el-cs-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/empty, will be written out as a null/empty value\",\n-                                        \"displayName\": \"Never Suppress\",\n-                                        \"value\": \"never-suppress\"\n+                                        \"displayName\": \"AES_192\",\n+                                        \"value\": \"AES_192\"\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\": \"\",\n+                                        \"displayName\": \"AES_256\",\n+                                        \"value\": \"AES_256\"\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\": \"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\": \"el-cs-suppress-nulls\",\n+                                \"name\": \"symmetric-key-algorithm\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n-                            },\n-                            \"el-cs-username\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"BASIC\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Authorization Scheme\",\n-                                        \"propertyName\": \"authorization-scheme\"\n-                                    }\n-                                ],\n-                                \"description\": \"The username to use with XPack security.\",\n-                                \"displayName\": \"Username\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"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\": \"2.0.0-M3\"\n-                                }\n                             }\n                         },\n-                        \"providedApiImplementations\": [\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-                                \"artifact\": \"nifi-elasticsearch-client-service-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.elasticsearch.ElasticSearchClientService\",\n-                                \"version\": \"2.0.0-M3\"\n+                                \"description\": \"Encryption Succeeded\",\n+                                \"name\": \"success\"\n+                            },\n+                            {\n+                                \"description\": \"Encryption Failed\",\n+                                \"name\": \"failure\"\n                             }\n                         ],\n-                        \"supportsDynamicProperties\": true,\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": false,\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"client\",\n-                            \"elasticsearch\",\n-                            \"elasticsearch6\",\n-                            \"elasticsearch7\",\n-                            \"elasticsearch8\"\n+                            \"Encryption\",\n+                            \"GPG\",\n+                            \"OpenPGP\",\n+                            \"PGP\",\n+                            \"RFC 4880\"\n                         ],\n-                        \"type\": \"org.apache.nifi.elasticsearch.ElasticSearchClientServiceImpl\",\n-                        \"typeDescription\": \"A controller service for accessing an Elasticsearch client, using the Elasticsearch (low-level) REST Client.\",\n-                        \"version\": \"2.0.0-M3\"\n+                        \"triggerSerially\": false,\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+                        \"useCases\": [],\n+                        \"version\": \"2.0.0-M3\",\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+                            },\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-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-elasticsearch-client-service-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-pgp-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\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+                        \"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+                        \"multiProcessorUseCases\": [],\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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+                            \"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                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"el-rest-client-service\",\n+                                \"name\": \"file-encoding\",\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\": \"2.0.0-M3\"\n-                                }\n+                                \"sensitive\": false\n                             },\n-                            \"schema-access-strategy\": {\n+                            \"hash-algorithm\": {\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\": \"\",\n+                                        \"displayName\": \"SHA256\",\n+                                        \"value\": \"SHA256\"\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\": \"SHA384\",\n+                                        \"value\": \"SHA384\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"Infer from Result\",\n-                                        \"value\": \"infer\"\n+                                        \"displayName\": \"SHA512\",\n+                                        \"value\": \"SHA512\"\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\": \"SHA512\",\n+                                \"description\": \"Hash Algorithm for signing\",\n+                                \"displayName\": \"Hash Algorithm\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"schema-access-strategy\",\n+                                \"name\": \"hash-algorithm\",\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\": \"Environment variables 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+                            \"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\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"schema-name\",\n-                                \"required\": false,\n+                                \"name\": \"private-key-id\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"schema-registry\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"schema-reference-reader\",\n-                                            \"schema-name\"\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+                            \"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\": \"schema-registry\",\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.schemaregistry.services.SchemaRegistry\",\n+                                    \"type\": \"org.apache.nifi.pgp.service.api.PGPPrivateKeyService\",\n                                     \"version\": \"2.0.0-M3\"\n                                 }\n                             },\n-                            \"schema-text\": {\n-                                \"defaultValue\": \"${avro.schema}\",\n-                                \"dependencies\": [\n+                            \"signing-strategy\": {\n+                                \"allowableValues\": [\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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"schema-text\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"schema-version\": {\n-                                \"dependencies\": [\n+                                        \"description\": \"Produce signed content packaged as an OpenPGP message\",\n+                                        \"displayName\": \"SIGNED\",\n+                                        \"value\": \"SIGNED\"\n+                                    },\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"schema-name\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n+                                        \"description\": \"Produce detached signature based on associated content packaged according to OpenPGP encoding\",\n+                                        \"displayName\": \"DETACHED\",\n+                                        \"value\": \"DETACHED\"\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+                                \"defaultValue\": \"SIGNED\",\n+                                \"description\": \"Strategy for writing files to success after signing\",\n+                                \"displayName\": \"Signing Strategy\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"schema-version\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"signing-strategy\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"providedApiImplementations\": [\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-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.lookup.LookupService\",\n-                                \"version\": \"2.0.0-M3\"\n+                                \"description\": \"Content signing succeeded\",\n+                                \"name\": \"success\"\n+                            },\n+                            {\n+                                \"description\": \"Content signing failed\",\n+                                \"name\": \"failure\"\n                             }\n                         ],\n-                        \"supportsDynamicProperties\": true,\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": false,\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"elasticsearch\",\n-                            \"enrich\",\n-                            \"lookup\",\n-                            \"record\"\n+                            \"Encryption\",\n+                            \"GPG\",\n+                            \"OpenPGP\",\n+                            \"PGP\",\n+                            \"RFC 4880\",\n+                            \"Signing\"\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\": \"2.0.0-M3\"\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+                        \"useCases\": [],\n+                        \"version\": \"2.0.0-M3\",\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+                            },\n+                            {\n+                                \"description\": \"Signature Version Number\",\n+                                \"name\": \"pgp.signature.version\"\n+                            }\n+                        ]\n                     },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-elasticsearch-client-service-nar\",\n+                        \"artifact\": \"nifi-pgp-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\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+                        \"multiProcessorUseCases\": [],\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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+                            \"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\": \"el-rest-client-service\",\n+                                \"name\": \"public-key-service\",\n                                 \"required\": true,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-elasticsearch-client-service-api-nar\",\n+                                    \"artifact\": \"nifi-pgp-service-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.elasticsearch.ElasticSearchClientService\",\n+                                    \"type\": \"org.apache.nifi.pgp.service.api.PGPPublicKeyService\",\n                                     \"version\": \"2.0.0-M3\"\n                                 }\n                             }\n                         },\n-                        \"providedApiImplementations\": [\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-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.lookup.StringLookupService\",\n-                                \"version\": \"2.0.0-M3\"\n+                                \"description\": \"Signature Verification Succeeded\",\n+                                \"name\": \"success\"\n                             },\n                             {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.lookup.LookupService\",\n-                                \"version\": \"2.0.0-M3\"\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                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"elasticsearch\",\n-                            \"enrich\",\n-                            \"key\",\n-                            \"lookup\",\n-                            \"value\"\n+                            \"Encryption\",\n+                            \"GPG\",\n+                            \"OpenPGP\",\n+                            \"PGP\",\n+                            \"RFC 4880\",\n+                            \"Signing\"\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\": \"2.0.0-M3\"\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+                        \"useCases\": [],\n+                        \"version\": \"2.0.0-M3\",\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+                            },\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-                \"processors\": [],\n                 \"reportingTasks\": []\n             },\n             \"group\": \"org.apache.nifi\",\n             \"version\": \"2.0.0-M3\"\n         },\n         {\n-            \"artifact\": \"nifi-azure-nar\",\n+            \"artifact\": \"nifi-prometheus-nar\",\n             \"componentManifest\": {\n                 \"controllerServices\": [\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-azure-nar\",\n+                        \"artifact\": \"nifi-prometheus-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"group\": \"org.apache.nifi\",\n                         \"propertyDescriptors\": {\n-                            \"credential-configuration-strategy\": {\n+                            \"prometheus-reporting-task-client-auth\": {\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\": \"ReportingTask will not authenticate clients. Anyone can communicate with this ReportingTask anonymously\",\n+                                        \"displayName\": \"No Authentication\",\n+                                        \"value\": \"No Authentication\"\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\": \"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\": \"default-credential\",\n-                                \"description\": \"\",\n-                                \"displayName\": \"Credential Configuration Strategy\",\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\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"credential-configuration-strategy\",\n+                                \"name\": \"prometheus-reporting-task-client-auth\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\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+                            \"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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"prometheus-reporting-task-instance-id\",\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"prometheus-reporting-task-metrics-endpoint-port\",\n+                                \"required\": true,\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+                                \"displayName\": \"SSL Context Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"managed-identity-client-id\",\n+                                \"name\": \"prometheus-reporting-task-ssl-context\",\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.RestrictedSSLContextService\",\n+                                    \"version\": \"2.0.0-M3\"\n+                                }\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.AzureCredentialsService\",\n+                                \"type\": \"org.apache.nifi.record.sink.RecordSinkService\",\n                                 \"version\": \"2.0.0-M3\"\n                             }\n                         ],\n                         \"supportsDynamicProperties\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"azure\",\n-                            \"credentials\",\n-                            \"provider\",\n-                            \"security\",\n-                            \"session\"\n+                            \"prometheus\",\n+                            \"record\",\n+                            \"send\",\n+                            \"write\"\n                         ],\n-                        \"type\": \"org.apache.nifi.services.azure.StandardAzureCredentialsControllerService\",\n-                        \"typeDescription\": \"Provide credentials to use with an Azure client.\",\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\": \"2.0.0-M3\"\n-                    },\n+                    }\n+                ],\n+                \"processors\": [],\n+                \"reportingTasks\": [\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-azure-nar\",\n+                        \"artifact\": \"nifi-prometheus-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"60 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"group\": \"org.apache.nifi\",\n                         \"propertyDescriptors\": {\n-                            \"azure-cosmos-db-consistency-level\": {\n+                            \"prometheus-reporting-task-client-auth\": {\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+                                        \"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\": \"\",\n-                                        \"displayName\": \"CONSISTENT_PREFIX\",\n-                                        \"value\": \"CONSISTENT_PREFIX\"\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\": \"\",\n-                                        \"displayName\": \"EVENTUAL\",\n-                                        \"value\": \"EVENTUAL\"\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\": \"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+                                \"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\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"azure-cosmos-db-consistency-level\",\n-                                \"required\": false,\n+                                \"name\": \"prometheus-reporting-task-client-auth\",\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"azure-cosmos-db-key\",\n-                                \"required\": false,\n-                                \"sensitive\": true\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\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\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-azure-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"f2215c6\"\n-                        },\n-                        \"group\": \"org.apache.nifi\",\n-                        \"propertyDescriptors\": {\n-                            \"Application Client ID\": {\n-                                \"description\": \"Azure Data Explorer Application Client Identifier for Authentication\",\n-                                \"displayName\": \"Application Client ID\",\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\": \"Application Client ID\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"prometheus-reporting-task-instance-id\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Application Key\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"APPLICATION_CREDENTIALS\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Authentication Strategy\",\n-                                        \"propertyName\": \"Authentication Strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"Azure Data Explorer Application Key for Authentication\",\n-                                \"displayName\": \"Application Key\",\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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Application Key\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"prometheus-reporting-task-metrics-endpoint-port\",\n                                 \"required\": true,\n-                                \"sensitive\": true\n+                                \"sensitive\": false\n                             },\n-                            \"Application Tenant ID\": {\n-                                \"dependencies\": [\n+                            \"prometheus-reporting-task-metrics-send-jvm\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"APPLICATION_CREDENTIALS\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Authentication Strategy\",\n-                                        \"propertyName\": \"Authentication Strategy\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"description\": \"Azure Data Explorer Application Tenant Identifier for Authentication\",\n-                                \"displayName\": \"Application Tenant ID\",\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\": \"Application Tenant ID\",\n+                                \"name\": \"prometheus-reporting-task-metrics-send-jvm\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Authentication Strategy\": {\n+                            \"prometheus-reporting-task-metrics-strategy\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Azure Application Registration with Application Key\",\n-                                        \"displayName\": \"Application Credentials\",\n-                                        \"value\": \"APPLICATION_CREDENTIALS\"\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\": \"Azure Managed Identity\",\n-                                        \"displayName\": \"Managed Identity\",\n-                                        \"value\": \"MANAGED_IDENTITY\"\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\": \"MANAGED_IDENTITY\",\n-                                \"description\": \"Authentication method for access to Azure Data Explorer\",\n-                                \"displayName\": \"Authentication Strategy\",\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\": \"Authentication Strategy\",\n+                                \"name\": \"prometheus-reporting-task-metrics-strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Cluster URI\": {\n-                                \"description\": \"Azure Data Explorer Cluster URI\",\n-                                \"displayName\": \"Cluster URI\",\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 URI\",\n-                                \"required\": true,\n-                                \"sensitive\": false\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.ssl.RestrictedSSLContextService\",\n+                                    \"version\": \"2.0.0-M3\"\n+                                }\n                             }\n                         },\n-                        \"providedApiImplementations\": [\n-                            {\n-                                \"artifact\": \"nifi-azure-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.services.azure.data.explorer.KustoIngestService\",\n-                                \"version\": \"2.0.0-M3\"\n-                            }\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\n                         ],\n                         \"supportsDynamicProperties\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"ADX\",\n-                            \"Azure\",\n-                            \"Data\",\n-                            \"Explorer\",\n-                            \"Kusto\",\n-                            \"azure\",\n-                            \"ingest\"\n+                            \"metrics\",\n+                            \"prometheus\",\n+                            \"reporting\",\n+                            \"time series data\"\n                         ],\n-                        \"type\": \"org.apache.nifi.services.azure.data.explorer.StandardKustoIngestService\",\n-                        \"typeDescription\": \"Sends batches of flowfile content or stream flowfile content to an Azure ADX cluster.\",\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\": \"2.0.0-M3\"\n-                    },\n+                    }\n+                ]\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"2.0.0-M3\"\n+        },\n+        {\n+            \"artifact\": \"nifi-zendesk-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n+                \"processors\": [\n                     {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-azure-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-zendesk-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\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\": \"20 sec\",\n                         \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n+                        \"multiProcessorUseCases\": [],\n+                        \"primaryNodeOnly\": true,\n                         \"propertyDescriptors\": {\n-                            \"Application Client ID\": {\n-                                \"description\": \"Azure Data Explorer Application Client Identifier for Authentication\",\n-                                \"displayName\": \"Application Client ID\",\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\": \"Application Client ID\",\n+                                \"name\": \"web-client-service-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.web.client.provider.api.WebClientServiceProvider\",\n+                                    \"version\": \"2.0.0-M3\"\n+                                }\n                             },\n-                            \"Application Key\": {\n-                                \"dependencies\": [\n+                            \"zendesk-authentication-type-name\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"APPLICATION_CREDENTIALS\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Authentication Strategy\",\n-                                        \"propertyName\": \"Authentication Strategy\"\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\": \"Azure Data Explorer Application Key for Authentication\",\n-                                \"displayName\": \"Application Key\",\n+                                \"description\": \"Type of authentication to Zendesk API.\",\n+                                \"displayName\": \"Authentication Type\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Application Key\",\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\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"zendesk-authentication-value-name\",\n                                 \"required\": true,\n                                 \"sensitive\": true\n                             },\n-                            \"Application Tenant ID\": {\n-                                \"dependencies\": [\n+                            \"zendesk-export-method\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"APPLICATION_CREDENTIALS\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Authentication Strategy\",\n-                                        \"propertyName\": \"Authentication Strategy\"\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\": \"Azure Data Explorer Application Tenant Identifier for Authentication\",\n-                                \"displayName\": \"Application Tenant ID\",\n+                                \"description\": \"Method for incremental export.\",\n+                                \"displayName\": \"Export Method\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Application Tenant ID\",\n+                                \"name\": \"zendesk-export-method\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Authentication Strategy\": {\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\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"zendesk-query-start-timestamp\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"zendesk-resource\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Azure Application Registration with Application Key\",\n-                                        \"displayName\": \"Application Credentials\",\n-                                        \"value\": \"APPLICATION_CREDENTIALS\"\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\": \"Azure Managed Identity\",\n-                                        \"displayName\": \"Managed Identity\",\n-                                        \"value\": \"MANAGED_IDENTITY\"\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\": \"MANAGED_IDENTITY\",\n-                                \"description\": \"Authentication method for access to Azure Data Explorer\",\n-                                \"displayName\": \"Authentication Strategy\",\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\": \"Authentication Strategy\",\n+                                \"name\": \"zendesk-resource\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Cluster URI\": {\n-                                \"description\": \"Azure Data Explorer Cluster URI\",\n-                                \"displayName\": \"Cluster URI\",\n+                            \"zendesk-subdomain\": {\n+                                \"description\": \"Name of the Zendesk subdomain.\",\n+                                \"displayName\": \"Subdomain Name\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Cluster URI\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\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\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"zendesk-user\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"providedApiImplementations\": [\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-                                \"artifact\": \"nifi-azure-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.services.azure.data.explorer.KustoQueryService\",\n-                                \"version\": \"2.0.0-M3\"\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                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"ADX\",\n-                            \"Azure\",\n-                            \"Data\",\n-                            \"Explorer\",\n-                            \"Kusto\"\n+                            \"zendesk\"\n                         ],\n-                        \"type\": \"org.apache.nifi.services.azure.data.explorer.StandardKustoQueryService\",\n-                        \"typeDescription\": \"Standard implementation of Kusto Query Service for Azure Data Explorer\",\n-                        \"version\": \"2.0.0-M3\"\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+                        \"useCases\": [],\n+                        \"version\": \"2.0.0-M3\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"The number of records fetched by the processor.\",\n+                                \"name\": \"record.count\"\n+                            }\n+                        ]\n                     },\n                     {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-azure-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-zendesk-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\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+                        \"multiProcessorUseCases\": [],\n+                        \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Authentication Strategy\": {\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\": \"2.0.0-M3\"\n+                                }\n+                            },\n+                            \"zendesk-authentication-type-name\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Azure Event Hub shared access key\",\n-                                        \"displayName\": \"Shared Access Key\",\n-                                        \"value\": \"SHARED_ACCESS_KEY\"\n+                                        \"description\": \"Password of Zendesk login user.\",\n+                                        \"displayName\": \"Password\",\n+                                        \"value\": \"password\"\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\": \"Authentication token generated in Zendesk Admin menu for API access.\",\n+                                        \"displayName\": \"Token\",\n+                                        \"value\": \"token\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"DEFAULT_AZURE_CREDENTIAL\",\n-                                \"description\": \"Strategy for authenticating to Azure Event Hubs\",\n-                                \"displayName\": \"Authentication Strategy\",\n+                                \"description\": \"Type of authentication to Zendesk API.\",\n+                                \"displayName\": \"Authentication Type\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Authentication Strategy\",\n+                                \"name\": \"zendesk-authentication-type-name\",\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+                            \"zendesk-authentication-value-name\": {\n+                                \"description\": \"Password or authentication token for Zendesk login user.\",\n+                                \"displayName\": \"Authentication Credential\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Event Hub Name\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"zendesk-authentication-value-name\",\n                                 \"required\": true,\n-                                \"sensitive\": false\n+                                \"sensitive\": true\n                             },\n-                            \"Event Hub Namespace\": {\n-                                \"description\": \"Provides provides the host for connecting to Azure Event Hubs\",\n-                                \"displayName\": \"Event Hub Namespace\",\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                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Event Hub Namespace\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"zendesk-comment-body\",\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+                            \"zendesk-priority\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"propertyDisplayName\": \"Record Reader\",\n+                                        \"propertyName\": \"zendesk-record-reader\"\n+                                    }\n+                                ],\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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Partition Key\",\n+                                \"name\": \"zendesk-priority\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Service Bus Endpoint\": {\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-                                    },\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\": \".servicebus.windows.net\",\n-                                \"description\": \"Provides the domain for connecting to Azure Event Hubs\",\n-                                \"displayName\": \"Service Bus Endpoint\",\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\": \"Service Bus Endpoint\",\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\": \"2.0.0-M3\"\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\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"zendesk-subdomain\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Shared Access Policy\": {\n+                            \"zendesk-subject\": {\n                                 \"dependencies\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"SHARED_ACCESS_KEY\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Authentication Strategy\",\n-                                        \"propertyName\": \"Authentication Strategy\"\n+                                        \"propertyDisplayName\": \"Record Reader\",\n+                                        \"propertyName\": \"zendesk-record-reader\"\n                                     }\n                                 ],\n-                                \"description\": \"The name of the shared access policy. This policy must have Send claims\",\n-                                \"displayName\": \"Shared Access Policy\",\n+                                \"description\": \"The content or the path to the subject in the incoming record.\",\n+                                \"displayName\": \"Subject\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Shared Access Policy\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"zendesk-subject\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Shared Access Policy Key\": {\n+                            \"zendesk-type\": {\n                                 \"dependencies\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"SHARED_ACCESS_KEY\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Authentication Strategy\",\n-                                        \"propertyName\": \"Authentication Strategy\"\n+                                        \"propertyDisplayName\": \"Record Reader\",\n+                                        \"propertyName\": \"zendesk-record-reader\"\n                                     }\n                                 ],\n-                                \"description\": \"The primary or secondary key of the shared access policy\",\n-                                \"displayName\": \"Shared Access Policy Key\",\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\": \"Shared Access Policy Key\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"zendesk-type\",\n                                 \"required\": false,\n-                                \"sensitive\": true\n+                                \"sensitive\": false\n                             },\n-                            \"Transport Type\": {\n+                            \"zendesk-user\": {\n+                                \"description\": \"Login user to Zendesk subdomain.\",\n+                                \"displayName\": \"User Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables 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+                                \"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+                                \"name\": \"failure\"\n+                            }\n+                        ],\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": false,\n+                        \"supportsDynamicProperties\": true,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"zendesk, ticket\"\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+                        \"useCases\": [],\n+                        \"version\": \"2.0.0-M3\",\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\": \"2.0.0-M3\"\n+        },\n+        {\n+            \"artifact\": \"nifi-language-translation-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n+                \"processors\": [\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-language-translation-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"f2215c6\"\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\": \"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+                        \"multiProcessorUseCases\": [],\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Character Set\",\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Input Language\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\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\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Target Language\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Translate Content\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"AMQP over TCP on ports 5671 and 5672\",\n-                                        \"displayName\": \"AMQP\",\n-                                        \"value\": \"Amqp\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n-                                        \"description\": \"AMQP over HTTPS with WebSockets on port 443\",\n-                                        \"displayName\": \"AMQP_WEB_SOCKETS\",\n-                                        \"value\": \"AmqpWebSockets\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\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\": \"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\": \"Transport Type\",\n+                                \"name\": \"Translate Content\",\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+                            \"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\": \"record-sink-record-writer\",\n+                                \"name\": \"Yandex API Key\",\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\": \"2.0.0-M3\"\n-                                }\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\": \"2.0.0-M3\"\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\": \"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-                        \"supportsDynamicProperties\": false,\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": true,\n+                        \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"azure\",\n-                            \"record\",\n-                            \"sink\"\n+                            \"language\",\n+                            \"translate\",\n+                            \"translation\",\n+                            \"yandex\"\n                         ],\n-                        \"type\": \"org.apache.nifi.services.azure.eventhub.AzureEventHubRecordSink\",\n-                        \"typeDescription\": \"Format and send Records to Azure Event Hubs\",\n-                        \"version\": \"2.0.0-M3\"\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+                        \"useCases\": [],\n+                        \"version\": \"2.0.0-M3\",\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+                            }\n+                        ]\n+                    }\n+                ],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"2.0.0-M3\"\n+        },\n+        {\n+            \"artifact\": \"nifi-hashicorp-vault-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [\n                     {\n                         \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-azure-nar\",\n+                        \"artifact\": \"nifi-hashicorp-vault-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\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\": \"ENVIRONMENT\",\n+                                \"name\": \"A Spring Vault configuration property name\",\n+                                \"value\": \"The property value\"\n+                            }\n+                        ],\n                         \"group\": \"org.apache.nifi\",\n                         \"propertyDescriptors\": {\n-                            \"credentials-type\": {\n+                            \"configuration-strategy\": {\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+                                        \"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\": \"Azure Active Directory Service Principal with Client Id / Client Secret of a registered application\",\n-                                        \"displayName\": \"Service Principal\",\n-                                        \"value\": \"SERVICE_PRINCIPAL\"\n+                                        \"description\": \"Use one or more '.properties' files to configure the client\",\n+                                        \"displayName\": \"Properties Files\",\n+                                        \"value\": \"properties-files\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"SAS_TOKEN\",\n-                                \"description\": \"Credentials type to be used for authenticating to Azure\",\n-                                \"displayName\": \"Credentials Type\",\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\": \"credentials-type\",\n+                                \"name\": \"configuration-strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"managed-identity-client-id\": {\n+                            \"vault.authentication\": {\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+                                    },\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\": \"TOKEN\",\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"MANAGED_IDENTITY\"\n+                                            \"direct-properties\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Credentials Type\",\n-                                        \"propertyName\": \"credentials-type\"\n+                                        \"propertyDisplayName\": \"Configuration Strategy\",\n+                                        \"propertyName\": \"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+                                \"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\": \"managed-identity-client-id\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n+                                \"name\": \"vault.authentication\",\n+                                \"required\": true,\n+                                \"sensitive\": false\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+                            \"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\": \"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\": \"2.0.0-M3\"\n-                                }\n+                                \"name\": \"vault.connection.timeout\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             },\n-                            \"service-principal-client-id\": {\n+                            \"vault.properties.files\": {\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"SERVICE_PRINCIPAL\"\n+                                            \"properties-files\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Credentials Type\",\n-                                        \"propertyName\": \"credentials-type\"\n+                                        \"propertyDisplayName\": \"Configuration Strategy\",\n+                                        \"propertyName\": \"configuration-strategy\"\n                                     }\n                                 ],\n-                                \"description\": \"Client ID (or Application ID) of the Client/Application having the Service Principal.\",\n-                                \"displayName\": \"Service Principal Client ID\",\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\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"service-principal-client-id\",\n+                                \"name\": \"vault.properties.files\",\n                                 \"required\": true,\n-                                \"sensitive\": true\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"MULTIPLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\"\n+                                    ]\n+                                },\n+                                \"sensitive\": false\n                             },\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.\",\n-                                \"displayName\": \"Service Principal Client Secret\",\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\": \"service-principal-client-secret\",\n+                                \"name\": \"vault.read.timeout\",\n                                 \"required\": true,\n-                                \"sensitive\": true\n+                                \"sensitive\": false\n                             },\n-                            \"service-principal-tenant-id\": {\n+                            \"vault.ssl.context.service\": {\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"SERVICE_PRINCIPAL\"\n+                                            \"direct-properties\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Credentials Type\",\n-                                        \"propertyName\": \"credentials-type\"\n+                                        \"propertyDisplayName\": \"Configuration Strategy\",\n+                                        \"propertyName\": \"configuration-strategy\"\n                                     }\n                                 ],\n-                                \"description\": \"Tenant ID of the Azure Active Directory hosting the Service Principal.\",\n-                                \"displayName\": \"Service Principal Tenant ID\",\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\": \"service-principal-tenant-id\",\n-                                \"required\": true,\n-                                \"sensitive\": true\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.SSLContextService\",\n+                                    \"version\": \"2.0.0-M3\"\n+                                }\n                             },\n-                            \"storage-account-key\": {\n+                            \"vault.uri\": {\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"ACCOUNT_KEY\"\n+                                            \"direct-properties\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Credentials Type\",\n-                                        \"propertyName\": \"credentials-type\"\n+                                        \"propertyDisplayName\": \"Configuration Strategy\",\n+                                        \"propertyName\": \"configuration-strategy\"\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, Managed Identity or Service Principal 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\": \"Account Key\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"storage-account-key\",\n-                                \"required\": true,\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\": \"Environment variables 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+                                \"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\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"storage-endpoint-suffix\",\n+                                \"name\": \"vault.uri\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n-                            },\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 (the leading '?' may be included) 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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"storage-sas-token\",\n-                                \"required\": true,\n-                                \"sensitive\": true\n                             }\n                         },\n                         \"providedApiImplementations\": [\n                             {\n-                                \"artifact\": \"nifi-azure-services-api-nar\",\n+                                \"artifact\": \"nifi-hashicorp-vault-client-service-api-nar\",\n                                 \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.services.azure.storage.ADLSCredentialsService\",\n+                                \"type\": \"org.apache.nifi.vault.hashicorp.HashiCorpVaultClientService\",\n                                 \"version\": \"2.0.0-M3\"\n                             }\n                         ],\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"supportsDynamicProperties\": true,\n+                        \"supportsSensitiveDynamicProperties\": true,\n                         \"tags\": [\n-                            \"adls\",\n-                            \"azure\",\n-                            \"cloud\",\n-                            \"credentials\",\n-                            \"microsoft\",\n-                            \"storage\"\n+                            \"client\",\n+                            \"hashicorp\",\n+                            \"vault\"\n                         ],\n-                        \"type\": \"org.apache.nifi.services.azure.storage.ADLSCredentialsControllerService\",\n-                        \"typeDescription\": \"Defines credentials for ADLS processors.\",\n+                        \"type\": \"org.apache.nifi.vault.hashicorp.StandardHashiCorpVaultClientService\",\n+                        \"typeDescription\": \"A controller service for interacting with HashiCorp Vault.\",\n                         \"version\": \"2.0.0-M3\"\n-                    },\n+                    }\n+                ],\n+                \"processors\": [],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"2.0.0-M3\"\n+        },\n+        {\n+            \"artifact\": \"nifi-websocket-processors-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n+                \"processors\": [\n                     {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-azure-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-websocket-processors-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\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+                        \"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+                        \"multiProcessorUseCases\": [],\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+                                \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n-                                \"name\": \"The name to register ADLSCredentialsService\",\n-                                \"value\": \"The ADLSCredentialsService\"\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"websocket-client-controller-service\",\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\": \"2.0.0-M3\"\n+                                }\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"websocket-client-id\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             }\n-                        ],\n-                        \"group\": \"org.apache.nifi\",\n-                        \"providedApiImplementations\": [\n+                        },\n+                        \"sideEffectFree\": false,\n+                        \"supportedRelationships\": [\n                             {\n-                                \"artifact\": \"nifi-azure-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.services.azure.storage.ADLSCredentialsService\",\n-                                \"version\": \"2.0.0-M3\"\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+                            },\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-                        \"supportsDynamicProperties\": true,\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": false,\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"adls\",\n-                            \"azure\",\n-                            \"cloud\",\n-                            \"credentials\",\n-                            \"microsoft\",\n-                            \"storage\"\n+                            \"WebSocket\",\n+                            \"consume\",\n+                            \"listen\",\n+                            \"subscribe\"\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\": \"2.0.0-M3\"\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+                        \"useCases\": [],\n+                        \"version\": \"2.0.0-M3\",\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+                            }\n+                        ]\n                     },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-azure-nar\",\n+                        \"artifact\": \"nifi-websocket-processors-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\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+                        \"multiProcessorUseCases\": [],\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"blob-name\",\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+                            \"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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"container-name\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"server-url-path\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"storage-credentials-service\": {\n-                                \"description\": \"Controller Service used to obtain Azure Blob Storage Credentials.\",\n-                                \"displayName\": \"Storage Credentials\",\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\": \"storage-credentials-service\",\n+                                \"name\": \"websocket-server-controller-service\",\n                                 \"required\": true,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-azure-services-api-nar\",\n+                                    \"artifact\": \"nifi-websocket-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.services.azure.storage.AzureStorageCredentialsService_v12\",\n+                                    \"type\": \"org.apache.nifi.websocket.WebSocketServerService\",\n                                     \"version\": \"2.0.0-M3\"\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.fileresource.service.api.FileResourceService\",\n-                                \"version\": \"2.0.0-M3\"\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                             }\n                         ],\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.azure.storage.FetchAzureBlobStorage_v12\"\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\n                         ],\n+                        \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"azure\",\n-                            \"blob\",\n-                            \"cloud\",\n-                            \"file\",\n-                            \"microsoft\",\n-                            \"resource\",\n-                            \"storage\"\n+                            \"WebSocket\",\n+                            \"consume\",\n+                            \"listen\",\n+                            \"subscribe\"\n                         ],\n-                        \"type\": \"org.apache.nifi.services.azure.storage.AzureBlobStorageFileResourceService\",\n-                        \"typeDescription\": \"Provides an Azure Blob Storage file resource for other components.\",\n-                        \"version\": \"2.0.0-M3\"\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+                        \"useCases\": [],\n+                        \"version\": \"2.0.0-M3\",\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 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-azure-nar\",\n+                        \"artifact\": \"nifi-websocket-processors-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\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+                        \"multiProcessorUseCases\": [],\n+                        \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"adls-credentials-service\": {\n-                                \"description\": \"Controller Service used to obtain Azure Credentials.\",\n-                                \"displayName\": \"ADLS Credentials\",\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\": \"adls-credentials-service\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"websocket-controller-service-id\",\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\": \"2.0.0-M3\"\n-                                }\n+                                \"sensitive\": false\n                             },\n-                            \"directory-name\": {\n-                                \"defaultValue\": \"${azure.directory}\",\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+                            \"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\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"directory-name\",\n+                                \"name\": \"websocket-endpoint-id\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"file-name\": {\n-                                \"defaultValue\": \"${azure.filename}\",\n-                                \"description\": \"The filename\",\n-                                \"displayName\": \"File Name\",\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\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"file-name\",\n+                                \"name\": \"websocket-message-type\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"filesystem-name\": {\n-                                \"defaultValue\": \"${azure.filesystem}\",\n-                                \"description\": \"Name of the Azure Storage File System (also called Container). It is assumed to be already existing.\",\n-                                \"displayName\": \"Filesystem Name\",\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\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"filesystem-name\",\n+                                \"name\": \"websocket-session-id\",\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.fileresource.service.api.FileResourceService\",\n-                                \"version\": \"2.0.0-M3\"\n+                                \"description\": \"FlowFiles that are sent successfully to the destination are transferred to this relationship.\",\n+                                \"name\": \"success\"\n+                            },\n+                            {\n+                                \"description\": \"FlowFiles that failed to send to the destination are transferred to this relationship.\",\n+                                \"name\": \"failure\"\n                             }\n                         ],\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.azure.storage.FetchAzureDataLakeStorage\"\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\n                         ],\n+                        \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"adlsgen2\",\n-                            \"azure\",\n-                            \"cloud\",\n-                            \"datalake\",\n-                            \"file\",\n-                            \"microsoft\",\n-                            \"resource\",\n-                            \"storage\"\n-                        ],\n-                        \"type\": \"org.apache.nifi.services.azure.storage.AzureDataLakeStorageFileResourceService\",\n-                        \"typeDescription\": \"Provides an Azure Data Lake Storage (ADLS) file resource for other components.\",\n-                        \"version\": \"2.0.0-M3\"\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-azure-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"f2215c6\"\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+                        \"systemResourceConsiderations\": [\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\": \"2.0.0-M3\"\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\": true,\n-                        \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"azure\",\n-                            \"blob\",\n-                            \"cloud\",\n-                            \"credentials\",\n-                            \"microsoft\",\n-                            \"queue\",\n-                            \"storage\"\n+                            \"WebSocket\",\n+                            \"publish\",\n+                            \"send\"\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\": \"2.0.0-M3\"\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+                        \"useCases\": [],\n+                        \"version\": \"2.0.0-M3\",\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+                            }\n+                        ]\n+                    }\n+                ],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\n+        },\n+        {\n+            \"artifact\": \"nifi-lookup-services-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-azure-nar\",\n+                        \"artifact\": \"nifi-lookup-services-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\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-                            \"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+                                        \"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\": \"SAS_TOKEN\",\n-                                \"description\": \"Credentials type to be used for authenticating to Azure\",\n-                                \"displayName\": \"Credentials Type\",\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\": \"credentials-type\",\n+                                \"name\": \"CSV Format\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"managed-identity-client-id\": {\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Character Set\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"managed-identity-client-id\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Comment Marker\",\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\": \"2.0.0-M3\"\n-                                }\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Escape Character\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             },\n-                            \"service-principal-client-id\": {\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\": \"Client ID (or Application ID) of the Client/Application having the Service Principal.\",\n-                                \"displayName\": \"Service Principal Client ID\",\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-id\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Quote Character\",\n                                 \"required\": true,\n-                                \"sensitive\": true\n+                                \"sensitive\": false\n                             },\n-                            \"service-principal-client-secret\": {\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-                                            \"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.\",\n-                                \"displayName\": \"Service Principal Client Secret\",\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\": \"service-principal-client-secret\",\n+                                \"name\": \"Quote Mode\",\n                                 \"required\": true,\n-                                \"sensitive\": true\n+                                \"sensitive\": false\n                             },\n-                            \"service-principal-tenant-id\": {\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-                                            \"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.\",\n-                                \"displayName\": \"Service Principal Tenant ID\",\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\": \"service-principal-tenant-id\",\n+                                \"name\": \"Trim Fields\",\n                                 \"required\": true,\n-                                \"sensitive\": true\n+                                \"sensitive\": false\n                             },\n-                            \"storage-account-key\": {\n+                            \"Value Separator\": {\n+                                \"defaultValue\": \",\",\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"ACCOUNT_KEY\"\n+                                            \"custom\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Credentials Type\",\n-                                        \"propertyName\": \"credentials-type\"\n+                                        \"propertyDisplayName\": \"CSV Format\",\n+                                        \"propertyName\": \"CSV Format\"\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, Managed Identity or Service Principal instead for fine-grained control with policies.\",\n-                                \"displayName\": \"Account Key\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"storage-account-key\",\n-                                \"required\": true,\n-                                \"sensitive\": true\n-                            },\n-                            \"storage-account-name\": {\n-                                \"description\": \"The storage account name.\",\n-                                \"displayName\": \"Storage Account Name\",\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\": \"storage-account-name\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Value Separator\",\n                                 \"required\": true,\n-                                \"sensitive\": true\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+                            \"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\": \"storage-endpoint-suffix\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"csv-file\",\n                                 \"required\": true,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"SINGLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\"\n+                                    ]\n+                                },\n                                 \"sensitive\": false\n                             },\n-                            \"storage-sas-token\": {\n-                                \"dependencies\": [\n+                            \"ignore-duplicates\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"SAS_TOKEN\"\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\": \"Shared Access Signature token (the leading '?' may be included)\",\n-                                \"displayName\": \"SAS Token\",\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\": \"storage-sas-token\",\n+                                \"name\": \"ignore-duplicates\",\n                                 \"required\": true,\n-                                \"sensitive\": 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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"lookup-key-column\",\n+                                \"required\": 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_v12\",\n+                                \"type\": \"org.apache.nifi.lookup.RecordLookupService\",\n+                                \"version\": \"2.0.0-M3\"\n+                            },\n+                            {\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.lookup.LookupService\",\n                                 \"version\": \"2.0.0-M3\"\n                             }\n                         ],\n+                        \"restricted\": true,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"azure\",\n-                            \"blob\",\n-                            \"cloud\",\n-                            \"credentials\",\n-                            \"microsoft\",\n-                            \"queue\",\n-                            \"storage\"\n+                            \"cache\",\n+                            \"csv\",\n+                            \"enrich\",\n+                            \"join\",\n+                            \"key\",\n+                            \"lookup\",\n+                            \"record\",\n+                            \"reloadable\",\n+                            \"value\"\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+                        \"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\": \"2.0.0-M3\"\n-                    }\n-                ],\n-                \"processors\": [\n+                    },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-azure-nar\",\n+                        \"artifact\": \"nifi-lookup-services-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\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-                        \"multiProcessorUseCases\": [],\n-                        \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"azure-cosmos-db-conflict-handling-strategy\": {\n+                            \"character-encoding\": {\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\": \"ISO-8859-1\",\n+                                        \"value\": \"ISO-8859-1\"\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\": \"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\": \"IGNORE\",\n-                                \"description\": \"Choose whether to ignore or upsert when conflict error occurs during insertion\",\n-                                \"displayName\": \"Cosmos DB Conflict Handling 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\": \"azure-cosmos-db-conflict-handling-strategy\",\n-                                \"required\": false,\n+                                \"name\": \"character-encoding\",\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+                            \"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\": \"azure-cosmos-db-connection-service\",\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\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\n+                            },\n+                            {\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.lookup.LookupService\",\n+                                \"version\": \"2.0.0-M3\"\n+                            }\n+                        ],\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"cache\",\n+                            \"distributed\",\n+                            \"enrich\",\n+                            \"key\",\n+                            \"lookup\",\n+                            \"map\",\n+                            \"value\"\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\": \"2.0.0-M3\"\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-lookup-services-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"f2215c6\"\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"2.0.0-M3\"\n+                            },\n+                            {\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.lookup.LookupService\",\n+                                \"version\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\n+                    },\n+                    {\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-lookup-services-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"f2215c6\"\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\": \"proxy-configuration-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.cosmos.AzureCosmosDBConnectionService\",\n+                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n                                     \"version\": \"2.0.0-M3\"\n                                 }\n                             },\n-                            \"azure-cosmos-db-consistency-level\": {\n+                            \"rest-lookup-authentication-strategy\": {\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+                                        \"description\": \"No Authentication\",\n+                                        \"displayName\": \"None\",\n+                                        \"value\": \"NONE\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"CONSISTENT_PREFIX\",\n-                                        \"value\": \"CONSISTENT_PREFIX\"\n+                                        \"description\": \"Basic Authentication\",\n+                                        \"displayName\": \"Basic\",\n+                                        \"value\": \"BASIC\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"EVENTUAL\",\n-                                        \"value\": \"EVENTUAL\"\n+                                        \"description\": \"OAuth2 Authentication\",\n+                                        \"displayName\": \"OAuth2\",\n+                                        \"value\": \"OAUTH2\"\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+                                \"defaultValue\": \"NONE\",\n+                                \"description\": \"Authentication strategy to use with REST service.\",\n+                                \"displayName\": \"Authentication Strategy\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"azure-cosmos-db-consistency-level\",\n+                                \"name\": \"rest-lookup-authentication-strategy\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"rest-lookup-basic-auth-password\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"BASIC\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Authentication Strategy\",\n+                                        \"propertyName\": \"rest-lookup-authentication-strategy\"\n+                                    }\n+                                ],\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"rest-lookup-basic-auth-password\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n+                            },\n+                            \"rest-lookup-basic-auth-username\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"BASIC\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Authentication Strategy\",\n+                                        \"propertyName\": \"rest-lookup-authentication-strategy\"\n+                                    }\n+                                ],\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"rest-lookup-basic-auth-username\",\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+                            \"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\": \"azure-cosmos-db-container-id\",\n+                                \"name\": \"rest-lookup-connection-timeout\",\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+                            \"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+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"BASIC\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Authentication Strategy\",\n+                                        \"propertyName\": \"rest-lookup-authentication-strategy\"\n+                                    }\n+                                ],\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\": \"azure-cosmos-db-key\",\n+                                \"name\": \"rest-lookup-digest-auth\",\n                                 \"required\": false,\n-                                \"sensitive\": true\n+                                \"sensitive\": false\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+                            \"rest-lookup-oauth2-access-token-provider\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"OAUTH2\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Authentication Strategy\",\n+                                        \"propertyName\": \"rest-lookup-authentication-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"Enables managed retrieval of OAuth2 Bearer Token applied to HTTP requests using the Authorization Header.\",\n+                                \"displayName\": \"OAuth2 Access Token Provider\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"azure-cosmos-db-name\",\n+                                \"name\": \"rest-lookup-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\": \"2.0.0-M3\"\n+                                }\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+                            \"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\": \"azure-cosmos-db-partition-key\",\n+                                \"name\": \"rest-lookup-read-timeout\",\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+                            \"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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"azure-cosmos-db-uri\",\n-                                \"required\": false,\n-                                \"sensitive\": true\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\": \"2.0.0-M3\"\n+                                }\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+                            \"rest-lookup-response-handling-strategy\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Successful and unsuccessful HTTP responses are returned.\",\n+                                        \"displayName\": \"Returned\",\n+                                        \"value\": \"RETURNED\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Successful HTTP responses are returned and unsuccessful HTTP responses generate an exception.\",\n+                                        \"displayName\": \"Evaluated\",\n+                                        \"value\": \"EVALUATED\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"RETURNED\",\n+                                \"description\": \"Whether to return all responses or throw errors for unsuccessful HTTP status codes.\",\n+                                \"displayName\": \"Response Handling Strategy\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"insert-batch-size\",\n-                                \"required\": false,\n+                                \"name\": \"rest-lookup-response-handling-strategy\",\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+                            \"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\": \"record-reader\",\n-                                \"required\": true,\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.serialization.RecordReaderFactory\",\n+                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n                                     \"version\": \"2.0.0-M3\"\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\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"rest-lookup-url\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             }\n                         },\n-                        \"sideEffectFree\": false,\n-                        \"supportedRelationships\": [\n+                        \"providedApiImplementations\": [\n                             {\n-                                \"description\": \"All FlowFiles that are written to Cosmos DB 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.RecordLookupService\",\n+                                \"version\": \"2.0.0-M3\"\n                             },\n                             {\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-                        ],\n-                        \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": 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+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.lookup.LookupService\",\n+                                \"version\": \"2.0.0-M3\"\n                             }\n                         ],\n+                        \"supportsDynamicProperties\": true,\n+                        \"supportsSensitiveDynamicProperties\": true,\n                         \"tags\": [\n-                            \"azure\",\n-                            \"cosmos\",\n-                            \"insert\",\n-                            \"put\",\n-                            \"record\"\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.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-                        \"useCases\": [],\n+                        \"type\": \"org.apache.nifi.lookup.RestLookupService\",\n+                        \"typeDescription\": \"Use a REST service to look up values.\",\n                         \"version\": \"2.0.0-M3\"\n                     },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-azure-nar\",\n+                        \"artifact\": \"nifi-lookup-services-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\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 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-                        \"multiProcessorUseCases\": [],\n-                        \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Data Format\": {\n+                            \"CSV Format\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"An Avro format with support for logical types and for the snappy compression codec\",\n-                                        \"displayName\": \"avro\",\n-                                        \"value\": \"avro\"\n-                                    },\n-                                    {\n-                                        \"description\": \"An Avro format with support for logical types and for the snappy compression codec.\",\n-                                        \"displayName\": \"apacheavro\",\n-                                        \"value\": \"apacheavro\"\n-                                    },\n-                                    {\n-                                        \"description\": \"A text file with comma-separated values (,). For more information, see RFC 4180: Common Format and MIME Type for Comma-Separated Values (CSV) Files.\",\n-                                        \"displayName\": \"csv\",\n-                                        \"value\": \"csv\"\n-                                    },\n-                                    {\n-                                        \"description\": \"A text file containing JSON objects separated by \\\\n or \\\\r\\\\n. For more information, see JSON Lines (JSONL).\",\n-                                        \"displayName\": \"json\",\n-                                        \"value\": \"json\"\n-                                    },\n-                                    {\n-                                        \"description\": \"A text file containing a JSON array of property containers (each representing a record) or any number of property containers separated by spaces, \\\\n or \\\\r\\\\n. Each property container may be spread across multiple lines. This format is preferable to JSON unless the data is not property containers.\",\n-                                        \"displayName\": \"multijson\",\n-                                        \"value\": \"multijson\"\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\": \"An ORC file.\",\n-                                        \"displayName\": \"orc\",\n-                                        \"value\": \"orc\"\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\": \"A parquet file.\",\n-                                        \"displayName\": \"parquet\",\n-                                        \"value\": \"parquet\"\n+                                        \"description\": \"CSV data follows the format used by Microsoft Excel\",\n+                                        \"displayName\": \"Microsoft Excel\",\n+                                        \"value\": \"excel\"\n                                     },\n                                     {\n-                                        \"description\": \"A text file with values separated by vertical bars (|).\",\n-                                        \"displayName\": \"psv\",\n-                                        \"value\": \"psv\"\n+                                        \"description\": \"CSV data is Tab-Delimited instead of Comma Delimited\",\n+                                        \"displayName\": \"Tab-Delimited\",\n+                                        \"value\": \"tdf\"\n                                     },\n                                     {\n-                                        \"description\": \"A text file with values separated by semicolons (;).\",\n-                                        \"displayName\": \"scsv\",\n-                                        \"value\": \"scsv\"\n+                                        \"description\": \"CSV data follows the format used by MySQL\",\n+                                        \"displayName\": \"MySQL Format\",\n+                                        \"value\": \"mysql\"\n                                     },\n                                     {\n-                                        \"description\": \"A text file with SOH-separated values. (SOH is the ASCII code point 1. This format is used by Hive in HDInsight).\",\n-                                        \"displayName\": \"sohsv\",\n-                                        \"value\": \"sohsv\"\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\": \"A text file with tab delimited values (\\\\t).\",\n-                                        \"displayName\": \"tsv\",\n-                                        \"value\": \"tsv\"\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\": \"A text file with tab-delimited values (\\\\t). A backslash (\\\\) is used as escape character.\",\n-                                        \"displayName\": \"tsve\",\n-                                        \"value\": \"tsve\"\n+                                        \"description\": \"Same as custom format. Available for compatibility reasons.\",\n+                                        \"displayName\": \"Default Format\",\n+                                        \"value\": \"default\"\n                                     },\n                                     {\n-                                        \"description\": \"A text file with lines separated by \\\\n. Empty lines are skipped\",\n-                                        \"displayName\": \"txt\",\n-                                        \"value\": \"txt\"\n+                                        \"description\": \"Same as RFC 4180. Available for compatibility reasons.\",\n+                                        \"displayName\": \"RFC4180\",\n+                                        \"value\": \"RFC4180\"\n                                     }\n                                 ],\n-                                \"description\": \"The format of the data that is sent to Azure Data Explorer. Supported formats include: avro, csv, json\",\n-                                \"displayName\": \"Data Format\",\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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Data Format\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"CSV Format\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Database Name\": {\n-                                \"description\": \"Azure Data Explorer Database Name for ingesting data\",\n-                                \"displayName\": \"Database Name\",\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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Database Name\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Character Set\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Ingest Mapping Name\": {\n-                                \"description\": \"The name of the mapping responsible for storing the data in the appropriate columns.\",\n-                                \"displayName\": \"Ingest Mapping Name\",\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\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Ingest Mapping Name\",\n+                                \"name\": \"Comment Marker\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Ingest Status Polling Interval\": {\n-                                \"defaultValue\": \"5 s\",\n+                            \"Escape Character\": {\n+                                \"defaultValue\": \"\\\\\",\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"true\"\n+                                            \"custom\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Poll for Ingest Status\",\n-                                        \"propertyName\": \"Poll for Ingest Status\"\n+                                        \"propertyDisplayName\": \"CSV Format\",\n+                                        \"propertyName\": \"CSV Format\"\n                                     }\n                                 ],\n-                                \"description\": \"Defines the value of interval of time to poll for ingestion status\",\n-                                \"displayName\": \"Ingest Status Polling Interval\",\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\": \"Ingest Status Polling Interval\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Escape Character\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Ingest Status Polling Timeout\": {\n-                                \"defaultValue\": \"5 m\",\n+                            \"Quote Character\": {\n+                                \"defaultValue\": \"\\\"\",\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"true\"\n+                                            \"custom\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Poll for Ingest Status\",\n-                                        \"propertyName\": \"Poll for Ingest Status\"\n+                                        \"propertyDisplayName\": \"CSV Format\",\n+                                        \"propertyName\": \"CSV Format\"\n                                     }\n                                 ],\n-                                \"description\": \"Defines the total amount time to poll for ingestion status\",\n-                                \"displayName\": \"Ingest Status Polling Timeout\",\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\": \"Ingest Status Polling Timeout\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Quote Character\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Ingestion Ignore First Record\": {\n+                            \"Quote Mode\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"description\": \"All values will be quoted using the configured quote character.\",\n+                                        \"displayName\": \"Quote All Values\",\n+                                        \"value\": \"ALL\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Defines whether ignore first record while ingestion.\",\n-                                \"displayName\": \"Ingestion Ignore First Record\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Ingestion Ignore First Record\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Kusto Ingest Service\": {\n-                                \"description\": \"Azure Data Explorer Kusto Ingest Service\",\n-                                \"displayName\": \"Kusto Ingest Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Kusto Ingest 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.data.explorer.KustoIngestService\",\n-                                    \"version\": \"2.0.0-M3\"\n-                                }\n-                            },\n-                            \"Partially Succeeded Routing Strategy\": {\n-                                \"allowableValues\": [\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\": \"\",\n-                                        \"displayName\": \"success\",\n-                                        \"value\": \"success\"\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\": \"\",\n-                                        \"displayName\": \"failure\",\n-                                        \"value\": \"failure\"\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\": \"failure\",\n-                                \"description\": \"Defines where to route FlowFiles that resulted in a partially succeeded status.\",\n-                                \"displayName\": \"Partially Succeeded Routing 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\": \"Partially Succeeded Routing Strategy\",\n+                                \"name\": \"Quote Mode\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Poll for Ingest Status\": {\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\": \"false\",\n-                                \"description\": \"Determines whether to poll on ingestion status after an ingestion to Azure Data Explorer is completed\",\n-                                \"displayName\": \"Poll for Ingest Status\",\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\": \"Poll for Ingest Status\",\n+                                \"name\": \"Trim Fields\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Streaming Enabled\": {\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\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Value Separator\",\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"csv-file\",\n+                                \"required\": true,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"SINGLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\"\n+                                    ]\n+                                },\n+                                \"sensitive\": false\n+                            },\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\": \"false\",\n-                                \"description\": \"Whether to stream data to Azure Data Explorer.\",\n-                                \"displayName\": \"Streaming Enabled\",\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\": \"Streaming Enabled\",\n+                                \"name\": \"ignore-duplicates\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Table Name\": {\n-                                \"description\": \"Azure Data Explorer Table Name for ingesting data\",\n-                                \"displayName\": \"Table Name\",\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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Table Name\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"lookup-value-column\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"sideEffectFree\": false,\n-                        \"supportedRelationships\": [\n+                        \"providedApiImplementations\": [\n                             {\n-                                \"description\": \"Ingest processing succeeded\",\n-                                \"name\": \"success\"\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.lookup.StringLookupService\",\n+                                \"version\": \"2.0.0-M3\"\n                             },\n                             {\n-                                \"description\": \"Ingest processing failed\",\n-                                \"name\": \"failure\"\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.lookup.LookupService\",\n+                                \"version\": \"2.0.0-M3\"\n                             }\n                         ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": false,\n+                        \"restricted\": true,\n                         \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"ADX\",\n-                            \"Azure\",\n-                            \"Data\",\n-                            \"Explorer\",\n-                            \"Kusto\"\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.azure.data.explorer.PutAzureDataExplorer\",\n-                        \"typeDescription\": \"Acts as an Azure Data Explorer sink which sends FlowFiles to the provided endpoint. Data can be sent through queued ingestion or streaming ingestion to the Azure Data Explorer cluster.\",\n-                        \"useCases\": [],\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\": \"2.0.0-M3\"\n                     },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-azure-nar\",\n+                        \"artifact\": \"nifi-lookup-services-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\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-                        \"multiProcessorUseCases\": [],\n-                        \"primaryNodeOnly\": false,\n-                        \"propertyDescriptors\": {\n-                            \"Database Name\": {\n-                                \"description\": \"Azure Data Explorer Database Name for querying\",\n-                                \"displayName\": \"Database Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Database Name\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Kusto Query Service\": {\n-                                \"description\": \"Azure Data Explorer Kusto Query Service\",\n-                                \"displayName\": \"Kusto Query Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Kusto Query 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.data.explorer.KustoQueryService\",\n-                                    \"version\": \"2.0.0-M3\"\n-                                }\n-                            },\n-                            \"Query\": {\n-                                \"description\": \"Query to be run against Azure Data Explorer\",\n-                                \"displayName\": \"Query\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Query\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n+                        \"dynamicProperties\": [\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\": \"ENVIRONMENT\",\n+                                \"name\": \"A key that can be looked up\",\n+                                \"value\": \"The value for the key\"\n                             }\n-                        },\n-                        \"sideEffectFree\": false,\n-                        \"supportedRelationships\": [\n+                        ],\n+                        \"group\": \"org.apache.nifi\",\n+                        \"providedApiImplementations\": [\n                             {\n-                                \"description\": \"FlowFiles containing results of a successful Query\",\n-                                \"name\": \"success\"\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.lookup.StringLookupService\",\n+                                \"version\": \"2.0.0-M3\"\n                             },\n                             {\n-                                \"description\": \"FlowFiles containing original input associated with a failed Query\",\n-                                \"name\": \"failure\"\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.lookup.LookupService\",\n+                                \"version\": \"2.0.0-M3\"\n                             }\n                         ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n+                        \"supportsDynamicProperties\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"ADX\",\n-                            \"Azure\",\n-                            \"Data\",\n-                            \"Explorer\",\n-                            \"Kusto\"\n+                            \"enrich\",\n+                            \"key\",\n+                            \"lookup\",\n+                            \"value\"\n                         ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.azure.data.explorer.QueryAzureDataExplorer\",\n-                        \"typeDescription\": \"Query Azure Data Explorer and stream JSON results to output FlowFiles\",\n-                        \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"Azure Data Explorer query error message on failures\",\n-                                \"name\": \"query.error.message\"\n-                            },\n-                            {\n-                                \"description\": \"Azure Data Explorer query executed\",\n-                                \"name\": \"query.executed\"\n-                            },\n-                            {\n-                                \"description\": \"Content Type set to application/json\",\n-                                \"name\": \"mime.type\"\n-                            }\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\": \"2.0.0-M3\"\n                     },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-azure-nar\",\n+                        \"artifact\": \"nifi-lookup-services-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\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 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-                        \"multiProcessorUseCases\": [],\n-                        \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\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+                            \"configuration-file\": {\n+                                \"description\": \"A configuration file\",\n+                                \"displayName\": \"Configuration File\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Service Bus Endpoint\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"2.0.0-M3\"\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+                            {\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.lookup.LookupService\",\n+                                \"version\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-lookup-services-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"f2215c6\"\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                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Transport Type\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Cache Expiration\",\n+                                \"required\": false,\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-                                    {\n-                                        \"description\": \"Use component state to store partition ownership and checkpoint information\",\n-                                        \"displayName\": \"Component State\",\n-                                        \"value\": \"COMPONENT_STATE\"\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+                            \"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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"checkpoint-strategy\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"dbf-default-precision\",\n                                 \"required\": true,\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+                            \"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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"event-hub-batch-size\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"dbf-default-scale\",\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+                            \"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\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"event-hub-consumer-group\",\n+                                \"name\": \"dbrecord-lookup-cache-size\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"event-hub-initial-offset\": {\n+                            \"dbrecord-lookup-clear-cache-on-enabled\": {\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\": \"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\": \"event-hub-initial-offset\",\n+                                \"name\": \"dbrecord-lookup-clear-cache-on-enabled\",\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+                            \"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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"event-hub-message-receive-timeout\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"dbrecord-lookup-dbcp-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\": \"2.0.0-M3\"\n+                                }\n                             },\n-                            \"event-hub-name\": {\n-                                \"description\": \"The name of the event hub to pull messages from.\",\n-                                \"displayName\": \"Event Hub Name\",\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\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"event-hub-name\",\n+                                \"name\": \"dbrecord-lookup-key-column\",\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+                            \"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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"event-hub-namespace\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"dbrecord-lookup-table-name\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"event-hub-prefetch-count\": {\n-                                \"defaultValue\": \"300\",\n-                                \"description\": \"\",\n-                                \"displayName\": \"Prefetch Count\",\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"event-hub-prefetch-count\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"dbrecord-lookup-value-columns\",\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.RecordLookupService\",\n+                                \"version\": \"2.0.0-M3\"\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+                            {\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.lookup.LookupService\",\n+                                \"version\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-lookup-services-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"f2215c6\"\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                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"event-hub-shared-access-policy-name\",\n+                                \"name\": \"Cache Expiration\",\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+                            \"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\": \"event-hub-shared-access-policy-primary-key\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"dbrecord-lookup-cache-size\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             },\n-                            \"proxy-configuration-service\": {\n-                                \"dependencies\": [\n+                            \"dbrecord-lookup-clear-cache-on-enabled\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"AmqpWebSockets\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Transport Type\",\n-                                        \"propertyName\": \"Transport 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 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\": \"2.0.0-M3\"\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+                                \"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\": \"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\": \"2.0.0-M3\"\n-                                }\n+                                \"name\": \"dbrecord-lookup-clear-cache-on-enabled\",\n+                                \"required\": true,\n+                                \"sensitive\": false\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+                            \"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\": \"record-writer\",\n-                                \"required\": false,\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.serialization.RecordSetWriterFactory\",\n+                                    \"type\": \"org.apache.nifi.dbcp.DBCPService\",\n                                     \"version\": \"2.0.0-M3\"\n                                 }\n                             },\n-                            \"storage-account-key\": {\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 account key to store event hub consumer group state.\",\n-                                \"displayName\": \"Storage Account Key\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"storage-account-key\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n-                            },\n-                            \"storage-account-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 account to store event hub consumer group state.\",\n-                                \"displayName\": \"Storage Account Name\",\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\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"storage-account-name\",\n+                                \"name\": \"dbrecord-lookup-key-column\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\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+                            \"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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"storage-container-name\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"dbrecord-lookup-table-name\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\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+                            \"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\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"storage-sas-token\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n-                            },\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\": \"use-managed-identity\",\n+                                \"name\": \"lookup-value-column\",\n                                 \"required\": true,\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-                                \"LOCAL\",\n-                                \"CLUSTER\"\n-                            ]\n-                        },\n-                        \"supportedRelationships\": [\n+                        \"providedApiImplementations\": [\n                             {\n-                                \"description\": \"FlowFiles received from Event Hub.\",\n-                                \"name\": \"success\"\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.lookup.StringLookupService\",\n+                                \"version\": \"2.0.0-M3\"\n+                            },\n+                            {\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.lookup.LookupService\",\n+                                \"version\": \"2.0.0-M3\"\n                             }\n                         ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"azure\",\n-                            \"cloud\",\n-                            \"eventhub\",\n-                            \"events\",\n-                            \"microsoft\",\n-                            \"streaming\",\n-                            \"streams\"\n+                            \"cache\",\n+                            \"database\",\n+                            \"enrich\",\n+                            \"join\",\n+                            \"key\",\n+                            \"lookup\",\n+                            \"rdbms\",\n+                            \"reloadable\",\n+                            \"value\"\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-                        \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\",\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+                        \"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\": \"2.0.0-M3\"\n                     },\n                     {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-azure-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-lookup-services-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\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-                        \"multiProcessorUseCases\": [],\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Event Hub Consumer Group\",\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Event Hub Message Enqueue Time\",\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+                            \"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\": \"Event Hub Name\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"database-file\",\n                                 \"required\": true,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"SINGLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\"\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+                            \"lookup-anonymous-ip\": {\n+                                \"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                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Event Hub Namespace\",\n+                                \"name\": \"lookup-anonymous-ip\",\n                                 \"required\": true,\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Partition Receiver Timeout (millseconds)\",\n-                                \"required\": false,\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Partition Recivier Fetch Size\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Service Bus Endpoint\": {\n+                            \"lookup-city\": {\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+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n-                                        \"description\": \"Servicebus endpoint for US Government\",\n-                                        \"displayName\": \"Azure US Government\",\n-                                        \"value\": \".servicebus.usgovcloudapi.net\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\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\": \"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\": \"Service Bus Endpoint\",\n+                                \"name\": \"lookup-city\",\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-                                \"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+                            \"lookup-connection-type\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"AMQP over TCP on ports 5671 and 5672\",\n-                                        \"displayName\": \"AMQP\",\n-                                        \"value\": \"Amqp\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n-                                        \"description\": \"AMQP over HTTPS with WebSockets on port 443\",\n-                                        \"displayName\": \"AMQP_WEB_SOCKETS\",\n-                                        \"value\": \"AmqpWebSockets\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\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\": \"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\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Transport Type\",\n+                                \"name\": \"lookup-connection-type\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"proxy-configuration-service\": {\n-                                \"dependencies\": [\n+                            \"lookup-domain\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"AmqpWebSockets\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Transport Type\",\n-                                        \"propertyName\": \"Transport 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 Proxy Configuration Controller Service to proxy network requests. Supported proxies: HTTP + AuthN\",\n-                                \"displayName\": \"Proxy Configuration Service\",\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\": \"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\": \"2.0.0-M3\"\n-                                }\n+                                \"name\": \"lookup-domain\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             },\n-                            \"use-managed-identity\": {\n+                            \"lookup-isp\": {\n                                 \"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+                                \"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\": \"use-managed-identity\",\n+                                \"name\": \"lookup-isp\",\n                                 \"required\": true,\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.lookup.RecordLookupService\",\n+                                \"version\": \"2.0.0-M3\"\n+                            },\n+                            {\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.lookup.LookupService\",\n+                                \"version\": \"2.0.0-M3\"\n                             }\n                         ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"azure\",\n-                            \"cloud\",\n-                            \"eventhub\",\n-                            \"events\",\n-                            \"microsoft\",\n-                            \"streaming\",\n-                            \"streams\"\n+                            \"anonymous\",\n+                            \"cellular\",\n+                            \"domain\",\n+                            \"enrich\",\n+                            \"geo\",\n+                            \"ip\",\n+                            \"ipgeo\",\n+                            \"isp\",\n+                            \"lookup\",\n+                            \"maxmind\",\n+                            \"tor\"\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-                        \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\",\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-                    },\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\": \"2.0.0-M3\"\n+                    }\n+                ],\n+                \"processors\": [],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"2.0.0-M3\"\n+        },\n+        {\n+            \"artifact\": \"nifi-poi-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [\n                     {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-azure-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-poi-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\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-                        \"multiProcessorUseCases\": [],\n-                        \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Event Hub Name\": {\n-                                \"description\": \"Name of Azure Event Hubs destination\",\n-                                \"displayName\": \"Event Hub 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\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Event Hub Name\",\n-                                \"required\": true,\n+                                \"name\": \"Date 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+                            \"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\": \"Event Hub Namespace\",\n+                                \"name\": \"Password\",\n                                 \"required\": true,\n-                                \"sensitive\": false\n+                                \"sensitive\": true\n                             },\n-                            \"Service Bus Endpoint\": {\n+                            \"Protection Type\": {\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+                                        \"description\": \"An Excel spreadsheet not protected by a password\",\n+                                        \"displayName\": \"Unprotected\",\n+                                        \"value\": \"UNPROTECTED\"\n                                     },\n                                     {\n-                                        \"description\": \"Servicebus endpoint for US Government\",\n-                                        \"displayName\": \"Azure US Government\",\n-                                        \"value\": \".servicebus.usgovcloudapi.net\"\n+                                        \"description\": \"An Excel spreadsheet protected by a password\",\n+                                        \"displayName\": \"Password Protected\",\n+                                        \"value\": \"PASSWORD\"\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\": \"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\": \"Service Bus Endpoint\",\n+                                \"name\": \"Protection Type\",\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+                            \"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\": \"Environment variables 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\": \"Environment variables 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\": \"Shared Access Policy Name\",\n+                                \"name\": \"Time Format\",\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+                            \"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\": \"Shared Access Policy Primary Key\",\n+                                \"name\": \"Timestamp Format\",\n                                 \"required\": false,\n-                                \"sensitive\": true\n+                                \"sensitive\": false\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 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\": \"AMQP over HTTPS with WebSockets on port 443\",\n-                                        \"displayName\": \"AMQP_WEB_SOCKETS\",\n-                                        \"value\": \"AmqpWebSockets\"\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 schema reference information will be provided through a configured Schema Reference Reader service implementation.\",\n+                                        \"displayName\": \"Schema Reference Reader\",\n+                                        \"value\": \"schema-reference-reader\"\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\": \"Amqp\",\n-                                \"description\": \"Advanced Message Queuing Protocol Transport Type for communication with Azure Event Hubs\",\n-                                \"displayName\": \"Transport 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\": \"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\": \"Environment variables 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\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"schema-name\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"proxy-configuration-service\": {\n+                            \"schema-reference-reader\": {\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"AmqpWebSockets\"\n+                                            \"schema-reference-reader\"\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\": \"Service implementation responsible for reading FlowFile attributes or content to determine the Schema Reference Identifier\",\n+                                \"displayName\": \"Schema Reference Reader\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"proxy-configuration-service\",\n-                                \"required\": false,\n+                                \"name\": \"schema-reference-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.schemaregistry.services.SchemaReferenceReader\",\n                                     \"version\": \"2.0.0-M3\"\n                                 }\n                             },\n-                            \"use-managed-identity\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n+                            \"schema-registry\": {\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"dependentValues\": [\n+                                            \"schema-reference-reader\",\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 Controller Service to use for the Schema Registry\",\n+                                \"displayName\": \"Schema Registry\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"use-managed-identity\",\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.schemaregistry.services.SchemaRegistry\",\n+                                    \"version\": \"2.0.0-M3\"\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\": \"Environment variables 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\": \"Environment variables 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\": \"2.0.0-M3\"\n                             }\n                         ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": 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+                            \"cell\",\n+                            \"excel\",\n+                            \"parse\",\n+                            \"reader\",\n+                            \"record\",\n+                            \"row\",\n+                            \"spreadsheet\",\n+                            \"values\",\n+                            \"xlsx\"\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-                        \"useCases\": [],\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\": \"2.0.0-M3\"\n-                    },\n+                    }\n+                ],\n+                \"processors\": [],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"2.0.0-M3\"\n+        },\n+        {\n+            \"artifact\": \"nifi-jolt-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n+                \"processors\": [\n                     {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-azure-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-jolt-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -3611,243 +4103,232 @@\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"multiProcessorUseCases\": [],\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Source Blob Name\": {\n-                                \"description\": \"The full name of the source blob\",\n-                                \"displayName\": \"Source Blob Name\",\n+                            \"Custom Module Directory\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"jolt-transform-custom\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Jolt Transform\",\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                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Source Blob Name\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Custom Module Directory\",\n+                                \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"MULTIPLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\",\n+                                        \"DIRECTORY\"\n+                                    ]\n+                                },\n                                 \"sensitive\": false\n                             },\n-                            \"Source Container Name\": {\n-                                \"description\": \"Name of the Azure storage container that will be copied\",\n-                                \"displayName\": \"Source Container Name\",\n+                            \"Custom Transformation Class Name\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"jolt-transform-custom\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Jolt Transform\",\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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Source Container Name\",\n-                                \"required\": true,\n+                                \"name\": \"Custom Transformation Class Name\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Source Storage Credentials\": {\n-                                \"description\": \"Credentials Service used to obtain Azure Blob Storage Credentials to read Source Blob information\",\n-                                \"displayName\": \"Source Storage Credentials\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Source Storage Credentials\",\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\": \"2.0.0-M3\"\n-                                }\n-                            },\n-                            \"blob-name\": {\n-                                \"description\": \"The full name of the destination blob defaults to the Source Blob Name when not specified\",\n-                                \"displayName\": \"Destination Blob Name\",\n+                            \"Jolt Specification\": {\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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"blob-name\",\n+                                \"name\": \"Jolt Specification\",\n                                 \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"SINGLE\",\n+                                    \"resourceTypes\": [\n+                                        \"TEXT\",\n+                                        \"FILE\"\n+                                    ]\n+                                },\n                                 \"sensitive\": false\n                             },\n-                            \"conflict-resolution-strategy\": {\n+                            \"Jolt Transform\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Fail if the blob already exists\",\n-                                        \"displayName\": \"fail\",\n-                                        \"value\": \"FAIL_RESOLUTION\"\n+                                        \"description\": \"Shift input JSON/data to create the output JSON.\",\n+                                        \"displayName\": \"Shift\",\n+                                        \"value\": \"jolt-transform-shift\"\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\": \"Execute list of Jolt transformations.\",\n+                                        \"displayName\": \"Chain\",\n+                                        \"value\": \"jolt-transform-chain\"\n                                     },\n                                     {\n-                                        \"description\": \"Replace blob contents if the blob already exist\",\n-                                        \"displayName\": \"replace\",\n-                                        \"value\": \"REPLACE_RESOLUTION\"\n+                                        \"description\": \"Apply default values to the output JSON.\",\n+                                        \"displayName\": \"Default\",\n+                                        \"value\": \"jolt-transform-default\"\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\": \"Change the cardinality of input elements to create the output JSON.\",\n+                                        \"displayName\": \"Cardinality\",\n+                                        \"value\": \"jolt-transform-card\"\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+                                        \"description\": \"Writes when key is missing or value is null\",\n+                                        \"displayName\": \"Modify - Default\",\n+                                        \"value\": \"jolt-transform-modify-default\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Always overwrite value\",\n+                                        \"displayName\": \"Modify - Overwrite\",\n+                                        \"value\": \"jolt-transform-modify-overwrite\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Writes when key is missing\",\n+                                        \"displayName\": \"Modify - Define\",\n+                                        \"value\": \"jolt-transform-modify-define\"\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\": \"jolt-transform-chain\",\n+                                \"description\": \"Specifies the Jolt Transformation that should be used with the provided specification.\",\n+                                \"displayName\": \"Jolt Transform\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"conflict-resolution-strategy\",\n+                                \"name\": \"Jolt Transform\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"container-name\": {\n-                                \"description\": \"Name of the Azure storage container destination defaults to the Source Container Name when not specified\",\n-                                \"displayName\": \"Destination Container Name\",\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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"container-name\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Max String Length\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"create-container\": {\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\": \"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\": \"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\": \"create-container\",\n+                                \"name\": \"Pretty Print\",\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\": \"2.0.0-M3\"\n-                                }\n-                            },\n-                            \"storage-credentials-service\": {\n-                                \"description\": \"Controller Service used to obtain Azure Blob Storage Credentials.\",\n-                                \"displayName\": \"Destination Storage Credentials\",\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\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"storage-credentials-service\",\n+                                \"name\": \"Transform Cache Size\",\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\": \"2.0.0-M3\"\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.azure.storage.PutAzureBlobStorage_v12\"\n-                        ],\n-                        \"sideEffectFree\": false,\n+                        \"sideEffectFree\": true,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"All successfully processed FlowFiles are routed to this relationship\",\n+                                \"description\": \"The FlowFile with transformed content will be routed to this relationship\",\n                                 \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"Unsuccessful operations will be transferred to the failure relationship.\",\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                         ],\n-                        \"supportsBatching\": false,\n+                        \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"azure\",\n-                            \"blob\",\n-                            \"cloud\",\n-                            \"microsoft\",\n-                            \"storage\"\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.azure.storage.CopyAzureBlobStorage_v12\",\n-                        \"typeDescription\": \"Copies a blob in Azure Blob Storage from one account/container to another. The processor uses Azure Blob Storage client library v12.\",\n+                        \"type\": \"org.apache.nifi.processors.jolt.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                         \"useCases\": [],\n                         \"version\": \"2.0.0-M3\",\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+                                \"description\": \"Always set to application/json\",\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-                            },\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\": false,\n-                        \"artifact\": \"nifi-azure-nar\",\n+                        \"artifact\": \"nifi-jolt-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -3860,4588 +4341,8994 @@\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"multiProcessorUseCases\": [],\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+                            \"Custom Module Directory\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"jolt-transform-custom\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Jolt Transform\",\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Custom Module Directory\",\n+                                \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"MULTIPLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\",\n+                                        \"DIRECTORY\"\n+                                    ]\n+                                },\n+                                \"sensitive\": false\n+                            },\n+                            \"Custom Transformation Class Name\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"jolt-transform-custom\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Jolt Transform\",\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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"blob-name\",\n-                                \"required\": true,\n+                                \"name\": \"Custom Transformation Class Name\",\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+                            \"Jolt Specification\": {\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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"container-name\",\n-                                \"required\": true,\n+                                \"name\": \"Jolt Specification\",\n+                                \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"SINGLE\",\n+                                    \"resourceTypes\": [\n+                                        \"TEXT\",\n+                                        \"FILE\"\n+                                    ]\n+                                },\n                                 \"sensitive\": false\n                             },\n-                            \"delete-snapshots-option\": {\n+                            \"Jolt Transform\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Delete the blob only.\",\n-                                        \"displayName\": \"None\",\n-                                        \"value\": \"NONE\"\n+                                        \"description\": \"Shift input JSON/data to create the output JSON.\",\n+                                        \"displayName\": \"Shift\",\n+                                        \"value\": \"jolt-transform-shift\"\n                                     },\n                                     {\n-                                        \"description\": \"Delete the blob and its snapshots.\",\n-                                        \"displayName\": \"Include Snapshots\",\n-                                        \"value\": \"INCLUDE\"\n+                                        \"description\": \"Execute list of Jolt transformations.\",\n+                                        \"displayName\": \"Chain\",\n+                                        \"value\": \"jolt-transform-chain\"\n                                     },\n                                     {\n-                                        \"description\": \"Delete only the blob's snapshots.\",\n-                                        \"displayName\": \"Delete Snapshots Only\",\n-                                        \"value\": \"ONLY\"\n+                                        \"description\": \"Apply default values to the output JSON.\",\n+                                        \"displayName\": \"Default\",\n+                                        \"value\": \"jolt-transform-default\"\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\": \"Change the cardinality of input elements to create the output JSON.\",\n+                                        \"displayName\": \"Cardinality\",\n+                                        \"value\": \"jolt-transform-card\"\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+                                        \"description\": \"Writes when key is missing or value is null\",\n+                                        \"displayName\": \"Modify - Default\",\n+                                        \"value\": \"jolt-transform-modify-default\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Always overwrite value\",\n+                                        \"displayName\": \"Modify - Overwrite\",\n+                                        \"value\": \"jolt-transform-modify-overwrite\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Writes when key is missing\",\n+                                        \"displayName\": \"Modify - Define\",\n+                                        \"value\": \"jolt-transform-modify-define\"\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\": \"jolt-transform-chain\",\n+                                \"description\": \"Specifies the Jolt Transformation that should be used with the provided specification.\",\n+                                \"displayName\": \"Jolt Transform\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"delete-snapshots-option\",\n+                                \"name\": \"Jolt Transform\",\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+                            \"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\": \"proxy-configuration-service\",\n-                                \"required\": false,\n+                                \"name\": \"Transform Cache Size\",\n+                                \"required\": true,\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.proxy.ProxyConfigurationService\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n                                     \"version\": \"2.0.0-M3\"\n                                 }\n                             },\n-                            \"storage-credentials-service\": {\n-                                \"description\": \"Controller Service used to obtain Azure Blob Storage Credentials.\",\n-                                \"displayName\": \"Storage Credentials\",\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\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"storage-credentials-service\",\n+                                \"name\": \"jolt-record-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_v12\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n                                     \"version\": \"2.0.0-M3\"\n                                 }\n                             }\n                         },\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.azure.storage.CopyAzureBlobStorage_v12\",\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+                        \"sideEffectFree\": true,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"All successfully processed FlowFiles are routed to this relationship\",\n-                                \"name\": \"success\"\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-                                \"description\": \"Unsuccessful operations will be transferred to the failure relationship.\",\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 FlowFile with transformed content will be routed to this relationship\",\n+                                \"name\": \"success\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": false,\n+                        \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"azure\",\n-                            \"blob\",\n-                            \"cloud\",\n-                            \"microsoft\",\n-                            \"storage\"\n+                            \"cardinality\",\n+                            \"chainr\",\n+                            \"defaultr\",\n+                            \"jolt\",\n+                            \"record\",\n+                            \"removr\",\n+                            \"shiftr\",\n+                            \"sort\",\n+                            \"transform\"\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+                        \"type\": \"org.apache.nifi.processors.jolt.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                         \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\"\n-                    },\n+                        \"version\": \"2.0.0-M3\",\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\": \"2.0.0-M3\"\n+        },\n+        {\n+            \"artifact\": \"nifi-key-service-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-azure-nar\",\n+                        \"artifact\": \"nifi-key-service-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\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-                        \"multiProcessorUseCases\": [],\n-                        \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"adls-credentials-service\": {\n-                                \"description\": \"Controller Service used to obtain Azure Credentials.\",\n-                                \"displayName\": \"ADLS Credentials\",\n+                            \"key\": {\n+                                \"description\": \"Private Key structured using PKCS8 and encoded as PEM\",\n+                                \"displayName\": \"Key\",\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\": \"2.0.0-M3\"\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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"directory-name\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables 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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"filesystem-name\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n+                                \"name\": \"key\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n                             },\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+                            \"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\": \"filesystem-object-type\",\n-                                \"required\": true,\n+                                \"name\": \"key-file\",\n+                                \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"SINGLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\"\n+                                    ]\n+                                },\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+                            \"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\": \"proxy-configuration-service\",\n+                                \"name\": \"key-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\": \"2.0.0-M3\"\n-                                }\n+                                \"sensitive\": true\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+                        \"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.key.service.api.PrivateKeyService\",\n+                                \"version\": \"2.0.0-M3\"\n                             }\n                         ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"adlsgen2\",\n-                            \"azure\",\n-                            \"cloud\",\n-                            \"datalake\",\n-                            \"microsoft\",\n-                            \"storage\"\n+                            \"PEM\",\n+                            \"PKCS8\"\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-                        \"useCases\": [],\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\": \"2.0.0-M3\"\n-                    },\n+                    }\n+                ],\n+                \"processors\": [],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"2.0.0-M3\"\n+        },\n+        {\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\": \"f2215c6\"\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-                        \"multiProcessorUseCases\": [\n-                            {\n-                                \"configurations\": [\n-                                    {\n-                                        \"configuration\": \"The \\\"Container Name\\\" property should be set to the name of the Blob Storage Container that files reside in.     If the flow being built is to be reused elsewhere, it's a good idea to parameterize this property by setting it to something like `#{AZURE_CONTAINER}`.\\n\\nThe \\\"Storage Credentials\\\" property should specify an instance of the AzureStorageCredentialsService_v12 in order to provide credentials for accessing the storage container.\\n\\nThe 'success' Relationship of this Processor is then connected to FetchAzureBlobStorage_v12.\\n\",\n-                                        \"processorClassName\": \"org.apache.nifi.processors.azure.storage.ListAzureBlobStorage_v12\"\n-                                    },\n-                                    {\n-                                        \"configuration\": \"\\\"Container Name\\\" = \\\"${azure.container}\\\"\\n\\\"Blob Name\\\" = \\\"${azure.blobname}\\\"\\n\\nThe \\\"Storage Credentials\\\" property should specify an instance of the AzureStorageCredentialsService_v12 in order to provide credentials for accessing the storage container.\\n\",\n-                                        \"processorClassName\": \"org.apache.nifi.processors.azure.storage.FetchAzureBlobStorage_v12\"\n-                                    }\n-                                ],\n-                                \"description\": \"Retrieve all files in an Azure Blob Storage container\",\n-                                \"keywords\": [\n-                                    \"azure\",\n-                                    \"blob\",\n-                                    \"storage\",\n-                                    \"state\",\n-                                    \"retrieve\",\n-                                    \"fetch\",\n-                                    \"all\",\n-                                    \"stream\"\n-                                ],\n-                                \"notes\": \"\"\n-                            }\n-                        ],\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+                            \"cache-size\": {\n+                                \"defaultValue\": \"1000\",\n+                                \"description\": \"Specifies how many Schemas should be cached\",\n+                                \"displayName\": \"Cache Size\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Client-Side Encryption Key ID\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"cache-size\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Client-Side Encryption Key Type\": {\n+                            \"schema-access-strategy\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Client-Side Encryption disabled\",\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\": \"Client-Side Encryption enabled using local key\",\n-                                        \"displayName\": \"LOCAL\",\n-                                        \"value\": \"LOCAL\"\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 schema reference information will be provided through a configured Schema Reference Reader service implementation.\",\n+                                        \"displayName\": \"Schema Reference Reader\",\n+                                        \"value\": \"schema-reference-reader\"\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\": \"NONE\",\n-                                \"description\": \"Specifies the key type to use for client-side encryption.\",\n-                                \"displayName\": \"Client-Side Encryption Key Type\",\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\": \"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-branch\": {\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"LOCAL\"\n+                                            \"schema-name\"\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-                                \"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-                            \"blob-name\": {\n-                                \"defaultValue\": \"${azure.blobname}\",\n-                                \"description\": \"The full name of the blob\",\n-                                \"displayName\": \"Blob Name\",\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\": \"Environment variables 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-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\": \"Environment variables 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-reference-reader\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"schema-reference-reader\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"Service implementation responsible for reading FlowFile attributes or content to determine the Schema Reference Identifier\",\n+                                \"displayName\": \"Schema Reference Reader\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"proxy-configuration-service\",\n+                                \"name\": \"schema-reference-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.schemaregistry.services.SchemaReferenceReader\",\n+                                    \"version\": \"2.0.0-M3\"\n+                                }\n+                            },\n+                            \"schema-registry\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"schema-reference-reader\",\n+                                            \"schema-name\"\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.proxy.ProxyConfigurationService\",\n+                                    \"type\": \"org.apache.nifi.schemaregistry.services.SchemaRegistry\",\n                                     \"version\": \"2.0.0-M3\"\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\": \"Environment variables 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\": \"Environment variables 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-                                \"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\": \"2.0.0-M3\"\n-                                }\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\": \"2.0.0-M3\"\n                             }\n                         ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"azure\",\n-                            \"blob\",\n-                            \"cloud\",\n-                            \"microsoft\",\n-                            \"storage\"\n+                            \"avro\",\n+                            \"comma\",\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.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-                        \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\",\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\": \"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+                        \"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\": \"2.0.0-M3\"\n                     },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-azure-nar\",\n+                        \"artifact\": \"nifi-record-serialization-services-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\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-                        \"multiProcessorUseCases\": [\n-                            {\n-                                \"configurations\": [\n-                                    {\n-                                        \"configuration\": \"The \\\"Filesystem Name\\\" property should be set to the name of the Azure Filesystem (also known as a Container) that files reside in.     If the flow being built is to be reused elsewhere, it's a good idea to parameterize this property by setting it to something like `#{AZURE_FILESYSTEM}`.\\nConfigure the \\\"Directory Name\\\" property to specify the name of the directory in the file system.     If the flow being built is to be reused elsewhere, it's a good idea to parameterize this property by setting it to something like `#{AZURE_DIRECTORY}`.\\n\\nThe \\\"ADLS Credentials\\\" property should specify an instance of the ADLSCredentialsService in order to provide credentials for accessing the filesystem.\\n\\nThe 'success' Relationship of this Processor is then connected to FetchAzureDataLakeStorage.\\n\",\n-                                        \"processorClassName\": \"org.apache.nifi.processors.azure.storage.ListAzureDataLakeStorage\"\n-                                    },\n+                        \"propertyDescriptors\": {\n+                            \"Schema Reference Writer\": {\n+                                \"dependencies\": [\n                                     {\n-                                        \"configuration\": \"\\\"Filesystem Name\\\" = \\\"${azure.filesystem}\\\"\\n\\\"Directory Name\\\" = \\\"${azure.directory}\\\"\\n\\\"File Name\\\" = \\\"${azure.filename}\\\"\\n\\nThe \\\"ADLS Credentials\\\" property should specify an instance of the ADLSCredentialsService in order to provide credentials for accessing the filesystem.\\n\",\n-                                        \"processorClassName\": \"org.apache.nifi.processors.azure.storage.FetchAzureDataLakeStorage\"\n+                                        \"dependentValues\": [\n+                                            \"schema-reference-writer\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Write Strategy\",\n+                                        \"propertyName\": \"Schema Write Strategy\"\n                                     }\n                                 ],\n-                                \"description\": \"Retrieve all files in an Azure DataLake Storage directory\",\n-                                \"keywords\": [\n-                                    \"azure\",\n-                                    \"datalake\",\n-                                    \"adls\",\n-                                    \"state\",\n-                                    \"retrieve\",\n-                                    \"fetch\",\n-                                    \"all\",\n-                                    \"stream\"\n-                                ],\n-                                \"notes\": \"\"\n-                            }\n-                        ],\n-                        \"primaryNodeOnly\": false,\n-                        \"propertyDescriptors\": {\n-                            \"adls-credentials-service\": {\n-                                \"description\": \"Controller Service used to obtain Azure Credentials.\",\n-                                \"displayName\": \"ADLS Credentials\",\n+                                \"description\": \"Service implementation responsible for writing FlowFile attributes or content header with Schema reference information\",\n+                                \"displayName\": \"Schema Reference Writer\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"adls-credentials-service\",\n+                                \"name\": \"Schema Reference 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.ADLSCredentialsService\",\n+                                    \"type\": \"org.apache.nifi.schemaregistry.services.SchemaReferenceWriter\",\n                                     \"version\": \"2.0.0-M3\"\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+                            \"Schema Write Strategy\": {\n+                                \"allowableValues\": [\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+                                    },\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 schema reference information will be written through a configured Schema Reference Writer service implementation.\",\n+                                        \"displayName\": \"Schema Reference Writer\",\n+                                        \"value\": \"schema-reference-writer\"\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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"directory-name\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Schema Write Strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"file-name\": {\n-                                \"defaultValue\": \"${azure.filename}\",\n-                                \"description\": \"The filename\",\n-                                \"displayName\": \"File 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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"file-name\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"cache-size\",\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+                            \"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\": \"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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"encoder-pool-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+                                \"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+                                    {\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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"filesystem-name\",\n-                                \"required\": true,\n+                                \"name\": \"schema-branch\",\n+                                \"required\": false,\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+                            \"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\": \"2.0.0-M3\"\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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"number-of-retries\",\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-reference-reader\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"schema-reference-reader\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"Service implementation responsible for reading FlowFile attributes or content to determine the Schema Reference Identifier\",\n+                                \"displayName\": \"Schema Reference Reader\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"proxy-configuration-service\",\n+                                \"name\": \"schema-reference-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.schemaregistry.services.SchemaReferenceReader\",\n+                                    \"version\": \"2.0.0-M3\"\n+                                }\n+                            },\n+                            \"schema-registry\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"schema-reference-reader\",\n+                                            \"schema-name\"\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.proxy.ProxyConfigurationService\",\n+                                    \"type\": \"org.apache.nifi.schemaregistry.services.SchemaRegistry\",\n                                     \"version\": \"2.0.0-M3\"\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+                            \"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\": \"Environment variables 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 object. An empty value or a value of zero will start reading at the beginning of the object.\",\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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"range-start\",\n+                                \"name\": \"schema-version\",\n                                 \"required\": false,\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\": \"2.0.0-M3\"\n                             }\n                         ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"adlsgen2\",\n-                            \"azure\",\n-                            \"cloud\",\n-                            \"datalake\",\n-                            \"microsoft\",\n-                            \"storage\"\n+                            \"avro\",\n+                            \"record\",\n+                            \"recordset\",\n+                            \"result\",\n+                            \"row\",\n+                            \"serializer\",\n+                            \"set\",\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 specified file from Azure Data Lake Storage\",\n-                        \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\",\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-                            {\n-                                \"description\": \"The Azure Data Lake Storage error message from the failed operation\",\n-                                \"name\": \"azure.datalake.storage.errorMessage\"\n-                            }\n-                        ]\n+                        \"type\": \"org.apache.nifi.avro.AvroRecordSetWriter\",\n+                        \"typeDescription\": \"Writes the contents of a RecordSet in Binary Avro format.\",\n+                        \"version\": \"2.0.0-M3\"\n                     },\n                     {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-azure-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-record-serialization-services-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\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-                        \"multiProcessorUseCases\": [],\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-                                \"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+                            \"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\": \"Maximum File Size\",\n-                                \"required\": false,\n+                                \"name\": \"accept-empty-extensions\",\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+                            \"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\": \"Minimum File Age\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"datetime-representation\",\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+                            \"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\": \"Minimum File Size\",\n+                                \"name\": \"inference-strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"blob-name-prefix\": {\n-                                \"description\": \"Search prefix for listing\",\n-                                \"displayName\": \"Blob Name Prefix\",\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\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"blob-name-prefix\",\n+                                \"name\": \"invalid-message-field\",\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+                            \"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\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"container-name\",\n-                                \"required\": true,\n+                                \"name\": \"raw-message-field\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"et-initial-listing-target\": {\n+                            \"schema-access-strategy\": {\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 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\": \"Regardless of entities timestamp, all existing entities will be listed at the initial listing activity.\",\n-                                        \"displayName\": \"All Available\",\n-                                        \"value\": \"all\"\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 schema reference information will be provided through a configured Schema Reference Reader service implementation.\",\n+                                        \"displayName\": \"Schema Reference Reader\",\n+                                        \"value\": \"schema-reference-reader\"\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\": \"all\",\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                                     {\n                                         \"dependentValues\": [\n-                                            \"entities\"\n+                                            \"schema-name\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Listing Strategy\",\n-                                        \"propertyName\": \"listing-strategy\"\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-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+                                \"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\": \"et-initial-listing-target\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"schema-branch\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"et-state-cache\": {\n+                            \"schema-inference-cache\": {\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"entities\"\n+                                            \"infer-schema\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Listing Strategy\",\n-                                        \"propertyName\": \"listing-strategy\"\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-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+                                \"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\": \"et-state-cache\",\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.distributed.cache.client.DistributedMapCacheClient\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordSchemaCacheService\",\n                                     \"version\": \"2.0.0-M3\"\n                                 }\n                             },\n-                            \"et-time-window\": {\n-                                \"defaultValue\": \"3 hours\",\n+                            \"schema-name\": {\n+                                \"defaultValue\": \"${schema.name}\",\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"entities\"\n+                                            \"schema-name\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Listing Strategy\",\n-                                        \"propertyName\": \"listing-strategy\"\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-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+                                \"description\": \"Specifies the name of the schema to lookup in the Schema Registry property\",\n+                                \"displayName\": \"Schema Name\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"et-time-window\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"schema-name\",\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+                            \"schema-reference-reader\": {\n+                                \"dependencies\": [\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+                                        \"dependentValues\": [\n+                                            \"schema-reference-reader\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-strategy\"\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\": \"Service implementation responsible for reading FlowFile attributes or content to determine the Schema Reference Identifier\",\n+                                \"displayName\": \"Schema Reference Reader\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"listing-strategy\",\n+                                \"name\": \"schema-reference-reader\",\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+                                    \"type\": \"org.apache.nifi.schemaregistry.services.SchemaReferenceReader\",\n                                     \"version\": \"2.0.0-M3\"\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-registry\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"schema-reference-reader\",\n+                                            \"schema-name\"\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\": \"2.0.0-M3\"\n                                 }\n                             },\n-                            \"storage-credentials-service\": {\n-                                \"description\": \"Controller Service used to obtain Azure Blob Storage Credentials.\",\n-                                \"displayName\": \"Storage Credentials\",\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\": \"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\": \"2.0.0-M3\"\n-                                }\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables 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\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"schema-version\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n                             }\n                         },\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.azure.storage.CopyAzureBlobStorage_v12\",\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.RecordReaderFactory\",\n+                                \"version\": \"2.0.0-M3\"\n                             }\n                         ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"azure\",\n-                            \"blob\",\n-                            \"cloud\",\n-                            \"microsoft\",\n-                            \"storage\"\n+                            \"cef\",\n+                            \"parser\",\n+                            \"reader\",\n+                            \"record\"\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-                        \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\",\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\": \"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+                        \"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\": \"2.0.0-M3\"\n                     },\n                     {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-azure-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-record-serialization-services-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\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-                        \"multiProcessorUseCases\": [],\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+                            \"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+                                \"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\": \"Maximum File Age\",\n-                                \"required\": false,\n+                                \"name\": \"CSV Format\",\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+                            \"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\": \"Maximum File Size\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Comment Marker\",\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+                            \"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\": \"Minimum File Age\",\n-                                \"required\": true,\n+                                \"name\": \"Date 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+                            \"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\": \"Minimum File Size\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Escape Character\",\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+                            \"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\": \"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\": \"2.0.0-M3\"\n-                                }\n+                                \"name\": \"Null String\",\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+                            \"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\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"directory-name\",\n+                                \"name\": \"Quote Character\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"et-initial-listing-target\": {\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\": \"Record Separator\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Skip Header Line\": {\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\": \"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\": \"et-initial-listing-target\",\n-                                \"required\": false,\n+                                \"name\": \"Skip Header Line\",\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+                            \"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\": \"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\": \"2.0.0-M3\"\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"et-time-window\",\n+                                \"name\": \"Time Format\",\n                                 \"required\": false,\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+                            \"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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"file-filter\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Timestamp Format\",\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"filesystem-name\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"include-temporary-files\": {\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\": \"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+                                \"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\": \"include-temporary-files\",\n+                                \"name\": \"Trim Fields\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"listing-strategy\": {\n+                            \"Trim double quote\": {\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\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\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+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"true\",\n+                                \"dependencies\": [\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+                                        \"dependentValues\": [\n+                                            \"rfc-4180\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"CSV Format\",\n+                                        \"propertyName\": \"CSV Format\"\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\": \"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\": \"listing-strategy\",\n+                                \"name\": \"Trim double quote\",\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+                            \"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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"path-filter\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Value Separator\",\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\": \"2.0.0-M3\"\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+                            \"csv-reader-csv-parser\": {\n+                                \"allowableValues\": [\n+                                    {\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\": \"The CSV parser implementation from the Jackson Dataformats library.\",\n+                                        \"displayName\": \"Jackson CSV\",\n+                                        \"value\": \"jackson-csv\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The CSV parser implementation from the FastCSV library. NOTE: This parser only officially supports RFC-4180, so it recommended to set the 'CSV Format' property to 'RFC 4180'. It does handle some non-compliant CSV data, for that case set the 'CSV Format' property to 'CUSTOM' and the other custom format properties (such as 'Trim Fields', 'Trim double quote', etc.) as appropriate. Be aware that this may cause errors if FastCSV doesn't handle the property settings correctly (such as 'Ignore Header'), but otherwise may process the input as expected even if the data is not fully RFC-4180 compliant.\",\n+                                        \"displayName\": \"FastCSV\",\n+                                        \"value\": \"fast-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\": \"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\": \"2.0.0-M3\"\n-                                }\n+                                \"name\": \"csv-reader-csv-parser\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             },\n-                            \"recurse-subdirectories\": {\n+                            \"csvutils-allow-duplicate-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\": \"Indicates whether to list files from subdirectories of the directory\",\n-                                \"displayName\": \"Recurse Subdirectories\",\n+                                \"dependencies\": [\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.\\nHandling 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* FastCSV - duplicate headers will be de-duplicated with the field value being that of the left-most duplicate CSV column\",\n+                                \"displayName\": \"Allow Duplicate Header Names\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"recurse-subdirectories\",\n-                                \"required\": true,\n+                                \"name\": \"csvutils-allow-duplicate-header-names\",\n+                                \"required\": false,\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-                            \"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-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"adlsgen2\",\n-                            \"azure\",\n-                            \"cloud\",\n-                            \"datalake\",\n-                            \"microsoft\",\n-                            \"storage\"\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-                        \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\",\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-                            }\n-                        ]\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-azure-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"f2215c6\"\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-                        \"multiProcessorUseCases\": [],\n-                        \"primaryNodeOnly\": false,\n-                        \"propertyDescriptors\": {\n-                            \"adls-credentials-service\": {\n-                                \"description\": \"Controller Service used to obtain Azure Credentials.\",\n-                                \"displayName\": \"ADLS Credentials\",\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\": \"adls-credentials-service\",\n+                                \"name\": \"csvutils-character-set\",\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\": \"2.0.0-M3\"\n-                                }\n+                                \"sensitive\": false\n                             },\n-                            \"conflict-resolution-strategy\": {\n+                            \"ignore-csv-header\": {\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+                                        \"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+                                    {\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\": \"ignore\",\n-                                        \"value\": \"ignore\"\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 schema reference information will be provided through a configured Schema Reference Reader service implementation.\",\n+                                        \"displayName\": \"Schema Reference Reader\",\n+                                        \"value\": \"schema-reference-reader\"\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\": \"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\": \"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\": \"conflict-resolution-strategy\",\n+                                \"name\": \"schema-access-strategy\",\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+                            \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"directory-name\",\n-                                \"required\": true,\n+                                \"name\": \"schema-branch\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"file-name\": {\n-                                \"defaultValue\": \"${azure.filename}\",\n-                                \"description\": \"The filename\",\n-                                \"displayName\": \"File 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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"file-name\",\n-                                \"required\": true,\n+                                \"name\": \"schema-name\",\n+                                \"required\": false,\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+                            \"schema-reference-reader\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"schema-reference-reader\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"Service implementation responsible for reading FlowFile attributes or content to determine the Schema Reference Identifier\",\n+                                \"displayName\": \"Schema Reference Reader\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"filesystem-name\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"schema-reference-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.schemaregistry.services.SchemaReferenceReader\",\n+                                    \"version\": \"2.0.0-M3\"\n+                                }\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+                                            \"schema-reference-reader\",\n+                                            \"schema-name\"\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\": \"2.0.0-M3\"\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+                            \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"source-directory-name\",\n-                                \"required\": true,\n+                                \"name\": \"schema-text\",\n+                                \"required\": false,\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+                            \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"source-filesystem-name\",\n-                                \"required\": true,\n+                                \"name\": \"schema-version\",\n+                                \"required\": false,\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.serialization.RecordReaderFactory\",\n+                                \"version\": \"2.0.0-M3\"\n                             }\n                         ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"adlsgen2\",\n-                            \"azure\",\n-                            \"cloud\",\n-                            \"datalake\",\n-                            \"microsoft\",\n-                            \"storage\"\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.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-                        \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\",\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+                        \"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\": \"2.0.0-M3\"\n                     },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-azure-nar\",\n+                        \"artifact\": \"nifi-record-serialization-services-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\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-                        \"multiProcessorUseCases\": [],\n-                        \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Client-Side Encryption Key ID\": {\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+                                \"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                                     {\n                                         \"dependentValues\": [\n-                                            \"LOCAL\"\n+                                            \"custom\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Client-Side Encryption Key Type\",\n-                                        \"propertyName\": \"Client-Side Encryption Key Type\"\n+                                        \"propertyDisplayName\": \"CSV Format\",\n+                                        \"propertyName\": \"CSV Format\"\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\": \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Client-Side Encryption Key ID\",\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+                                    {\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\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Escape Character\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Client-Side Encryption Key Type\": {\n+                            \"Include Header Line\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Client-Side Encryption disabled\",\n-                                        \"displayName\": \"NONE\",\n-                                        \"value\": \"NONE\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n-                                        \"description\": \"Client-Side Encryption enabled using local key\",\n-                                        \"displayName\": \"LOCAL\",\n-                                        \"value\": \"LOCAL\"\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 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\": \"Client-Side Encryption Key Type\",\n+                                \"name\": \"Include Header Line\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Client-Side Encryption Local Key\": {\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-                                            \"LOCAL\"\n+                                            \"custom\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Client-Side Encryption Key Type\",\n-                                        \"propertyName\": \"Client-Side Encryption Key Type\"\n+                                        \"propertyDisplayName\": \"CSV Format\",\n+                                        \"propertyName\": \"CSV Format\"\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\": \"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\": \"Client-Side Encryption Local Key\",\n+                                \"name\": \"Include Trailing Delimiter\",\n                                 \"required\": true,\n-                                \"sensitive\": true\n+                                \"sensitive\": false\n                             },\n-                            \"File Resource Service\": {\n+                            \"Null String\": {\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"FILE_RESOURCE_SERVICE\"\n+                                            \"custom\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Resource Transfer Source\",\n-                                        \"propertyName\": \"Resource Transfer Source\"\n+                                        \"propertyDisplayName\": \"CSV Format\",\n+                                        \"propertyName\": \"CSV Format\"\n                                     }\n                                 ],\n-                                \"description\": \"File Resource Service providing access to the local resource to be transferred\",\n-                                \"displayName\": \"File Resource Service\",\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\": \"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\": \"2.0.0-M3\"\n-                                }\n+                                \"name\": \"Null String\",\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+                            \"Quote Character\": {\n+                                \"defaultValue\": \"\\\"\",\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+                                            \"custom\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"CSV Format\",\n+                                        \"propertyName\": \"CSV Format\"\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\": \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"blob-name\",\n+                                \"name\": \"Quote Character\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"conflict-resolution-strategy\": {\n+                            \"Quote Mode\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Fail if the blob already exists\",\n-                                        \"displayName\": \"fail\",\n-                                        \"value\": \"FAIL_RESOLUTION\"\n+                                        \"description\": \"All values will be quoted using the configured quote character.\",\n+                                        \"displayName\": \"Quote All Values\",\n+                                        \"value\": \"ALL\"\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\": \"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\": \"Replace blob contents if the blob already exist\",\n-                                        \"displayName\": \"replace\",\n-                                        \"value\": \"REPLACE_RESOLUTION\"\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\": \"FAIL_RESOLUTION\",\n-                                \"description\": \"Specifies whether an existing blob will have its contents replaced upon conflict.\",\n-                                \"displayName\": \"Conflict Resolution 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\": \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"container-name\",\n+                                \"name\": \"Quote Mode\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"create-container\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n+                            \"Record Separator\": {\n+                                \"defaultValue\": \"\\\\n\",\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"dependentValues\": [\n+                                            \"custom\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"CSV Format\",\n+                                        \"propertyName\": \"CSV Format\"\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\": \"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\": \"create-container\",\n+                                \"name\": \"Record Separator\",\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 Reference Writer\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"schema-reference-writer\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Write Strategy\",\n+                                        \"propertyName\": \"Schema Write Strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"Service implementation responsible for writing FlowFile attributes or content header with Schema reference information\",\n+                                \"displayName\": \"Schema Reference Writer\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"proxy-configuration-service\",\n-                                \"required\": false,\n+                                \"name\": \"Schema Reference 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.schemaregistry.services.SchemaReferenceWriter\",\n                                     \"version\": \"2.0.0-M3\"\n                                 }\n                             },\n-                            \"storage-credentials-service\": {\n-                                \"description\": \"Controller Service used to obtain Azure Blob Storage Credentials.\",\n-                                \"displayName\": \"Storage Credentials\",\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 schema reference information will be written through a configured Schema Reference Writer service implementation.\",\n+                                        \"displayName\": \"Schema Reference Writer\",\n+                                        \"value\": \"schema-reference-writer\"\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\": \"storage-credentials-service\",\n+                                \"name\": \"Schema Write 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\": \"2.0.0-M3\"\n-                                }\n-                            }\n-                        },\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.azure.storage.CopyAzureBlobStorage_v12\",\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-                            {\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-                        \"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-                        \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\",\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\": \"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+                                \"sensitive\": false\n                             },\n-                            {\n-                                \"description\": \"Error code reported during blob operation\",\n-                                \"name\": \"azure.error.code\"\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\": \"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\": \"f2215c6\"\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-                        \"multiProcessorUseCases\": [],\n-                        \"primaryNodeOnly\": false,\n-                        \"propertyDescriptors\": {\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+                            \"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\": \"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\": \"2.0.0-M3\"\n-                                }\n+                                \"name\": \"Timestamp Format\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n                             },\n-                            \"Resource Transfer Source\": {\n+                            \"Trim Fields\": {\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\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\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\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"FLOWFILE_CONTENT\",\n-                                \"description\": \"The source of the content to be transferred\",\n-                                \"displayName\": \"Resource Transfer Source\",\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\": \"Resource Transfer Source\",\n+                                \"name\": \"Trim Fields\",\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-                                \"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\": \"2.0.0-M3\"\n-                                }\n-                            },\n-                            \"base-temporary-path\": {\n-                                \"defaultValue\": \"\",\n+                            \"Value Separator\": {\n+                                \"defaultValue\": \",\",\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"WRITE_AND_RENAME\"\n+                                            \"custom\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Writing Strategy\",\n-                                        \"propertyName\": \"writing-strategy\"\n+                                        \"propertyDisplayName\": \"CSV Format\",\n+                                        \"propertyName\": \"CSV Format\"\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\": \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"base-temporary-path\",\n-                                \"required\": false,\n+                                \"name\": \"Value Separator\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"conflict-resolution-strategy\": {\n+                            \"csv-writer\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"fail\",\n-                                        \"value\": \"fail\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"replace\",\n-                                        \"value\": \"replace\"\n+                                        \"description\": \"The CSV writer implementation from the Apache Commons CSV library.\",\n+                                        \"displayName\": \"Apache Commons CSV\",\n+                                        \"value\": \"commons-csv\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"ignore\",\n-                                        \"value\": \"ignore\"\n+                                        \"description\": \"The CSV writer implementation from the FastCSV library. NOTE: This writer only officially supports RFC-4180, so it recommended to set the 'CSV Format' property to 'RFC 4180'. It does handle some non-compliant CSV data, for that case set the 'CSV Format' property to 'CUSTOM' and the other custom format properties (such as 'Trim Fields', 'Trim double quote', etc.) as appropriate. Be aware that this may cause errors if FastCSV doesn't handle the property settings correctly (such as 'Quote Mode'), but otherwise may process the output as expected even if the data is not fully RFC-4180 compliant.\",\n+                                        \"displayName\": \"FastCSV\",\n+                                        \"value\": \"fast-csv\"\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\": \"commons-csv\",\n+                                \"description\": \"Specifies which writer implementation to use to write CSV records. NOTE: Different writers may support different subsets of functionality and may also exhibit different levels of performance.\",\n+                                \"displayName\": \"CSV Writer\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"conflict-resolution-strategy\",\n+                                \"name\": \"csv-writer\",\n                                 \"required\": true,\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+                            \"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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"directory-name\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"csvutils-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+                            \"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                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"file-name\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"schema-access-strategy\",\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+                            \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"filesystem-name\",\n-                                \"required\": true,\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+                            \"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\": \"2.0.0-M3\"\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+                            \"schema-name\": {\n+                                \"defaultValue\": \"${schema.name}\",\n+                                \"dependencies\": [\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+                                        \"dependentValues\": [\n+                                            \"schema-name\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-strategy\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"WRITE_AND_RENAME\",\n-                                \"description\": \"Defines the approach for writing the Azure file.\",\n-                                \"displayName\": \"Writing Strategy\",\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\": \"writing-strategy\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"schema-name\",\n+                                \"required\": false,\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-                            {\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-                        \"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.PutAzureDataLakeStorage\",\n-                        \"typeDescription\": \"Writes the contents of a FlowFile as a file on Azure Data Lake Storage Gen 2\",\n-                        \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\",\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-azure-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"f2215c6\"\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-                        \"multiProcessorUseCases\": [],\n-                        \"primaryNodeOnly\": false,\n-                        \"propertyDescriptors\": {\n-                            \"Auto Delete Messages\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n+                            \"schema-reference-reader\": {\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"dependentValues\": [\n+                                            \"schema-reference-reader\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-strategy\"\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Auto Delete Messages\",\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+                                \"description\": \"Service implementation responsible for reading FlowFile attributes or content to determine the Schema Reference Identifier\",\n+                                \"displayName\": \"Schema Reference Reader\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Credentials Service\",\n+                                \"name\": \"schema-reference-reader\",\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_v12\",\n+                                    \"type\": \"org.apache.nifi.schemaregistry.services.SchemaReferenceReader\",\n                                     \"version\": \"2.0.0-M3\"\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Message Batch Size\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Queue Name\": {\n-                                \"description\": \"Name of the Azure Storage Queue\",\n-                                \"displayName\": \"Queue Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables 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\": \"Request Timeout\",\n-                                \"required\": 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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\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+                            \"schema-registry\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"schema-reference-reader\",\n+                                            \"schema-name\"\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\": \"2.0.0-M3\"\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+                            \"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\": \"storage-endpoint-suffix\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables 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\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"schema-version\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.azure.storage.queue.PutAzureQueueStorage_v12\"\n-                        ],\n-                        \"sideEffectFree\": false,\n-                        \"supportedRelationships\": [\n+                        \"providedApiImplementations\": [\n                             {\n-                                \"description\": \"All successfully processed 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.serialization.RecordSetWriterFactory\",\n+                                \"version\": \"2.0.0-M3\"\n                             }\n                         ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"azure\",\n-                            \"cloud\",\n-                            \"dequeue\",\n-                            \"microsoft\",\n-                            \"queue\",\n-                            \"storage\"\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.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-                        \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\",\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+                        \"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\": \"2.0.0-M3\"\n                     },\n                     {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-azure-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-record-serialization-services-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\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-                        \"multiProcessorUseCases\": [],\n-                        \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Credentials Service\": {\n-                                \"description\": \"Controller Service used to obtain Azure Storage Credentials.\",\n-                                \"displayName\": \"Credentials Service\",\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\": \"Credentials Service\",\n+                                \"name\": \"Grok Expression\",\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\": \"2.0.0-M3\"\n-                                }\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"SINGLE\",\n+                                    \"resourceTypes\": [\n+                                        \"TEXT\",\n+                                        \"FILE\",\n+                                        \"URL\"\n+                                    ]\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+                            \"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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Grok Pattern File\",\n+                                \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"SINGLE\",\n+                                    \"resourceTypes\": [\n+                                        \"TEXT\",\n+                                        \"FILE\",\n+                                        \"URL\"\n+                                    ]\n+                                },\n+                                \"sensitive\": false\n+                            },\n+                            \"no-match-behavior\": {\n+                                \"allowableValues\": [\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+                                    },\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+                                    },\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\": \"Message Time To Live\",\n+                                \"name\": \"no-match-behavior\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Queue Name\": {\n-                                \"description\": \"Name of the Azure Storage Queue\",\n-                                \"displayName\": \"Queue Name\",\n+                            \"schema-access-strategy\": {\n+                                \"allowableValues\": [\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+                                    },\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 schema reference information will be provided through a configured Schema Reference Reader service implementation.\",\n+                                        \"displayName\": \"Schema Reference Reader\",\n+                                        \"value\": \"schema-reference-reader\"\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+                                    {\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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Queue Name\",\n-                                \"required\": true,\n+                                \"name\": \"schema-branch\",\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+                            \"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\": \"Request Timeout\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"schema-name\",\n+                                \"required\": false,\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+                            \"schema-reference-reader\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"schema-reference-reader\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"Service implementation responsible for reading FlowFile attributes or content to determine the Schema Reference Identifier\",\n+                                \"displayName\": \"Schema Reference Reader\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Visibility Timeout\",\n+                                \"name\": \"schema-reference-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.schemaregistry.services.SchemaReferenceReader\",\n+                                    \"version\": \"2.0.0-M3\"\n+                                }\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+                                            \"schema-reference-reader\",\n+                                            \"schema-name\"\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\": \"2.0.0-M3\"\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+                            \"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\": \"storage-endpoint-suffix\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables 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\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"schema-version\",\n+                                \"required\": false,\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+                        \"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\": \"2.0.0-M3\"\n                             }\n                         ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": false,\n+                        \"restricted\": true,\n                         \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"azure\",\n-                            \"cloud\",\n-                            \"enqueue\",\n-                            \"microsoft\",\n-                            \"queue\",\n-                            \"storage\"\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.storage.queue.PutAzureQueueStorage_v12\",\n-                        \"typeDescription\": \"Writes the content of the incoming FlowFiles to the configured Azure Queue Storage.\",\n-                        \"useCases\": [],\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\": \"2.0.0-M3\"\n-                    }\n-                ],\n-                \"reportingTasks\": [\n+                    },\n                     {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-azure-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-record-serialization-services-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\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-                            \"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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Application ID\",\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Batch 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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Instance ID\",\n-                                \"required\": true,\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Instance URL\",\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Job Name\",\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Log Analytics Custom Log Name\",\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Log Analytics URL Endpoint Format\",\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Platform\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"include-null-values\": {\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\": \"Indicate if null values should be included in records. Default will be false\",\n-                                \"displayName\": \"Include Null Values\",\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\": \"include-null-values\",\n+                                \"name\": \"Allow Comments\",\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, UPLOAD, 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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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, UPLOAD, 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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"s2s-prov-task-id-filter\",\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"s2s-prov-task-id-filter-exclude\",\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+                            \"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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"s2s-prov-task-name-filter\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Date Format\",\n                                 \"required\": false,\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+                            \"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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"s2s-prov-task-name-filter-exclude\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Max String Length\",\n+                                \"required\": true,\n                                 \"sensitive\": false\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+                            \"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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"s2s-prov-task-type-filter\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Time Format\",\n                                 \"required\": false,\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+                            \"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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"s2s-prov-task-type-filter-exclude\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Timestamp Format\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"start-position\": {\n+                            \"schema-access-strategy\": {\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\": \"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\": \"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\": \"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 schema reference information will be provided through a configured Schema Reference Reader service implementation.\",\n+                                        \"displayName\": \"Schema Reference Reader\",\n+                                        \"value\": \"schema-reference-reader\"\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\": \"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\": \"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\": \"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\": \"2.0.0-M3\"\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-azure-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"f2215c6\"\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Application ID\",\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Instance ID\",\n+                                \"name\": \"schema-access-strategy\",\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Job Name\",\n-                                \"required\": false,\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+                            \"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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Log Analytics Custom Log Name\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"schema-branch\",\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+                            \"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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Log Analytics URL Endpoint Format\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"schema-name\",\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+                            \"schema-reference-reader\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"schema-reference-reader\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"Service implementation responsible for reading FlowFile attributes or content to determine the Schema Reference Identifier\",\n+                                \"displayName\": \"Schema Reference Reader\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Log Analytics Workspace Id\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"schema-reference-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.schemaregistry.services.SchemaReferenceReader\",\n+                                    \"version\": \"2.0.0-M3\"\n+                                }\n                             },\n-                            \"Log Analytics Workspace Key\": {\n-                                \"description\": \"Azure Log Analytic Worskspace Key\",\n-                                \"displayName\": \"Log Analytics Workspace Key\",\n+                            \"schema-registry\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"schema-reference-reader\",\n+                                            \"schema-name\"\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Log Analytics Workspace Key\",\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\": \"2.0.0-M3\"\n+                                }\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+                            \"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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Process group ID(s)\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"schema-text\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Send JVM Metrics\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\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\": \"Send JVM Metrics in addition to the NiFi-metrics\",\n-                                \"displayName\": \"Send JVM Metrics\",\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\": \"Send JVM Metrics\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"schema-version\",\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.serialization.RecordReaderFactory\",\n+                                \"version\": \"2.0.0-M3\"\n+                            }\n                         ],\n-                        \"supportsDynamicProperties\": false,\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.json.JsonTreeReader\"\n+                        ],\n+                        \"supportsDynamicProperties\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"azure\",\n-                            \"log analytics\",\n-                            \"metrics\",\n-                            \"reporting\"\n+                            \"json\",\n+                            \"jsonpath\",\n+                            \"parser\",\n+                            \"reader\",\n+                            \"record\"\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.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\": \"2.0.0-M3\"\n-                    }\n-                ]\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"2.0.0-M3\"\n-        },\n-        {\n-            \"artifact\": \"nifi-hl7-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [],\n-                \"processors\": [\n+                    },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-hl7-nar\",\n+                        \"artifact\": \"nifi-record-serialization-services-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\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-                        \"multiProcessorUseCases\": [],\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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Character Encoding\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"hl7-input-version\": {\n+                            \"Allow Scientific Notation\": {\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+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"2.6\",\n-                                        \"value\": \"2.6\"\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"autodetect\",\n-                                \"description\": \"The HL7 version to use for parsing and validation\",\n-                                \"displayName\": \"HL7 Input Version\",\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\": \"hl7-input-version\",\n+                                \"name\": \"Allow Scientific Notation\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"parse-segment-fields\": {\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                                     {\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 parse HL7 segment fields into attributes\",\n-                                \"displayName\": \"Parse Segment Fields\",\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\": \"parse-segment-fields\",\n+                                \"name\": \"Pretty Print JSON\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"skip-validation\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n+                            \"Schema Reference Writer\": {\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"dependentValues\": [\n+                                            \"schema-reference-writer\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Write Strategy\",\n+                                        \"propertyName\": \"Schema Write Strategy\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"Whether or not to validate HL7 message values\",\n-                                \"displayName\": \"Skip Validation\",\n+                                \"description\": \"Service implementation responsible for writing FlowFile attributes or content header with Schema reference information\",\n+                                \"displayName\": \"Schema Reference Writer\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"skip-validation\",\n+                                \"name\": \"Schema Reference 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.schemaregistry.services.SchemaReferenceWriter\",\n+                                    \"version\": \"2.0.0-M3\"\n+                                }\n                             },\n-                            \"use-segment-names\": {\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 schema reference information will be written through a configured Schema Reference Writer service implementation.\",\n+                                        \"displayName\": \"Schema Reference Writer\",\n+                                        \"value\": \"schema-reference-writer\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Whether or not to use HL7 segment names in attributes\",\n-                                \"displayName\": \"Use Segment Names\",\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\": \"use-segment-names\",\n+                                \"name\": \"Schema Write Strategy\",\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-                            {\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-                        \"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-                        \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\"\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-hl7-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"f2215c6\"\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\": \"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-                        \"multiProcessorUseCases\": [],\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+                            \"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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Character Encoding\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Time Format\",\n+                                \"required\": false,\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-                        ],\n-                        \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": true,\n-                        \"supportsDynamicRelationships\": false,\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-                        \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\",\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\": \"2.0.0-M3\"\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\": \"f2215c6\"\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+                            \"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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"file-path\",\n-                                \"required\": true,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\"\n-                                    ]\n-                                },\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Timestamp 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.fileresource.service.api.FileResourceService\",\n-                                \"version\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\n-                    }\n-                ],\n-                \"processors\": [],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\n-        },\n-        {\n-            \"artifact\": \"nifi-hashicorp-vault-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [\n-                    {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-hashicorp-vault-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"f2215c6\"\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\": \"ENVIRONMENT\",\n-                                \"name\": \"A Spring Vault configuration property name\",\n-                                \"value\": \"The property value\"\n-                            }\n-                        ],\n-                        \"group\": \"org.apache.nifi\",\n-                        \"propertyDescriptors\": {\n-                            \"configuration-strategy\": {\n+                            },\n+                            \"compression-format\": {\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\": \"none\",\n+                                        \"value\": \"none\"\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\": \"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\": \"direct-properties\",\n-                                \"description\": \"Specifies the source of the configuration properties.\",\n-                                \"displayName\": \"Configuration Strategy\",\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\": \"configuration-strategy\",\n+                                \"name\": \"compression-format\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"vault.authentication\": {\n+                            \"compression-level\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"TOKEN\",\n-                                        \"value\": \"TOKEN\"\n+                                        \"displayName\": \"0\",\n+                                        \"value\": \"0\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"APPID\",\n-                                        \"value\": \"APPID\"\n+                                        \"displayName\": \"1\",\n+                                        \"value\": \"1\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"APPROLE\",\n-                                        \"value\": \"APPROLE\"\n+                                        \"displayName\": \"2\",\n+                                        \"value\": \"2\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"AWS_EC2\",\n-                                        \"value\": \"AWS_EC2\"\n+                                        \"displayName\": \"3\",\n+                                        \"value\": \"3\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"AZURE\",\n-                                        \"value\": \"AZURE\"\n+                                        \"displayName\": \"4\",\n+                                        \"value\": \"4\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"CERT\",\n-                                        \"value\": \"CERT\"\n+                                        \"displayName\": \"5\",\n+                                        \"value\": \"5\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"CUBBYHOLE\",\n-                                        \"value\": \"CUBBYHOLE\"\n+                                        \"displayName\": \"6\",\n+                                        \"value\": \"6\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"KUBERNETES\",\n-                                        \"value\": \"KUBERNETES\"\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\": \"TOKEN\",\n+                                \"defaultValue\": \"1\",\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"direct-properties\"\n+                                            \"gzip\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Configuration Strategy\",\n-                                        \"propertyName\": \"configuration-strategy\"\n+                                        \"propertyDisplayName\": \"Compression Format\",\n+                                        \"propertyName\": \"compression-format\"\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+                                \"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\": \"vault.authentication\",\n+                                \"name\": \"compression-level\",\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+                            \"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\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"vault.connection.timeout\",\n+                                \"name\": \"output-grouping\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"vault.properties.files\": {\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+                                \"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                                     {\n                                         \"dependentValues\": [\n-                                            \"properties-files\"\n+                                            \"schema-name\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Configuration Strategy\",\n-                                        \"propertyName\": \"configuration-strategy\"\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-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+                                \"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\": \"Environment variables 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\": \"vault.properties.files\",\n-                                \"required\": true,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"MULTIPLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\"\n-                                    ]\n-                                },\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\": \"2.0.0-M3\"\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\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"schema-name\",\n+                                \"required\": false,\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+                            \"schema-reference-reader\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"schema-reference-reader\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"Service implementation responsible for reading FlowFile attributes or content to determine the Schema Reference Identifier\",\n+                                \"displayName\": \"Schema Reference Reader\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"vault.read.timeout\",\n+                                \"name\": \"schema-reference-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.schemaregistry.services.SchemaReferenceReader\",\n+                                    \"version\": \"2.0.0-M3\"\n+                                }\n                             },\n-                            \"vault.ssl.context.service\": {\n+                            \"schema-registry\": {\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"direct-properties\"\n+                                            \"schema-reference-reader\",\n+                                            \"schema-name\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Configuration Strategy\",\n-                                        \"propertyName\": \"configuration-strategy\"\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-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+                                \"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\": \"vault.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\": \"2.0.0-M3\"\n                                 }\n                             },\n-                            \"vault.uri\": {\n+                            \"schema-text\": {\n+                                \"defaultValue\": \"${avro.schema}\",\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"direct-properties\"\n+                                            \"schema-text-property\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Configuration Strategy\",\n-                                        \"propertyName\": \"configuration-strategy\"\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-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 text of an Avro-formatted Schema\",\n+                                \"displayName\": \"Schema Text\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"vault.uri\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables 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\": \"Environment variables 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                         \"providedApiImplementations\": [\n                             {\n-                                \"artifact\": \"nifi-hashicorp-vault-client-service-api-nar\",\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n                                 \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.vault.hashicorp.HashiCorpVaultClientService\",\n+                                \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n                                 \"version\": \"2.0.0-M3\"\n                             }\n                         ],\n-                        \"supportsDynamicProperties\": true,\n-                        \"supportsSensitiveDynamicProperties\": true,\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"client\",\n-                            \"hashicorp\",\n-                            \"vault\"\n+                            \"json\",\n+                            \"record\",\n+                            \"recordset\",\n+                            \"resultset\",\n+                            \"row\",\n+                            \"serialize\",\n+                            \"writer\"\n                         ],\n-                        \"type\": \"org.apache.nifi.vault.hashicorp.StandardHashiCorpVaultClientService\",\n-                        \"typeDescription\": \"A controller service for interacting with HashiCorp Vault.\",\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\": \"2.0.0-M3\"\n-                    }\n-                ],\n-                \"processors\": [],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\n-        },\n-        {\n-            \"artifact\": \"nifi-avro-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [],\n-                \"processors\": [\n+                    },\n                     {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-avro-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-record-serialization-services-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\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-                        \"multiProcessorUseCases\": [],\n-                        \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Count Items\": {\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\": \"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+                                \"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\": \"Count Items\",\n+                                \"name\": \"Allow Comments\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Fingerprint Algorithm\": {\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\": \"\",\n-                                        \"displayName\": \"CRC-64-AVRO\",\n-                                        \"value\": \"CRC-64-AVRO\"\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\": \"\",\n-                                        \"displayName\": \"MD5\",\n-                                        \"value\": \"MD5\"\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\": \"SHA-256\",\n-                                        \"value\": \"SHA-256\"\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 schema reference information will be provided through a configured Schema Reference Reader service implementation.\",\n+                                        \"displayName\": \"Schema Reference Reader\",\n+                                        \"value\": \"schema-reference-reader\"\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+                                \"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\": \"Fingerprint Algorithm\",\n+                                \"name\": \"schema-access-strategy\",\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+                            \"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+                                            \"schema-reference-reader\",\n+                                            \"schema-name\",\n+                                            \"schema-text-property\"\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\": \"Metadata Keys\",\n-                                \"required\": false,\n+                                \"name\": \"schema-application-strategy\",\n+                                \"required\": true,\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-                        \"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-                        \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"The type of the schema (i.e. record, enum, etc.).\",\n-                                \"name\": \"schema.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\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"schema-branch\",\n+                                \"required\": false,\n+                                \"sensitive\": false\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+                            \"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\": \"2.0.0-M3\"\n+                                }\n                             },\n-                            {\n-                                \"description\": \"The result of the Fingerprint Algorithm as a Hex string.\",\n-                                \"name\": \"schema.fingerprint\"\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\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"schema-name\",\n+                                \"required\": false,\n+                                \"sensitive\": false\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\": \"f2215c6\"\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-                        \"multiProcessorUseCases\": [],\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+                            \"schema-reference-reader\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"schema-reference-reader\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"Service implementation responsible for reading FlowFile attributes or content to determine the Schema Reference Identifier\",\n+                                \"displayName\": \"Schema Reference Reader\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Output Size\",\n+                                \"name\": \"schema-reference-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.schemaregistry.services.SchemaReferenceReader\",\n+                                    \"version\": \"2.0.0-M3\"\n+                                }\n                             },\n-                            \"Output Strategy\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Avro's object container file format\",\n-                                        \"displayName\": \"Datafile\",\n-                                        \"value\": \"Datafile\"\n-                                    },\n+                            \"schema-registry\": {\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"Bare Avro records\",\n-                                        \"displayName\": \"Bare Record\",\n-                                        \"value\": \"Bare Record\"\n+                                        \"dependentValues\": [\n+                                            \"schema-reference-reader\",\n+                                            \"schema-name\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-strategy\"\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+                                \"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\": \"Output Strategy\",\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.schemaregistry.services.SchemaRegistry\",\n+                                    \"version\": \"2.0.0-M3\"\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\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"schema-text\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Split Strategy\": {\n-                                \"allowableValues\": [\n+                            \"schema-version\": {\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"Split at Record boundaries\",\n-                                        \"displayName\": \"Record\",\n-                                        \"value\": \"Record\"\n+                                        \"dependentValues\": [\n+                                            \"schema-name\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-strategy\"\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+                                \"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\": \"Environment variables 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\": \"Split Strategy\",\n-                                \"required\": true,\n+                                \"name\": \"starting-field-name\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Transfer Metadata\": {\n+                            \"starting-field-strategy\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"description\": \"Begins processing from the root node.\",\n+                                        \"displayName\": \"Root Node\",\n+                                        \"value\": \"ROOT_NODE\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\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\": \"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+                                \"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\": \"Transfer Metadata\",\n+                                \"name\": \"starting-field-strategy\",\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-                            {\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+                        \"providedApiImplementations\": [\n                             {\n-                                \"description\": \"All new files split from 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.serialization.RecordReaderFactory\",\n+                                \"version\": \"2.0.0-M3\"\n                             }\n                         ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.json.JsonPathReader\"\n                         ],\n-                        \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n-                        \"systemResourceConsiderations\": [\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\": \"2.0.0-M3\"\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-record-serialization-services-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"f2215c6\"\n+                        },\n+                        \"dynamicProperties\": [\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+                                \"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\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Service to Use\",\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\": \"2.0.0-M3\"\n                             }\n                         ],\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.lookup.RecordSetWriterLookup\"\n+                        ],\n+                        \"supportsDynamicProperties\": true,\n+                        \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"avro\",\n-                            \"split\"\n+                            \"lookup\",\n+                            \"parse\",\n+                            \"reader\",\n+                            \"record\",\n+                            \"row\"\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-                        \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\",\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+                        \"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\": \"2.0.0-M3\"\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-record-serialization-services-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"f2215c6\"\n+                        },\n+                        \"dynamicProperties\": [\n                             {\n-                                \"description\": \"The number of split FlowFiles generated from the parent FlowFile\",\n-                                \"name\": \"fragment.count\"\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\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Service to Use\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            }\n+                        },\n+                        \"providedApiImplementations\": [\n                             {\n-                                \"description\": \"The filename of the parent FlowFile\",\n-                                \"name\": \"segment.original.filename \"\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n+                                \"version\": \"2.0.0-M3\"\n                             }\n-                        ]\n-                    }\n-                ],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"2.0.0-M3\"\n-        },\n-        {\n-            \"artifact\": \"nifi-hazelcast-services-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [\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\": \"2.0.0-M3\"\n+                    },\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-hazelcast-services-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-record-serialization-services-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\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\": \"2.0.0-M3\"\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+                            \"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\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"max-cache-size\",\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\": \"2.0.0-M3\"\n-                            },\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.serialization.RecordSchemaCacheService\",\n                                 \"version\": \"2.0.0-M3\"\n                             }\n                         ],\n                         \"supportsDynamicProperties\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n                             \"cache\",\n-                            \"hazelcast\",\n-                            \"map\"\n+                            \"record\",\n+                            \"schema\"\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.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\": \"2.0.0-M3\"\n                     },\n                     {\n                         \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-hazelcast-services-nar\",\n+                        \"artifact\": \"nifi-record-serialization-services-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\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+                            \"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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"hazelcast-cluster-name\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Character Set\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"hazelcast-clustering-strategy\": {\n+                            \"syslog-5424-reader-raw-message\": {\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\": \"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\": \"hazelcast-clustering-strategy\",\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"hazelcast-port\",\n+                                \"name\": \"syslog-5424-reader-raw-message\",\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.serialization.RecordReaderFactory\",\n                                 \"version\": \"2.0.0-M3\"\n                             }\n                         ],\n                         \"supportsDynamicProperties\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"cache\",\n-                            \"hazelcast\"\n+                            \"logfiles\",\n+                            \"logs\",\n+                            \"parse\",\n+                            \"reader\",\n+                            \"record\",\n+                            \"syslog\",\n+                            \"syslog 5424\",\n+                            \"text\"\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.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\": \"2.0.0-M3\"\n                     },\n                     {\n                         \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-hazelcast-services-nar\",\n+                        \"artifact\": \"nifi-record-serialization-services-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"hazelcast-connection-timeout\",\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"hazelcast-retry-backoff-initial\",\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+                            \"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\": \"hazelcast-retry-backoff-maximum\",\n+                                \"name\": \"Character Set\",\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+                            \"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\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"hazelcast-server-address\",\n+                                \"name\": \"syslog-5424-reader-raw-message\",\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.serialization.RecordReaderFactory\",\n                                 \"version\": \"2.0.0-M3\"\n                             }\n                         ],\n                         \"supportsDynamicProperties\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"cache\",\n-                            \"hazelcast\"\n+                            \"logfiles\",\n+                            \"logs\",\n+                            \"parse\",\n+                            \"reader\",\n+                            \"record\",\n+                            \"syslog\",\n+                            \"text\"\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.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\": \"2.0.0-M3\"\n-                    }\n-                ],\n-                \"processors\": [],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"2.0.0-M3\"\n-        },\n-        {\n-            \"artifact\": \"nifi-dropbox-services-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [\n+                    },\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-dropbox-services-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-record-serialization-services-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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+                            \"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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"app-key\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Character Set\",\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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+                            \"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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"refresh-token\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Text\",\n                                 \"required\": true,\n-                                \"sensitive\": true\n+                                \"sensitive\": false\n                             }\n                         },\n                         \"providedApiImplementations\": [\n                             {\n-                                \"artifact\": \"nifi-dropbox-services-api-nar\",\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n                                 \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.dropbox.credentials.service.DropboxCredentialService\",\n+                                \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n                                 \"version\": \"2.0.0-M3\"\n                             }\n                         ],\n                         \"supportsDynamicProperties\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"credentials\",\n-                            \"dropbox\",\n-                            \"provider\"\n+                            \"el\",\n+                            \"expression\",\n+                            \"freeform\",\n+                            \"language\",\n+                            \"record\",\n+                            \"recordset\",\n+                            \"resultset\",\n+                            \"serialize\",\n+                            \"text\",\n+                            \"writer\"\n                         ],\n-                        \"type\": \"org.apache.nifi.services.dropbox.StandardDropboxCredentialService\",\n-                        \"typeDescription\": \"Defines credentials for Dropbox processors.\",\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\": \"2.0.0-M3\"\n-                    }\n-                ],\n-                \"processors\": [],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"2.0.0-M3\"\n-        },\n-        {\n-            \"artifact\": \"nifi-splunk-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [],\n-                \"processors\": [\n+                    },\n                     {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-splunk-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-record-serialization-services-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\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+                        \"group\": \"org.apache.nifi\",\n+                        \"providedApiImplementations\": [\n+                            {\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n+                                \"version\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\n+                    },\n+                    {\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-record-serialization-services-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"f2215c6\"\n                         },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n-                        \"multiProcessorUseCases\": [],\n-                        \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Application\": {\n-                                \"description\": \"The Splunk Application to query.\",\n-                                \"displayName\": \"Application\",\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\": \"Application\",\n+                                \"name\": \"Date Format\",\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+                            \"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\": \"Connection Timeout\",\n+                                \"name\": \"Time Format\",\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+                            \"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\": \"Earliest Time\",\n+                                \"name\": \"Timestamp Format\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Hostname\": {\n-                                \"defaultValue\": \"localhost\",\n-                                \"description\": \"The ip address or hostname of the Splunk server.\",\n-                                \"displayName\": \"Hostname\",\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\": \"Hostname\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"attribute_prefix\",\n+                                \"required\": false,\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+                            \"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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Latest Time\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"content_field_name\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Output Mode\": {\n+                            \"parse_xml_attributes\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"ATOM\",\n-                                        \"value\": \"ATOM\"\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"CSV\",\n-                                        \"value\": \"CSV\"\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"parse_xml_attributes\",\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\": \"\",\n-                                        \"displayName\": \"JSON\",\n-                                        \"value\": \"JSON\"\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\": \"\",\n-                                        \"displayName\": \"JSON_COLS\",\n-                                        \"value\": \"JSON_COLS\"\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\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"record_format\",\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 Schema Registry service.\",\n+                                        \"displayName\": \"Use 'Schema Name' Property\",\n+                                        \"value\": \"schema-name\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"JSON_ROWS\",\n-                                        \"value\": \"JSON_ROWS\"\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\": \"RAW\",\n-                                        \"value\": \"RAW\"\n+                                        \"description\": \"The schema reference information will be provided through a configured Schema Reference Reader service implementation.\",\n+                                        \"displayName\": \"Schema Reference Reader\",\n+                                        \"value\": \"schema-reference-reader\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"XML\",\n-                                        \"value\": \"XML\"\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\": \"JSON\",\n-                                \"description\": \"The output mode for the results.\",\n-                                \"displayName\": \"Output Mode\",\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\": \"Output Mode\",\n+                                \"name\": \"schema-access-strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Owner\": {\n-                                \"description\": \"The owner to pass to Splunk.\",\n-                                \"displayName\": \"Owner\",\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\": \"Owner\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"schema-branch\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Password\": {\n-                                \"description\": \"The password to authenticate to Splunk.\",\n-                                \"displayName\": \"Password\",\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\": \"Password\",\n+                                \"name\": \"schema-inference-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\": \"2.0.0-M3\"\n+                                }\n                             },\n-                            \"Port\": {\n-                                \"defaultValue\": \"8089\",\n-                                \"description\": \"The port of the Splunk server.\",\n-                                \"displayName\": \"Port\",\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\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"schema-name\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"schema-reference-reader\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"schema-reference-reader\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"Service implementation responsible for reading FlowFile attributes or content to determine the Schema Reference Identifier\",\n+                                \"displayName\": \"Schema Reference Reader\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Port\",\n+                                \"name\": \"schema-reference-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.schemaregistry.services.SchemaReferenceReader\",\n+                                    \"version\": \"2.0.0-M3\"\n+                                }\n+                            },\n+                            \"schema-registry\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"schema-reference-reader\",\n+                                            \"schema-name\"\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\": \"2.0.0-M3\"\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\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"schema-text\",\n+                                \"required\": false,\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+                            \"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\": \"Environment variables 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\": \"2.0.0-M3\"\n+                            }\n+                        ],\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"parser\",\n+                            \"reader\",\n+                            \"record\",\n+                            \"xml\"\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\": \"2.0.0-M3\"\n+                    },\n+                    {\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-record-serialization-services-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"f2215c6\"\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\": \"Query\",\n+                                \"name\": \"Character Set\",\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+                            \"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\": \"Read Timeout\",\n+                                \"name\": \"Date Format\",\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+                            \"Schema Reference Writer\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"schema-reference-writer\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Write Strategy\",\n+                                        \"propertyName\": \"Schema Write Strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"Service implementation responsible for writing FlowFile attributes or content header with Schema reference information\",\n+                                \"displayName\": \"Schema Reference Writer\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"SSL Context Service\",\n-                                \"required\": false,\n+                                \"name\": \"Schema Reference 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.schemaregistry.services.SchemaReferenceWriter\",\n                                     \"version\": \"2.0.0-M3\"\n                                 }\n                             },\n-                            \"Scheme\": {\n+                            \"Schema Write Strategy\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"https\",\n-                                        \"value\": \"https\"\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\": \"http\",\n-                                        \"value\": \"http\"\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 schema reference information will be written through a configured Schema Reference Writer service implementation.\",\n+                                        \"displayName\": \"Schema Reference Writer\",\n+                                        \"value\": \"schema-reference-writer\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"https\",\n-                                \"description\": \"The scheme for connecting to Splunk.\",\n-                                \"displayName\": \"Scheme\",\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\": \"Scheme\",\n+                                \"name\": \"Schema Write Strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Security Protocol\": {\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+                            \"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+                            \"array_wrapping\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"TLSv1_2\",\n-                                        \"value\": \"TLSv1_2\"\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\": \"\",\n-                                        \"displayName\": \"TLSv1_1\",\n-                                        \"value\": \"TLSv1_1\"\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"array_wrapping\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"omit_xml_declaration\": {\n+                                \"allowableValues\": [\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+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"TLSv1_2\",\n-                                \"description\": \"The security protocol to use for communicating with Splunk.\",\n-                                \"displayName\": \"Security Protocol\",\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\": \"Security Protocol\",\n-                                \"required\": false,\n+                                \"name\": \"omit_xml_declaration\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Time Field Strategy\": {\n+                            \"pretty_print_xml\": {\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+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n-                                        \"description\": \"Search based on the time the event was indexed in Splunk.\",\n-                                        \"displayName\": \"Index Time\",\n-                                        \"value\": \"Index Time\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\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+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Specifies whether or not the XML should be pretty printed\",\n+                                \"displayName\": \"Pretty Print XML\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Time Field Strategy\",\n+                                \"name\": \"pretty_print_xml\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Time Range Strategy\": {\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+                            \"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\": \"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+                                        \"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 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+                                        \"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 the time range provided through the Earliest Time and Latest Time properties will be used.\",\n-                                        \"displayName\": \"Provided\",\n-                                        \"value\": \"Provided\"\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\": \"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\": \"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\": \"Time Range Strategy\",\n+                                \"name\": \"schema-access-strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Time Zone\": {\n-                                \"allowableValues\": [\n+                            \"schema-branch\": {\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Africa/Abidjan\",\n-                                        \"value\": \"Africa/Abidjan\"\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\": \"Environment variables 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\": \"2.0.0-M3\"\n+                                }\n+                            },\n+                            \"schema-name\": {\n+                                \"defaultValue\": \"${schema.name}\",\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Africa/Accra\",\n-                                        \"value\": \"Africa/Accra\"\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\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"schema-name\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"schema-reference-reader\": {\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Africa/Addis_Ababa\",\n-                                        \"value\": \"Africa/Addis_Ababa\"\n-                                    },\n+                                        \"dependentValues\": [\n+                                            \"schema-reference-reader\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"Service implementation responsible for reading FlowFile attributes or content to determine the Schema Reference Identifier\",\n+                                \"displayName\": \"Schema Reference Reader\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"schema-reference-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.schemaregistry.services.SchemaReferenceReader\",\n+                                    \"version\": \"2.0.0-M3\"\n+                                }\n+                            },\n+                            \"schema-registry\": {\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Africa/Algiers\",\n-                                        \"value\": \"Africa/Algiers\"\n-                                    },\n+                                        \"dependentValues\": [\n+                                            \"schema-reference-reader\",\n+                                            \"schema-name\"\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\": \"2.0.0-M3\"\n+                                }\n+                            },\n+                            \"schema-text\": {\n+                                \"defaultValue\": \"${avro.schema}\",\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Africa/Asmara\",\n-                                        \"value\": \"Africa/Asmara\"\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\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"schema-text\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"schema-version\": {\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Africa/Asmera\",\n-                                        \"value\": \"Africa/Asmera\"\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\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"schema-version\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"suppress_nulls\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Africa/Bamako\",\n-                                        \"value\": \"Africa/Bamako\"\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\": \"\",\n-                                        \"displayName\": \"Africa/Bangui\",\n-                                        \"value\": \"Africa/Bangui\"\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\": \"Africa/Banjul\",\n-                                        \"value\": \"Africa/Banjul\"\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+                        \"providedApiImplementations\": [\n+                            {\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n+                                \"version\": \"2.0.0-M3\"\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+                        ],\n+                        \"type\": \"org.apache.nifi.xml.XMLRecordSetWriter\",\n+                        \"typeDescription\": \"Writes a RecordSet to XML. The records are wrapped by a root tag.\",\n+                        \"version\": \"2.0.0-M3\"\n+                    },\n+                    {\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-record-serialization-services-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"f2215c6\"\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+                                \"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\": \"\",\n-                                        \"displayName\": \"Africa/Bissau\",\n-                                        \"value\": \"Africa/Bissau\"\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\": \"\",\n-                                        \"displayName\": \"Africa/Blantyre\",\n-                                        \"value\": \"Africa/Blantyre\"\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\": \"Africa/Brazzaville\",\n-                                        \"value\": \"Africa/Brazzaville\"\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\": \"Africa/Bujumbura\",\n-                                        \"value\": \"Africa/Bujumbura\"\n-                                    },\n+                                        \"description\": \"The schema reference information will be provided through a configured Schema Reference Reader service implementation.\",\n+                                        \"displayName\": \"Schema Reference Reader\",\n+                                        \"value\": \"schema-reference-reader\"\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-application-strategy\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Africa/Cairo\",\n-                                        \"value\": \"Africa/Cairo\"\n+                                        \"description\": \"Applies the schema for the whole JSON.\",\n+                                        \"displayName\": \"Whole JSON\",\n+                                        \"value\": \"WHOLE_JSON\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Africa/Casablanca\",\n-                                        \"value\": \"Africa/Casablanca\"\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-                                        \"description\": \"\",\n-                                        \"displayName\": \"Africa/Ceuta\",\n-                                        \"value\": \"Africa/Ceuta\"\n+                                        \"dependentValues\": [\n+                                            \"schema-reference-reader\",\n+                                            \"schema-name\",\n+                                            \"schema-text-property\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-strategy\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Africa/Conakry\",\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+                            \"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\": \"Environment variables 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+                                \"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\": \"2.0.0-M3\"\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\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"schema-name\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"schema-reference-reader\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"schema-reference-reader\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"Service implementation responsible for reading FlowFile attributes or content to determine the Schema Reference Identifier\",\n+                                \"displayName\": \"Schema Reference Reader\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"schema-reference-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.schemaregistry.services.SchemaReferenceReader\",\n+                                    \"version\": \"2.0.0-M3\"\n+                                }\n+                            },\n+                            \"schema-registry\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"schema-reference-reader\",\n+                                            \"schema-name\"\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\": \"2.0.0-M3\"\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\": \"Environment variables 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\": \"Environment variables 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+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n+                                \"version\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\n+                    }\n+                ],\n+                \"processors\": [],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"2.0.0-M3\"\n+        },\n+        {\n+            \"artifact\": \"nifi-shopify-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n+                \"processors\": [\n+                    {\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-shopify-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"f2215c6\"\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+                        \"multiProcessorUseCases\": [],\n+                        \"primaryNodeOnly\": true,\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"CUSTOMERS\",\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"DISCOUNTS\",\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"INVENTORY\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\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\": \"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+                                    },\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\": \"ORDERS\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\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\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"PRODUCT\",\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"SALES_CHANNELS\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\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\": \"STORE_PROPERTIES\",\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"api-version\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"incremental-delay\",\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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 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\": \"is-incremental\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"object-category\": {\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+                                    },\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+                                \"description\": \"Shopify object category\",\n+                                \"displayName\": \"Object Category\",\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"result-limit\",\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"2.0.0-M3\"\n+                                }\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+                                \"name\": \"success\"\n+                            }\n+                        ],\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": false,\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"shopify\"\n+                        ],\n+                        \"triggerSerially\": true,\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+                        \"useCases\": [],\n+                        \"version\": \"2.0.0-M3\",\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\": \"2.0.0-M3\"\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\": \"f2215c6\"\n+                        },\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"cache-size\",\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\": \"2.0.0-M3\"\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+                            \"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\": \"Environment variables 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\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"zendesk-comment-body\",\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\": \"Environment variables 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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"zendesk-subdomain\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\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\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"zendesk-subject\",\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables 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\": \"Environment variables 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\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\n+                    }\n+                ],\n+                \"processors\": [],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\n+        },\n+        {\n+            \"artifact\": \"nifi-scripting-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-scripting-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"f2215c6\"\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\": \"ENVIRONMENT\",\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Groovy 4.0.21 [Groovy Scripting Engine 2.0]\",\n+                                        \"displayName\": \"Groovy\",\n+                                        \"value\": \"Groovy\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"Groovy\",\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+                            \"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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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.lookup.LookupService\",\n+                                \"version\": \"2.0.0-M3\"\n+                            }\n+                        ],\n+                        \"restricted\": true,\n+                        \"supportsDynamicProperties\": true,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"groovy\",\n+                            \"invoke\",\n+                            \"lookup\",\n+                            \"record\",\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.\",\n+                        \"version\": \"2.0.0-M3\"\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-scripting-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"f2215c6\"\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\": \"ENVIRONMENT\",\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Groovy 4.0.21 [Groovy Scripting Engine 2.0]\",\n+                                        \"displayName\": \"Groovy\",\n+                                        \"value\": \"Groovy\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"Groovy\",\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+                            \"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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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.lookup.StringLookupService\",\n+                                \"version\": \"2.0.0-M3\"\n+                            },\n+                            {\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.lookup.LookupService\",\n+                                \"version\": \"2.0.0-M3\"\n+                            }\n+                        ],\n+                        \"restricted\": true,\n+                        \"supportsDynamicProperties\": true,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"groovy\",\n+                            \"invoke\",\n+                            \"lookup\",\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.\",\n+                        \"version\": \"2.0.0-M3\"\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-scripting-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"f2215c6\"\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\": \"ENVIRONMENT\",\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Groovy 4.0.21 [Groovy Scripting Engine 2.0]\",\n+                                        \"displayName\": \"Groovy\",\n+                                        \"value\": \"Groovy\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"Groovy\",\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+                            \"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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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.serialization.RecordReaderFactory\",\n+                                \"version\": \"2.0.0-M3\"\n+                            }\n+                        ],\n+                        \"restricted\": true,\n+                        \"supportsDynamicProperties\": true,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"groovy\",\n+                            \"invoke\",\n+                            \"record\",\n+                            \"recordFactory\",\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\": \"2.0.0-M3\"\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-scripting-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"f2215c6\"\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\": \"ENVIRONMENT\",\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Groovy 4.0.21 [Groovy Scripting Engine 2.0]\",\n+                                        \"displayName\": \"Groovy\",\n+                                        \"value\": \"Groovy\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"Groovy\",\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+                            \"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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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.serialization.RecordSetWriterFactory\",\n+                                \"version\": \"2.0.0-M3\"\n+                            }\n+                        ],\n+                        \"restricted\": true,\n+                        \"supportsDynamicProperties\": true,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"groovy\",\n+                            \"invoke\",\n+                            \"record\",\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\": \"2.0.0-M3\"\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-scripting-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"f2215c6\"\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\": \"ENVIRONMENT\",\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Groovy 4.0.21 [Groovy Scripting Engine 2.0]\",\n+                                        \"displayName\": \"Groovy\",\n+                                        \"value\": \"Groovy\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"Groovy\",\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+                            \"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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"2.0.0-M3\"\n+                            }\n+                        ],\n+                        \"restricted\": true,\n+                        \"supportsDynamicProperties\": true,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"groovy\",\n+                            \"invoke\",\n+                            \"record\",\n+                            \"record sink\",\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\": \"2.0.0-M3\"\n+                    }\n+                ],\n+                \"processors\": [\n+                    {\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-scripting-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"f2215c6\"\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+                        \"multiProcessorUseCases\": [],\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Clojure 1.8.0 [Clojure UNKNOWN]\",\n+                                        \"displayName\": \"Clojure\",\n+                                        \"value\": \"Clojure\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Groovy 4.0.21 [Groovy Scripting Engine 2.0]\",\n+                                        \"displayName\": \"Groovy\",\n+                                        \"value\": \"Groovy\"\n+                                    }\n+                                ],\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\": \"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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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.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+                                \"name\": \"success\"\n+                            },\n+                            {\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+                        \"supportsSensitiveDynamicProperties\": true,\n+                        \"tags\": [\n+                            \"clojure\",\n+                            \"execute\",\n+                            \"groovy\",\n+                            \"script\"\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+                        \"useCases\": [],\n+                        \"version\": \"2.0.0-M3\"\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-scripting-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"f2215c6\"\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+                        \"multiProcessorUseCases\": [],\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Groovy 4.0.21 [Groovy Scripting Engine 2.0]\",\n+                                        \"displayName\": \"Groovy\",\n+                                        \"value\": \"Groovy\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"Groovy\",\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+                            \"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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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+                        ],\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+                        \"supportsSensitiveDynamicProperties\": true,\n+                        \"tags\": [\n+                            \"groovy\",\n+                            \"invoke\",\n+                            \"script\"\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+                        \"useCases\": [],\n+                        \"version\": \"2.0.0-M3\"\n+                    },\n+                    {\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-scripting-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"f2215c6\"\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 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+                        \"multiProcessorUseCases\": [],\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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+                                \"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\": \"2.0.0-M3\"\n+                                }\n+                            },\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\": \"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\": \"2.0.0-M3\"\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+                                \"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\": \"\",\n+                                        \"displayName\": \"Clojure\",\n+                                        \"value\": \"Clojure\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Groovy\",\n+                                        \"value\": \"Groovy\"\n+                                    }\n+                                ],\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\": \"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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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.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+                            {\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+                        ],\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"filter\",\n+                            \"groovy\",\n+                            \"record\",\n+                            \"script\"\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+                        \"useCases\": [],\n+                        \"version\": \"2.0.0-M3\",\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+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-scripting-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"f2215c6\"\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 execute arbitrary code assuming all permissions that NiFi has.\",\n+                                \"requiredPermission\": \"execute code\"\n+                            }\n+                        ],\n+                        \"group\": \"org.apache.nifi\",\n+                        \"multiProcessorUseCases\": [],\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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+                                \"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\": \"2.0.0-M3\"\n+                                }\n+                            },\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\": \"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\": \"2.0.0-M3\"\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+                                \"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\": \"\",\n+                                        \"displayName\": \"Clojure\",\n+                                        \"value\": \"Clojure\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Groovy\",\n+                                        \"value\": \"Groovy\"\n+                                    }\n+                                ],\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\": \"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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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.ScriptedFilterRecord\",\n+                            \"org.apache.nifi.processors.script.ScriptedTransformRecord\",\n+                            \"org.apache.nifi.processors.script.ScriptedValidateRecord\"\n+                        ],\n+                        \"sideEffectFree\": true,\n+                        \"supportedRelationships\": [\n+                            {\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 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+                        ],\n+                        \"supportsBatching\": false,\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"groovy\",\n+                            \"group\",\n+                            \"organize\",\n+                            \"partition\",\n+                            \"record\",\n+                            \"script\",\n+                            \"segment\",\n+                            \"split\"\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+                        \"useCases\": [],\n+                        \"version\": \"2.0.0-M3\",\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+                            },\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+                                \"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+                    },\n+                    {\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-scripting-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"f2215c6\"\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 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+                        \"multiProcessorUseCases\": [],\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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+                                \"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\": \"2.0.0-M3\"\n+                                }\n+                            },\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\": \"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\": \"2.0.0-M3\"\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+                                \"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\": \"\",\n+                                        \"displayName\": \"Clojure\",\n+                                        \"value\": \"Clojure\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Groovy\",\n+                                        \"value\": \"Groovy\"\n+                                    }\n+                                ],\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\": \"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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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.jolt.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+                        \"supportedRelationships\": [\n+                            {\n+                                \"description\": \"Each FlowFile that were successfully transformed will be routed to this Relationship\",\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+                        ],\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"filter\",\n+                            \"groovy\",\n+                            \"modify\",\n+                            \"record\",\n+                            \"script\",\n+                            \"transform\",\n+                            \"update\"\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+                        \"useCases\": [],\n+                        \"version\": \"2.0.0-M3\",\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\": true,\n+                        \"artifact\": \"nifi-scripting-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"f2215c6\"\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 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+                        \"multiProcessorUseCases\": [],\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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+                                \"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\": \"2.0.0-M3\"\n+                                }\n+                            },\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\": \"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\": \"2.0.0-M3\"\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+                                \"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\": \"\",\n+                                        \"displayName\": \"Clojure\",\n+                                        \"value\": \"Clojure\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Groovy\",\n+                                        \"value\": \"Groovy\"\n+                                    }\n+                                ],\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\": \"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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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.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+                            },\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+                            },\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+                        ],\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"groovy\",\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+                        \"useCases\": [],\n+                        \"version\": \"2.0.0-M3\",\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\": \"f2215c6\"\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\": \"ENVIRONMENT\",\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Groovy 4.0.21 [Groovy Scripting Engine 2.0]\",\n+                                        \"displayName\": \"Groovy\",\n+                                        \"value\": \"Groovy\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"Groovy\",\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+                            \"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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\n+                        ],\n+                        \"supportsDynamicProperties\": true,\n+                        \"supportsSensitiveDynamicProperties\": true,\n+                        \"tags\": [\n+                            \"execute\",\n+                            \"groovy\",\n+                            \"reporting\",\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\": \"2.0.0-M3\"\n+                    }\n+                ]\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\n+        },\n+        {\n+            \"artifact\": \"nifi-framework-kubernetes-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n+                \"processors\": [],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"2.0.0-M3\"\n+        },\n+        {\n+            \"artifact\": \"nifi-email-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n+                \"processors\": [\n+                    {\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-email-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"f2215c6\"\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+                        \"multiProcessorUseCases\": [],\n+                        \"primaryNodeOnly\": false,\n+                        \"propertyDescriptors\": {\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\": \"Mark Messages as Read\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Use SSL\": {\n+                                \"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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Use SSL\",\n+                                \"required\": true,\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+                            },\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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+                                \"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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"host\",\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+                                \"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\": \"2.0.0-M3\"\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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+                        \"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+                        \"useCases\": [],\n+                        \"version\": \"2.0.0-M3\"\n+                    },\n+                    {\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-email-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"f2215c6\"\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+                        \"multiProcessorUseCases\": [],\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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+                                \"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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"host\",\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+                                \"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\": \"2.0.0-M3\"\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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+                        \"supportsSensitiveDynamicProperties\": false,\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+                        \"useCases\": [],\n+                        \"version\": \"2.0.0-M3\"\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-email-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"f2215c6\"\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+                        \"multiProcessorUseCases\": [],\n+                        \"primaryNodeOnly\": false,\n+                        \"sideEffectFree\": true,\n+                        \"supportedRelationships\": [\n+                            {\n+                                \"description\": \"Each individual attachment will be routed to the attachments relationship\",\n+                                \"name\": \"attachments\"\n+                            },\n+                            {\n+                                \"description\": \"FlowFiles that could not be parsed\",\n+                                \"name\": \"failure\"\n+                            },\n+                            {\n+                                \"description\": \"The original file\",\n+                                \"name\": \"original\"\n+                            }\n+                        ],\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\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.ExtractEmailAttachments\",\n+                        \"typeDescription\": \"Extract attachments from a mime formatted email file, splitting them into individual flowfiles.\",\n+                        \"useCases\": [],\n+                        \"version\": \"2.0.0-M3\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"The filename of the attachment\",\n+                                \"name\": \"filename \"\n+                            },\n+                            {\n+                                \"description\": \"The filename of the parent FlowFile\",\n+                                \"name\": \"email.attachment.parent.filename \"\n+                            },\n+                            {\n+                                \"description\": \"The UUID of the original FlowFile.\",\n+                                \"name\": \"email.attachment.parent.uuid\"\n+                            },\n+                            {\n+                                \"description\": \"The mime type of the attachment.\",\n+                                \"name\": \"mime.type\"\n+                            }\n+                        ]\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-email-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"f2215c6\"\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+                        \"multiProcessorUseCases\": [],\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"CAPTURED_HEADERS\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"STRICT_ADDRESS_PARSING\": {\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+                                        \"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+                                        \"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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"STRICT_ADDRESS_PARSING\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            }\n+                        },\n+                        \"sideEffectFree\": true,\n+                        \"supportedRelationships\": [\n+                            {\n+                                \"description\": \"Extraction was successful\",\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+                        ],\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\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.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+                        \"useCases\": [],\n+                        \"version\": \"2.0.0-M3\",\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+                            },\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+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-email-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"f2215c6\"\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+                        \"multiProcessorUseCases\": [],\n+                        \"primaryNodeOnly\": false,\n+                        \"sideEffectFree\": true,\n+                        \"supportedRelationships\": [\n+                            {\n+                                \"description\": \"Each individual attachment will be routed to the attachments relationship\",\n+                                \"name\": \"attachments\"\n+                            },\n+                            {\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+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\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+                        \"useCases\": [],\n+                        \"version\": \"2.0.0-M3\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"The filename of the attachment\",\n+                                \"name\": \"filename \"\n+                            },\n+                            {\n+                                \"description\": \"The filename of the parent FlowFile\",\n+                                \"name\": \"email.tnef.attachment.parent.filename \"\n+                            },\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\": \"f2215c6\"\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+                        \"multiProcessorUseCases\": [],\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\": \"REQUIRED\",\n+                                        \"value\": \"REQUIRED\"\n+                                    }\n+                                ],\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\": \"CLIENT_AUTH\",\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"SMTP_HOSTNAME\",\n+                                \"required\": false,\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"SMTP_MAXIMUM_CONNECTIONS\",\n+                                \"required\": true,\n+                                \"sensitive\": false\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"SMTP_MAXIMUM_MSG_SIZE\",\n+                                \"required\": true,\n+                                \"sensitive\": false\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"SMTP_PORT\",\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"SMTP_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+                                \"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\": \"2.0.0-M3\"\n+                                }\n+                            }\n+                        },\n+                        \"sideEffectFree\": false,\n+                        \"supportedRelationships\": [\n+                            {\n+                                \"description\": \"All new messages will be routed as FlowFiles 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+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"email\",\n+                            \"listen\",\n+                            \"smtp\"\n+                        ],\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+                        \"useCases\": [],\n+                        \"version\": \"2.0.0-M3\",\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\": \"2.0.0-M3\"\n+        },\n+        {\n+            \"artifact\": \"nifi-splunk-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n+                \"processors\": [\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-splunk-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"f2215c6\"\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+                        \"multiProcessorUseCases\": [],\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Earliest Time\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\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\": \"Hostname\",\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Latest Time\",\n+                                \"required\": false,\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\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\": \"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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Read Timeout\",\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\": \"2.0.0-M3\"\n+                                }\n+                            },\n+                            \"Scheme\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"https\",\n+                                        \"value\": \"https\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"http\",\n+                                        \"value\": \"http\"\n+                                    }\n+                                ],\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\": \"Scheme\",\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+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"TLSv1\",\n+                                        \"value\": \"TLSv1\"\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+                                    }\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Time Range Strategy\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Time Zone\": {\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@@ -12262,423 +17149,307 @@\n                 ],\n                 \"reportingTasks\": []\n             },\n             \"group\": \"org.apache.nifi\",\n             \"version\": \"2.0.0-M3\"\n         },\n         {\n-            \"artifact\": \"nifi-github-nar\",\n+            \"artifact\": \"nifi-py4j-nar\",\n             \"componentManifest\": {\n                 \"controllerServices\": [],\n                 \"processors\": [],\n                 \"reportingTasks\": []\n             },\n             \"group\": \"org.apache.nifi\",\n             \"version\": \"2.0.0-M3\"\n         },\n         {\n-            \"artifact\": \"nifi-box-nar\",\n+            \"artifact\": \"nifi-mongodb-client-service-api-nar\",\n             \"componentManifest\": {\n                 \"controllerServices\": [],\n-                \"processors\": [\n+                \"processors\": [],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"2.0.0-M3\"\n+        },\n+        {\n+            \"artifact\": \"nifi-confluent-platform-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-box-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-confluent-platform-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\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-                        \"multiProcessorUseCases\": [],\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\": \"box-client-service\",\n-                                \"required\": true,\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\": \"2.0.0-M3\"\n-                                }\n-                            },\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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables 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\": \"A FlowFile will be routed here for each successfully fetched File.\",\n-                                \"name\": \"success\"\n-                            },\n+                        \"providedApiImplementations\": [\n                             {\n-                                \"description\": \"A FlowFile will be routed here for each File for which fetch was attempted but failed.\",\n-                                \"name\": \"failure\"\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.schemaregistry.services.SchemaReferenceReader\",\n+                                \"version\": \"2.0.0-M3\"\n                             }\n                         ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"box\",\n-                            \"fetch\",\n-                            \"storage\"\n+                            \"avro\",\n+                            \"confluent\",\n+                            \"kafka\",\n+                            \"registry\",\n+                            \"schema\"\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-                        \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\",\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+                        \"type\": \"org.apache.nifi.confluent.schemaregistry.ConfluentEncodedSchemaReferenceReader\",\n+                        \"typeDescription\": \"Reads Schema Identifier according to Confluent encoding as a header consisting of a byte marker and an integer represented as four bytes\",\n+                        \"version\": \"2.0.0-M3\"\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-confluent-platform-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"f2215c6\"\n+                        },\n+                        \"group\": \"org.apache.nifi\",\n+                        \"providedApiImplementations\": [\n                             {\n-                                \"description\": \"The error message returned by Box\",\n-                                \"name\": \"error.message\"\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.schemaregistry.services.SchemaReferenceWriter\",\n+                                \"version\": \"2.0.0-M3\"\n                             }\n-                        ]\n+                        ],\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"avro\",\n+                            \"confluent\",\n+                            \"kafka\",\n+                            \"registry\",\n+                            \"schema\"\n+                        ],\n+                        \"type\": \"org.apache.nifi.confluent.schemaregistry.ConfluentEncodedSchemaReferenceWriter\",\n+                        \"typeDescription\": \"Writes Schema Identifier according to Confluent encoding as a header consisting of a byte marker and an integer represented as four bytes\",\n+                        \"version\": \"2.0.0-M3\"\n                     },\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-box-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-confluent-platform-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\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\": \"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-                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n-                        \"multiProcessorUseCases\": [],\n-                        \"primaryNodeOnly\": true,\n                         \"propertyDescriptors\": {\n-                            \"box-client-service\": {\n-                                \"description\": \"Controller Service used to obtain a Box API connection.\",\n-                                \"displayName\": \"Box Client Service\",\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\": \"box-client-service\",\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-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-box-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.box.controllerservices.BoxClientService\",\n-                                    \"version\": \"2.0.0-M3\"\n-                                }\n+                                \"sensitive\": false\n                             },\n-                            \"box-folder-id\": {\n-                                \"description\": \"The ID of the folder from which to pull list of files.\",\n-                                \"displayName\": \"Folder ID\",\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"box-folder-id\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"cache-size\",\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+                            \"password\": {\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"entities\"\n+                                            \"BASIC\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Listing Strategy\",\n-                                        \"propertyName\": \"listing-strategy\"\n+                                        \"propertyDisplayName\": \"Authentication Type\",\n+                                        \"propertyName\": \"authentication-type\"\n                                     }\n                                 ],\n-                                \"description\": \"Specify how initial listing should be handled. Used by 'Tracking Entities' strategy.\",\n-                                \"displayName\": \"Entity Tracking Initial Listing Target\",\n+                                \"description\": \"Password for authentication to Confluent Schema Registry\",\n+                                \"displayName\": \"Password\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"et-initial-listing-target\",\n+                                \"name\": \"password\",\n                                 \"required\": false,\n-                                \"sensitive\": false\n+                                \"sensitive\": true\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+                            \"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\": \"et-state-cache\",\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.distributed.cache.client.DistributedMapCacheClient\",\n+                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n                                     \"version\": \"2.0.0-M3\"\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"et-time-window\",\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+                            \"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\": \"listing-strategy\",\n+                                \"name\": \"timeout\",\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+                            \"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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"min-age\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"url\",\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-                                \"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\": \"2.0.0-M3\"\n-                                }\n-                            },\n-                            \"recursive-search\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n+                            \"username\": {\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"dependentValues\": [\n+                                            \"BASIC\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Authentication Type\",\n+                                        \"propertyName\": \"authentication-type\"\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+                                \"description\": \"Username for authentication to Confluent Schema Registry\",\n+                                \"displayName\": \"Username\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"recursive-search\",\n-                                \"required\": true,\n+                                \"name\": \"username\",\n+                                \"required\": false,\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+                        \"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.schemaregistry.services.SchemaRegistry\",\n+                                \"version\": \"2.0.0-M3\"\n                             }\n                         ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n+                        \"supportsDynamicProperties\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"box\",\n-                            \"storage\"\n+                            \"avro\",\n+                            \"confluent\",\n+                            \"kafka\",\n+                            \"registry\",\n+                            \"schema\"\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-                        \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\",\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-                    },\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\": \"2.0.0-M3\"\n+                    }\n+                ],\n+                \"processors\": [],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"2.0.0-M3\"\n+        },\n+        {\n+            \"artifact\": \"nifi-provenance-repository-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n+                \"processors\": [],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"2.0.0-M3\"\n+        },\n+        {\n+            \"artifact\": \"nifi-jetty-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n+                \"processors\": [],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\n+        },\n+        {\n+            \"artifact\": \"nifi-stateful-analysis-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n+                \"processors\": [\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-box-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-stateful-analysis-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -12691,2209 +17462,1162 @@\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"multiProcessorUseCases\": [],\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\": \"box-client-service\",\n-                                \"required\": true,\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\": \"2.0.0-M3\"\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"box-folder-id\",\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+                            \"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\": \"chunked-upload-threshold\",\n+                                \"name\": \"Sub-window length\",\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 Box 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-                            \"create-folder\": {\n-                                \"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\": \"Subfolder Name\",\n-                                        \"propertyName\": \"subfolder-name\"\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+                            \"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\": \"create-folder\",\n+                                \"name\": \"Time window\",\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+                            \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"file-name\",\n+                                \"name\": \"Value to track\",\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"subfolder-name\",\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+                        \"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\": \"Files that have been successfully written to Box are transferred to this relationship.\",\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\": \"Files that could not be written to Box for some reason are transferred to this relationship.\",\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                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"box\",\n-                            \"put\",\n-                            \"storage\"\n+                            \"Attribute Expression Language\",\n+                            \"data science\",\n+                            \"rolling\",\n+                            \"state\",\n+                            \"window\"\n                         ],\n-                        \"triggerSerially\": false,\n+                        \"triggerSerially\": true,\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.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                         \"useCases\": [],\n                         \"version\": \"2.0.0-M3\",\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+                                \"description\": \"The rolling window value (sum of all the values stored).\",\n+                                \"name\": \"rolling_window_value\"\n                             },\n                             {\n-                                \"description\": \"The size of the file\",\n-                                \"name\": \"box.size\"\n+                                \"description\": \"The count of the number of FlowFiles seen in the rolling window.\",\n+                                \"name\": \"rolling_window_count\"\n                             },\n                             {\n-                                \"description\": \"The last modified time of the file\",\n-                                \"name\": \"box.timestamp\"\n+                                \"description\": \"The mean of the FlowFiles seen in the rolling window.\",\n+                                \"name\": \"rolling_window_mean\"\n                             },\n                             {\n-                                \"description\": \"The error code returned by Box\",\n-                                \"name\": \"error.code\"\n+                                \"description\": \"The variance of the FlowFiles seen in the rolling window.\",\n+                                \"name\": \"rolling_window_variance\"\n                             },\n                             {\n-                                \"description\": \"The error message returned by Box\",\n-                                \"name\": \"error.message\"\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\": \"2.0.0-M3\"\n         },\n         {\n-            \"artifact\": \"nifi-site-to-site-reporting-nar\",\n+            \"artifact\": \"nifi-websocket-services-jetty-nar\",\n             \"componentManifest\": {\n                 \"controllerServices\": [\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-site-to-site-reporting-nar\",\n+                        \"artifact\": \"nifi-websocket-services-jetty-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"group\": \"org.apache.nifi\",\n                         \"propertyDescriptors\": {\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Batch Size\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Communications Timeout\": {\n-                                \"defaultValue\": \"30 secs\",\n-                                \"description\": \"Specifies how long to wait to a response from the destination before deciding that an error has occurred and canceling the transaction\",\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-                            \"Compress 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\": \"Indicates whether or not to compress the data being sent.\",\n-                                \"displayName\": \"Compress Events\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Compress Events\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Destination URL\": {\n-                                \"description\": \"The URL of the destination NiFi instance or, if clustered, a comma-separated list of address in the format of http(s)://host:port/nifi. This destination URL will only be used to initiate the Site-to-Site connection. The data sent by this reporting task will be load-balanced on all the nodes of the destination (if clustered).\",\n-                                \"displayName\": \"Destination URL\",\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\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Destination URL\",\n+                                \"name\": \"authentication-charset\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Input Port Name\": {\n-                                \"description\": \"The name of the Input Port to deliver data to.\",\n-                                \"displayName\": \"Input Port Name\",\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\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Input Port Name\",\n+                                \"name\": \"connection-attempt-timeout\",\n                                 \"required\": true,\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+                            \"connection-timeout\": {\n+                                \"defaultValue\": \"3 sec\",\n+                                \"description\": \"The timeout to connect the WebSocket URI.\",\n+                                \"displayName\": \"Connection Timeout\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Instance URL\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"SSL Context Service\": {\n-                                \"description\": \"The SSL Context Service to use when communicating with the destination. 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\": \"2.0.0-M3\"\n-                                }\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+                                \"name\": \"connection-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\": \"2.0.0-M3\"\n-                                }\n-                            },\n-                            \"s2s-http-proxy-hostname\": {\n-                                \"description\": \"Specify the proxy server's hostname to use. If not specified, HTTP traffics are sent directly to the target NiFi instance.\",\n-                                \"displayName\": \"HTTP Proxy hostname\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"s2s-http-proxy-hostname\",\n-                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"s2s-http-proxy-password\": {\n-                                \"description\": \"Specify an user password to connect to the proxy server, optional.\",\n-                                \"displayName\": \"HTTP Proxy password\",\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\": \"s2s-http-proxy-password\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"custom-authorization\",\n                                 \"required\": false,\n                                 \"sensitive\": true\n                             },\n-                            \"s2s-http-proxy-port\": {\n-                                \"description\": \"Specify the proxy server's port number, optional. If not specified, default port 80 will be used.\",\n-                                \"displayName\": \"HTTP Proxy port\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"s2s-http-proxy-port\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"s2s-http-proxy-username\": {\n-                                \"description\": \"Specify an user name to connect to the proxy server, optional.\",\n-                                \"displayName\": \"HTTP Proxy username\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"s2s-http-proxy-username\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"s2s-transport-protocol\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"RAW\",\n-                                        \"value\": \"RAW\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"HTTP\",\n-                                        \"value\": \"HTTP\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"RAW\",\n-                                \"description\": \"Specifies which transport protocol to use for Site-to-Site communication.\",\n-                                \"displayName\": \"Transport Protocol\",\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\": \"s2s-transport-protocol\",\n+                                \"name\": \"input-buffer-size\",\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\": \"2.0.0-M3\"\n-                            }\n-                        ],\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"db\",\n-                            \"record\",\n-                            \"s2s\",\n-                            \"site\"\n-                        ],\n-                        \"type\": \"org.apache.nifi.reporting.sink.SiteToSiteReportingRecordSink\",\n-                        \"typeDescription\": \"Provides a service to write records using a configured RecordSetWriter over a Site-to-Site connection.\",\n-                        \"version\": \"2.0.0-M3\"\n-                    }\n-                ],\n-                \"processors\": [],\n-                \"reportingTasks\": [\n-                    {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-site-to-site-reporting-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"f2215c6\"\n-                        },\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"1 min\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"explicitRestrictions\": [\n-                            {\n-                                \"explanation\": \"Provides operator the ability to send sensitive details contained in bulletin events to any external system.\",\n-                                \"requiredPermission\": \"export nifi details\"\n-                            }\n-                        ],\n-                        \"group\": \"org.apache.nifi\",\n-                        \"propertyDescriptors\": {\n-                            \"Communications Timeout\": {\n-                                \"defaultValue\": \"30 secs\",\n-                                \"description\": \"Specifies how long to wait to a response from the destination before deciding that an error has occurred and canceling the transaction\",\n-                                \"displayName\": \"Communications Timeout\",\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                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Communications Timeout\",\n+                                \"name\": \"max-binary-message-size\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Compress 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\": \"Indicates whether or not to compress the data being sent.\",\n-                                \"displayName\": \"Compress Events\",\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\": \"Compress Events\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Destination URL\": {\n-                                \"description\": \"The URL of the destination NiFi instance or, if clustered, a comma-separated list of address in the format of http(s)://host:port/nifi. This destination URL will only be used to initiate the Site-to-Site connection. The data sent by this reporting task will be load-balanced on all the nodes of the destination (if clustered).\",\n-                                \"displayName\": \"Destination URL\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Destination URL\",\n+                                \"name\": \"max-text-message-size\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Input Port Name\": {\n-                                \"description\": \"The name of the Input Port to deliver data to.\",\n-                                \"displayName\": \"Input Port Name\",\n+                            \"proxy-host\": {\n+                                \"description\": \"The host name of the HTTP Proxy.\",\n+                                \"displayName\": \"HTTP Proxy Host\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Input Port Name\",\n-                                \"required\": true,\n+                                \"name\": \"proxy-host\",\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+                            \"proxy-port\": {\n+                                \"description\": \"The port number of the HTTP Proxy.\",\n+                                \"displayName\": \"HTTP Proxy Port\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Instance URL\",\n-                                \"required\": true,\n+                                \"name\": \"proxy-port\",\n+                                \"required\": false,\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+                            \"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\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Platform\",\n+                                \"name\": \"session-maintenance-interval\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"SSL Context Service\": {\n-                                \"description\": \"The SSL Context Service to use when communicating with the destination. If not specified, communications will not be secure.\",\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\": \"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.RestrictedSSLContextService\",\n                                     \"version\": \"2.0.0-M3\"\n                                 }\n                             },\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\": \"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\": \"include-null-values\",\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-                                \"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\": \"2.0.0-M3\"\n-                                }\n-                            },\n-                            \"s2s-http-proxy-hostname\": {\n-                                \"description\": \"Specify the proxy server's hostname to use. If not specified, HTTP traffics are sent directly to the target NiFi instance.\",\n-                                \"displayName\": \"HTTP Proxy hostname\",\n+                            \"user-name\": {\n+                                \"description\": \"The user name for Basic Authentication.\",\n+                                \"displayName\": \"User Name\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"s2s-http-proxy-hostname\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"user-name\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"s2s-http-proxy-password\": {\n-                                \"description\": \"Specify an user password to connect to the proxy server, optional.\",\n-                                \"displayName\": \"HTTP Proxy password\",\n+                            \"user-password\": {\n+                                \"description\": \"The user password for Basic Authentication.\",\n+                                \"displayName\": \"User Password\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"s2s-http-proxy-password\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"user-password\",\n                                 \"required\": false,\n                                 \"sensitive\": true\n                             },\n-                            \"s2s-http-proxy-port\": {\n-                                \"description\": \"Specify the proxy server's port number, optional. If not specified, default port 80 will be used.\",\n-                                \"displayName\": \"HTTP Proxy port\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"s2s-http-proxy-port\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"s2s-http-proxy-username\": {\n-                                \"description\": \"Specify an user name to connect to the proxy server, optional.\",\n-                                \"displayName\": \"HTTP Proxy username\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"s2s-http-proxy-username\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"s2s-transport-protocol\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"RAW\",\n-                                        \"value\": \"RAW\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"HTTP\",\n-                                        \"value\": \"HTTP\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"RAW\",\n-                                \"description\": \"Specifies which transport protocol to use for Site-to-Site communication.\",\n-                                \"displayName\": \"Transport Protocol\",\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\": \"s2s-transport-protocol\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"websocket-uri\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"restricted\": true,\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n+                        \"providedApiImplementations\": [\n+                            {\n+                                \"artifact\": \"nifi-websocket-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.websocket.WebSocketClientService\",\n+                                \"version\": \"2.0.0-M3\"\n+                            },\n+                            {\n+                                \"artifact\": \"nifi-websocket-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.websocket.WebSocketService\",\n+                                \"version\": \"2.0.0-M3\"\n+                            }\n                         ],\n                         \"supportsDynamicProperties\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"bulletin\",\n-                            \"site\",\n-                            \"site to site\"\n+                            \"Jetty\",\n+                            \"WebSocket\",\n+                            \"client\"\n                         ],\n-                        \"type\": \"org.apache.nifi.reporting.SiteToSiteBulletinReportingTask\",\n-                        \"typeDescription\": \"Publishes Bulletin events using the Site To Site protocol. Note: only up to 5 bulletins are stored per component and up to 10 bulletins at controller level for a duration of up to 5 minutes. If this reporting task is not scheduled frequently enough some bulletins may not be sent.\",\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\": \"2.0.0-M3\"\n                     },\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-site-to-site-reporting-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-websocket-services-jetty-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"group\": \"org.apache.nifi\",\n                         \"propertyDescriptors\": {\n-                            \"Communications Timeout\": {\n-                                \"defaultValue\": \"30 secs\",\n-                                \"description\": \"Specifies how long to wait to a response from the destination before deciding that an error has occurred and canceling the transaction\",\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-                            \"Compress 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\": \"Indicates whether or not to compress the data being sent.\",\n-                                \"displayName\": \"Compress Events\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Compress Events\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Destination URL\": {\n-                                \"description\": \"The URL of the destination NiFi instance or, if clustered, a comma-separated list of address in the format of http(s)://host:port/nifi. This destination URL will only be used to initiate the Site-to-Site connection. The data sent by this reporting task will be load-balanced on all the nodes of the destination (if clustered).\",\n-                                \"displayName\": \"Destination URL\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Destination URL\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Input Port Name\": {\n-                                \"description\": \"The name of the Input Port to deliver data to.\",\n-                                \"displayName\": \"Input Port Name\",\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\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Input Port Name\",\n-                                \"required\": true,\n+                                \"name\": \"auth-path-spec\",\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+                            \"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\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Instance URL\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"SSL Context Service\": {\n-                                \"description\": \"The SSL Context Service to use when communicating with the destination. 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\": \"auth-roles\",\n                                 \"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\": \"2.0.0-M3\"\n-                                }\n+                                \"sensitive\": false\n                             },\n-                            \"include-null-values\": {\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                                 \"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\": \"include-null-values\",\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-                                \"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\": \"2.0.0-M3\"\n-                                }\n-                            },\n-                            \"s2s-http-proxy-hostname\": {\n-                                \"description\": \"Specify the proxy server's hostname to use. If not specified, HTTP traffics are sent directly to the target NiFi instance.\",\n-                                \"displayName\": \"HTTP Proxy hostname\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"s2s-http-proxy-hostname\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"s2s-http-proxy-password\": {\n-                                \"description\": \"Specify an user password to connect to the proxy server, optional.\",\n-                                \"displayName\": \"HTTP Proxy password\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"s2s-http-proxy-password\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n-                            },\n-                            \"s2s-http-proxy-port\": {\n-                                \"description\": \"Specify the proxy server's port number, optional. If not specified, default port 80 will be used.\",\n-                                \"displayName\": \"HTTP Proxy port\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"s2s-http-proxy-port\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"s2s-http-proxy-username\": {\n-                                \"description\": \"Specify an user name to connect to the proxy server, optional.\",\n-                                \"displayName\": \"HTTP Proxy username\",\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\": \"s2s-http-proxy-username\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"s2s-metrics-application-id\": {\n-                                \"defaultValue\": \"nifi\",\n-                                \"description\": \"The Application ID to be included in the metrics\",\n-                                \"displayName\": \"Application ID\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"s2s-metrics-application-id\",\n+                                \"name\": \"basic-auth\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"s2s-metrics-format\": {\n+                            \"client-authentication\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Metrics will be formatted according to the Ambari Metrics API. See Additional Details in Usage documentation.\",\n-                                        \"displayName\": \"Ambari Format\",\n-                                        \"value\": \"ambari-format\"\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\": \"Metrics will be formatted using the Record Writer property of this reporting task. See Additional Details in Usage documentation to have the description of the default schema.\",\n-                                        \"displayName\": \"Record Format\",\n-                                        \"value\": \"record-format\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"ambari-format\",\n-                                \"description\": \"The output format that will be used for the metrics. If Record Format is selected, a Record Writer must be provided. If Ambari Format is selected, the Record Writer property should be empty.\",\n-                                \"displayName\": \"Output Format\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"s2s-metrics-format\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"s2s-metrics-hostname\": {\n-                                \"defaultValue\": \"${hostname(true)}\",\n-                                \"description\": \"The Hostname of this NiFi instance to be included in the metrics\",\n-                                \"displayName\": \"Hostname\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"s2s-metrics-hostname\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"s2s-transport-protocol\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"RAW\",\n-                                        \"value\": \"RAW\"\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\": \"\",\n-                                        \"displayName\": \"HTTP\",\n-                                        \"value\": \"HTTP\"\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\": \"RAW\",\n-                                \"description\": \"Specifies which transport protocol to use for Site-to-Site communication.\",\n-                                \"displayName\": \"Transport Protocol\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"s2s-transport-protocol\",\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-                            \"metrics\",\n-                            \"site\",\n-                            \"site to site\",\n-                            \"status\"\n-                        ],\n-                        \"type\": \"org.apache.nifi.reporting.SiteToSiteMetricsReportingTask\",\n-                        \"typeDescription\": \"Publishes same metrics as the Ambari Reporting task using the Site To Site protocol.\",\n-                        \"version\": \"2.0.0-M3\"\n-                    },\n-                    {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-site-to-site-reporting-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"f2215c6\"\n-                        },\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"explicitRestrictions\": [\n-                            {\n-                                \"explanation\": \"Provides operator the ability to send sensitive details contained in Provenance events to any external system.\",\n-                                \"requiredPermission\": \"export nifi details\"\n-                            }\n-                        ],\n-                        \"group\": \"org.apache.nifi\",\n-                        \"propertyDescriptors\": {\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Batch Size\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Communications Timeout\": {\n-                                \"defaultValue\": \"30 secs\",\n-                                \"description\": \"Specifies how long to wait to a response from the destination before deciding that an error has occurred and canceling the transaction\",\n-                                \"displayName\": \"Communications Timeout\",\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\": \"Communications Timeout\",\n+                                \"name\": \"client-authentication\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Compress 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\": \"Indicates whether or not to compress the data being sent.\",\n-                                \"displayName\": \"Compress Events\",\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\": \"Compress Events\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Destination URL\": {\n-                                \"description\": \"The URL of the destination NiFi instance or, if clustered, a comma-separated list of address in the format of http(s)://host:port/nifi. This destination URL will only be used to initiate the Site-to-Site connection. The data sent by this reporting task will be load-balanced on all the nodes of the destination (if clustered).\",\n-                                \"displayName\": \"Destination URL\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Destination URL\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Input Port Name\": {\n-                                \"description\": \"The name of the Input Port to deliver data to.\",\n-                                \"displayName\": \"Input Port Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Input Port Name\",\n-                                \"required\": true,\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Instance URL\",\n+                                \"name\": \"input-buffer-size\",\n                                 \"required\": 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+                            \"listen-port\": {\n+                                \"description\": \"The port number on which this WebSocketServer listens to.\",\n+                                \"displayName\": \"Listen Port\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Platform\",\n+                                \"name\": \"listen-port\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"SSL Context Service\": {\n-                                \"description\": \"The SSL Context Service to use when communicating with the destination. 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\": \"2.0.0-M3\"\n-                                }\n-                            },\n-                            \"include-null-values\": {\n+                            \"login-service\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\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\": \"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\": \"include-null-values\",\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-                                \"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\": \"2.0.0-M3\"\n-                                }\n-                            },\n-                            \"s2s-http-proxy-hostname\": {\n-                                \"description\": \"Specify the proxy server's hostname to use. If not specified, HTTP traffics are sent directly to the target NiFi instance.\",\n-                                \"displayName\": \"HTTP Proxy hostname\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"s2s-http-proxy-hostname\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"s2s-http-proxy-password\": {\n-                                \"description\": \"Specify an user password to connect to the proxy server, optional.\",\n-                                \"displayName\": \"HTTP Proxy password\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"s2s-http-proxy-password\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n-                            },\n-                            \"s2s-http-proxy-port\": {\n-                                \"description\": \"Specify the proxy server's port number, optional. If not specified, default port 80 will be used.\",\n-                                \"displayName\": \"HTTP Proxy port\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"s2s-http-proxy-port\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"s2s-http-proxy-username\": {\n-                                \"description\": \"Specify an user name to connect to the proxy server, optional.\",\n-                                \"displayName\": \"HTTP Proxy username\",\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\": \"s2s-http-proxy-username\",\n-                                \"required\": false,\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, UPLOAD, 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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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, UPLOAD, 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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"s2s-prov-task-id-filter\",\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"s2s-prov-task-id-filter-exclude\",\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"s2s-prov-task-name-filter\",\n-                                \"required\": false,\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"s2s-prov-task-name-filter-exclude\",\n-                                \"required\": false,\n-                                \"sensitive\": false\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"s2s-prov-task-type-filter\",\n-                                \"required\": false,\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"s2s-prov-task-type-filter-exclude\",\n+                                \"name\": \"login-service\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"s2s-transport-protocol\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"RAW\",\n-                                        \"value\": \"RAW\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"HTTP\",\n-                                        \"value\": \"HTTP\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"RAW\",\n-                                \"description\": \"Specifies which transport protocol to use for Site-to-Site communication.\",\n-                                \"displayName\": \"Transport Protocol\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"s2s-transport-protocol\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"start-position\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            }\n-                        },\n-                        \"restricted\": true,\n-                        \"stateful\": {\n-                            \"description\": \"Stores the Reporting Task's last event Id so that on restart the task knows where it left off.\",\n-                            \"scopes\": [\n-                                \"LOCAL\"\n-                            ]\n-                        },\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"lineage\",\n-                            \"provenance\",\n-                            \"site\",\n-                            \"site to site\",\n-                            \"tracking\"\n-                        ],\n-                        \"type\": \"org.apache.nifi.reporting.SiteToSiteProvenanceReportingTask\",\n-                        \"typeDescription\": \"Publishes Provenance events using the Site To Site protocol.\",\n-                        \"version\": \"2.0.0-M3\"\n-                    },\n-                    {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-site-to-site-reporting-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"f2215c6\"\n-                        },\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"group\": \"org.apache.nifi\",\n-                        \"propertyDescriptors\": {\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Batch Size\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Communications Timeout\": {\n-                                \"defaultValue\": \"30 secs\",\n-                                \"description\": \"Specifies how long to wait to a response from the destination before deciding that an error has occurred and canceling the transaction\",\n-                                \"displayName\": \"Communications Timeout\",\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\": \"Communications Timeout\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Component Name Filter Regex\": {\n-                                \"defaultValue\": \".*\",\n-                                \"description\": \"A regex specifying which component names to report.  Any component name matching this regex will be included.\",\n-                                \"displayName\": \"Component Name Filter Regex\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Component Name Filter Regex\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Component Type Filter Regex\": {\n-                                \"defaultValue\": \"(Processor|ProcessGroup|RemoteProcessGroup|RootProcessGroup|Connection|InputPort|OutputPort)\",\n-                                \"description\": \"A regex specifying which component types to report.  Any component type matching this regex will be included.  Component types are: Processor, RootProcessGroup, ProcessGroup, RemoteProcessGroup, Connection, InputPort, OutputPort\",\n-                                \"displayName\": \"Component Type Filter Regex\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Component Type Filter Regex\",\n+                                \"name\": \"max-binary-message-size\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Compress 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\": \"Indicates whether or not to compress the data being sent.\",\n-                                \"displayName\": \"Compress Events\",\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\": \"Compress Events\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Destination URL\": {\n-                                \"description\": \"The URL of the destination NiFi instance or, if clustered, a comma-separated list of address in the format of http(s)://host:port/nifi. This destination URL will only be used to initiate the Site-to-Site connection. The data sent by this reporting task will be load-balanced on all the nodes of the destination (if clustered).\",\n-                                \"displayName\": \"Destination URL\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Destination URL\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Input Port Name\": {\n-                                \"description\": \"The name of the Input Port to deliver data to.\",\n-                                \"displayName\": \"Input Port Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Input Port Name\",\n-                                \"required\": true,\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Instance URL\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Platform\": {\n-                                \"defaultValue\": \"nifi\",\n-                                \"description\": \"The value to use for the platform field in each status record.\",\n-                                \"displayName\": \"Platform\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Platform\",\n+                                \"name\": \"max-text-message-size\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"SSL Context Service\": {\n-                                \"description\": \"The SSL Context Service to use when communicating with the destination. If not specified, communications will not be secure.\",\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\": \"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.RestrictedSSLContextService\",\n                                     \"version\": \"2.0.0-M3\"\n                                 }\n                             },\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\": \"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\": \"include-null-values\",\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-                                \"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\": \"2.0.0-M3\"\n-                                }\n-                            },\n-                            \"s2s-http-proxy-hostname\": {\n-                                \"description\": \"Specify the proxy server's hostname to use. If not specified, HTTP traffics are sent directly to the target NiFi instance.\",\n-                                \"displayName\": \"HTTP Proxy hostname\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"s2s-http-proxy-hostname\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"s2s-http-proxy-password\": {\n-                                \"description\": \"Specify an user password to connect to the proxy server, optional.\",\n-                                \"displayName\": \"HTTP Proxy password\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"s2s-http-proxy-password\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n-                            },\n-                            \"s2s-http-proxy-port\": {\n-                                \"description\": \"Specify the proxy server's port number, optional. If not specified, default port 80 will be used.\",\n-                                \"displayName\": \"HTTP Proxy port\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"s2s-http-proxy-port\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"s2s-http-proxy-username\": {\n-                                \"description\": \"Specify an user name to connect to the proxy server, optional.\",\n-                                \"displayName\": \"HTTP Proxy username\",\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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"s2s-http-proxy-username\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"users-properties-file\",\n                                 \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"s2s-transport-protocol\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"RAW\",\n-                                        \"value\": \"RAW\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"HTTP\",\n-                                        \"value\": \"HTTP\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"RAW\",\n-                                \"description\": \"Specifies which transport protocol to use for Site-to-Site communication.\",\n-                                \"displayName\": \"Transport Protocol\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"s2s-transport-protocol\",\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-websocket-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.websocket.WebSocketServerService\",\n+                                \"version\": \"2.0.0-M3\"\n+                            },\n+                            {\n+                                \"artifact\": \"nifi-websocket-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.websocket.WebSocketService\",\n+                                \"version\": \"2.0.0-M3\"\n+                            }\n                         ],\n                         \"supportsDynamicProperties\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"history\",\n-                            \"metrics\",\n-                            \"site\",\n-                            \"site to site\",\n-                            \"status\"\n+                            \"Jetty\",\n+                            \"WebSocket\",\n+                            \"server\"\n                         ],\n-                        \"type\": \"org.apache.nifi.reporting.SiteToSiteStatusReportingTask\",\n-                        \"typeDescription\": \"Publishes Status events using the Site To Site protocol.  The component type and name filter regexes form a union: only components matching both regexes will be reported.  However, all process groups are recursively searched for matching components, regardless of whether the process group matches the component filters.\",\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\": \"2.0.0-M3\"\n                     }\n-                ]\n+                ],\n+                \"processors\": [],\n+                \"reportingTasks\": []\n             },\n             \"group\": \"org.apache.nifi\",\n             \"version\": \"2.0.0-M3\"\n         },\n         {\n-            \"artifact\": \"nifi-web-client-provider-service-nar\",\n+            \"artifact\": \"nifi-kerberos-user-service-nar\",\n             \"componentManifest\": {\n                 \"controllerServices\": [\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-web-client-provider-service-nar\",\n+                        \"artifact\": \"nifi-kerberos-user-service-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\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-                            \"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\": \"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\": \"2.0.0-M3\"\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-                            \"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+                            \"Kerberos Keytab\": {\n+                                \"description\": \"Kerberos keytab associated with the principal.\",\n+                                \"displayName\": \"Kerberos Keytab\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"redirect-handling-strategy\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Kerberos Keytab\",\n                                 \"required\": true,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"SINGLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\"\n+                                    ]\n+                                },\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.ssl.SSLContextService\",\n-                                    \"version\": \"2.0.0-M3\"\n-                                }\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+                            \"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\": \"write-timeout\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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.web.client.provider.api.WebClientServiceProvider\",\n+                                \"type\": \"org.apache.nifi.kerberos.KerberosUserService\",\n+                                \"version\": \"2.0.0-M3\"\n+                            },\n+                            {\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.kerberos.SelfContainedKerberosUserService\",\n                                 \"version\": \"2.0.0-M3\"\n                             }\n                         ],\n+                        \"restricted\": true,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"Client\",\n-                            \"HTTP\",\n-                            \"Web\"\n+                            \"Authentication\",\n+                            \"Credentials\",\n+                            \"Kerberos\",\n+                            \"Keytab\",\n+                            \"Principal\",\n+                            \"Security\"\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+                        \"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\": \"2.0.0-M3\"\n-                    }\n-                ],\n-                \"processors\": [],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\n-        },\n-        {\n-            \"artifact\": \"nifi-standard-shared-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [],\n-                \"processors\": [],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"2.0.0-M3\"\n-        },\n-        {\n-            \"artifact\": \"nifi-scripting-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [\n+                    },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-scripting-nar\",\n+                        \"artifact\": \"nifi-kerberos-user-service-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\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\": \"ENVIRONMENT\",\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Groovy 4.0.21 [Groovy Scripting Engine 2.0]\",\n-                                        \"displayName\": \"Groovy\",\n-                                        \"value\": \"Groovy\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"Groovy\",\n-                                \"description\": \"Language Engine for executing scripts\",\n-                                \"displayName\": \"Script Engine\",\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\": \"Script Engine\",\n+                                \"name\": \"Kerberos Password\",\n                                 \"required\": true,\n-                                \"sensitive\": false\n+                                \"sensitive\": true\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 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\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Script File\",\n-                                \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\"\n-                                    ]\n-                                },\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.lookup.LookupService\",\n+                                \"type\": \"org.apache.nifi.kerberos.KerberosUserService\",\n                                 \"version\": \"2.0.0-M3\"\n                             }\n                         ],\n-                        \"restricted\": true,\n-                        \"supportsDynamicProperties\": true,\n+                        \"supportsDynamicProperties\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"groovy\",\n-                            \"invoke\",\n-                            \"lookup\",\n-                            \"record\",\n-                            \"script\"\n+                            \"Authentication\",\n+                            \"Credentials\",\n+                            \"Kerberos\",\n+                            \"Password\",\n+                            \"Principal\",\n+                            \"Security\"\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.\",\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\": \"2.0.0-M3\"\n                     },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-scripting-nar\",\n+                        \"artifact\": \"nifi-kerberos-user-service-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\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\": \"ENVIRONMENT\",\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+                                \"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-                            \"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+                            \"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\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Groovy 4.0.21 [Groovy Scripting Engine 2.0]\",\n-                                        \"displayName\": \"Groovy\",\n-                                        \"value\": \"Groovy\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"Groovy\",\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+                                \"name\": \"Kerberos Principal\",\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 Ticket Cache File\": {\n+                                \"description\": \"Kerberos ticket cache associated with the principal.\",\n+                                \"displayName\": \"Kerberos Ticket Cache File\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Script File\",\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                         \"providedApiImplementations\": [\n                             {\n                                 \"artifact\": \"nifi-standard-services-api-nar\",\n                                 \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.lookup.StringLookupService\",\n+                                \"type\": \"org.apache.nifi.kerberos.KerberosUserService\",\n                                 \"version\": \"2.0.0-M3\"\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.kerberos.SelfContainedKerberosUserService\",\n                                 \"version\": \"2.0.0-M3\"\n                             }\n                         ],\n                         \"restricted\": true,\n-                        \"supportsDynamicProperties\": true,\n+                        \"supportsDynamicProperties\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"groovy\",\n-                            \"invoke\",\n-                            \"lookup\",\n-                            \"script\"\n+                            \"Authentication\",\n+                            \"Cache\",\n+                            \"Credentials\",\n+                            \"Kerberos\",\n+                            \"Principal\",\n+                            \"Security\",\n+                            \"Ticket\"\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.\",\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\": \"2.0.0-M3\"\n-                    },\n+                    }\n+                ],\n+                \"processors\": [],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"2.0.0-M3\"\n+        },\n+        {\n+            \"artifact\": \"nifi-hubspot-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n+                \"processors\": [\n                     {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-scripting-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-hubspot-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\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\": \"ENVIRONMENT\",\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+                        \"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\": \"10 sec\",\n                         \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n+                        \"multiProcessorUseCases\": [],\n+                        \"primaryNodeOnly\": true,\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+                            \"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\": \"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\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Module Directory\",\n+                                \"name\": \"incremental-delay\",\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"incremental-initial-start-time\",\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+                            \"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\": \"Script Body\",\n-                                \"required\": false,\n+                                \"name\": \"is-incremental\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Script Engine\": {\n+                            \"object-type\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Groovy 4.0.21 [Groovy Scripting Engine 2.0]\",\n-                                        \"displayName\": \"Groovy\",\n-                                        \"value\": \"Groovy\"\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-                                \"defaultValue\": \"Groovy\",\n-                                \"description\": \"Language Engine for executing scripts\",\n-                                \"displayName\": \"Script Engine\",\n+                                \"description\": \"The HubSpot Object Type requested\",\n+                                \"displayName\": \"Object Type\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Script Engine\",\n+                                \"name\": \"object-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+                            \"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\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Script File\",\n+                                \"name\": \"result-limit\",\n                                 \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\"\n-                                    ]\n-                                },\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\": \"2.0.0-M3\"\n+                                }\n                             }\n                         },\n-                        \"providedApiImplementations\": [\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-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n-                                \"version\": \"2.0.0-M3\"\n+                                \"description\": \"For FlowFiles created as a result of a successful HTTP request.\",\n+                                \"name\": \"success\"\n                             }\n                         ],\n-                        \"restricted\": true,\n-                        \"supportsDynamicProperties\": true,\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": false,\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"groovy\",\n-                            \"invoke\",\n-                            \"record\",\n-                            \"recordFactory\",\n-                            \"script\"\n+                            \"hubspot\"\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\": \"2.0.0-M3\"\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+                        \"useCases\": [],\n+                        \"version\": \"2.0.0-M3\",\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\": \"2.0.0-M3\"\n+        },\n+        {\n+            \"artifact\": \"nifi-gcp-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-scripting-nar\",\n+                        \"artifact\": \"nifi-gcp-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\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\": \"ENVIRONMENT\",\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+                                \"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-                            \"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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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+                            \"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\": \"Script Body\",\n+                                \"name\": \"application-default-credentials\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Script Engine\": {\n+                            \"compute-engine-credentials\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Groovy 4.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\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"Groovy\",\n-                                \"description\": \"Language Engine for executing scripts\",\n-                                \"displayName\": \"Script Engine\",\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\": \"Script Engine\",\n-                                \"required\": true,\n+                                \"name\": \"compute-engine-credentials\",\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+                            \"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\": \"2.0.0-M3\"\n+                                }\n+                            },\n+                            \"service-account-json\": {\n+                                \"description\": \"The raw JSON containing a Service Account keyfile.\",\n+                                \"displayName\": \"Service Account JSON\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Script File\",\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-                                \"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\": \"2.0.0-M3\"\n                             }\n                         ],\n                         \"restricted\": true,\n-                        \"supportsDynamicProperties\": true,\n+                        \"supportsDynamicProperties\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"groovy\",\n-                            \"invoke\",\n-                            \"record\",\n-                            \"script\",\n-                            \"writer\"\n+                            \"credentials\",\n+                            \"gcp\",\n+                            \"provider\"\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+                        \"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\": \"2.0.0-M3\"\n                     },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-scripting-nar\",\n+                        \"artifact\": \"nifi-gcp-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\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\": \"ENVIRONMENT\",\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+                            \"Bucket\": {\n+                                \"defaultValue\": \"${gcs.bucket}\",\n+                                \"description\": \"Bucket of the object.\",\n+                                \"displayName\": \"Bucket\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Bucket\",\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+                            \"Name\": {\n+                                \"defaultValue\": \"${filename}\",\n+                                \"description\": \"Name of the object.\",\n+                                \"displayName\": \"Name\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Script Body\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Name\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Script Engine\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Groovy 4.0.21 [Groovy Scripting Engine 2.0]\",\n-                                        \"displayName\": \"Groovy\",\n-                                        \"value\": \"Groovy\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"Groovy\",\n-                                \"description\": \"Language Engine for executing scripts\",\n-                                \"displayName\": \"Script Engine\",\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\": \"Script Engine\",\n+                                \"name\": \"gcp-credentials-provider-service\",\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Script File\",\n-                                \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\"\n-                                    ]\n-                                },\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\": \"2.0.0-M3\"\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+                                \"type\": \"org.apache.nifi.fileresource.service.api.FileResourceService\",\n                                 \"version\": \"2.0.0-M3\"\n                             }\n                         ],\n-                        \"restricted\": true,\n-                        \"supportsDynamicProperties\": true,\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.gcp.storage.FetchGCSObject\"\n+                        ],\n+                        \"supportsDynamicProperties\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"groovy\",\n-                            \"invoke\",\n-                            \"record\",\n-                            \"record sink\",\n-                            \"script\"\n+                            \"file\",\n+                            \"gcs\",\n+                            \"resource\"\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+                        \"type\": \"org.apache.nifi.processors.gcp.storage.GCSFileResourceService\",\n+                        \"typeDescription\": \"Provides a Google Compute Storage (GCS) file resource for other components.\",\n                         \"version\": \"2.0.0-M3\"\n                     }\n                 ],\n                 \"processors\": [\n                     {\n                         \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-scripting-nar\",\n+                        \"artifact\": \"nifi-gcp-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -14901,147 +18625,209 @@\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+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"multiProcessorUseCases\": [],\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+                            \"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\": \"2.0.0-M3\"\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\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Module Directory\",\n-                                \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"MULTIPLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\",\n-                                        \"DIRECTORY\"\n-                                    ]\n-                                },\n+                                \"name\": \"bigquery-api-endpoint\",\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+                            \"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\": \"Script Body\",\n-                                \"required\": false,\n+                                \"name\": \"bq.append.record.count\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Script Engine\": {\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\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"bq.dataset\",\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+                                \"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\": \"2.0.0-M3\"\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\": \"Environment variables 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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"bq.table.name\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"bq.transfer.type\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Clojure 1.8.0 [Clojure UNKNOWN]\",\n-                                        \"displayName\": \"Clojure\",\n-                                        \"value\": \"Clojure\"\n+                                        \"description\": \"Use streaming record handling strategy\",\n+                                        \"displayName\": \"STREAM\",\n+                                        \"value\": \"STREAM\"\n                                     },\n                                     {\n-                                        \"description\": \"Groovy 4.0.21 [Groovy Scripting Engine 2.0]\",\n-                                        \"displayName\": \"Groovy\",\n-                                        \"value\": \"Groovy\"\n+                                        \"description\": \"Use batching record handling strategy\",\n+                                        \"displayName\": \"BATCH\",\n+                                        \"value\": \"BATCH\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"Clojure\",\n-                                \"description\": \"Language Engine for executing scripts\",\n-                                \"displayName\": \"Script Engine\",\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\": \"Script Engine\",\n+                                \"name\": \"bq.transfer.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+                            \"gcp-project-id\": {\n+                                \"description\": \"Google Cloud Project ID\",\n+                                \"displayName\": \"Project ID\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Script File\",\n-                                \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\"\n-                                    ]\n-                                },\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+                            \"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\": \"2.0.0-M3\"\n+                                }\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-                                \"LOCAL\",\n-                                \"CLUSTER\"\n-                            ]\n-                        },\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"FlowFiles that were successfully processed\",\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 be processed\",\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\": true,\n+                        \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n-                        \"supportsSensitiveDynamicProperties\": true,\n+                        \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"clojure\",\n-                            \"execute\",\n-                            \"groovy\",\n-                            \"script\"\n+                            \"bigquery\",\n+                            \"bq\",\n+                            \"google\",\n+                            \"google cloud\"\n                         ],\n-                        \"triggerSerially\": false,\n+                        \"triggerSerially\": true,\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+                        \"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                         \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\"\n+                        \"version\": \"2.0.0-M3\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"Number of records successfully inserted\",\n+                                \"name\": \"bq.records.count\"\n+                            }\n+                        ]\n                     },\n                     {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-scripting-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-gcp-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -15049,316 +18835,622 @@\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+                        \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"multiProcessorUseCases\": [\n                             {\n-                                \"explanation\": \"Provides operator the ability to execute arbitrary code assuming all permissions that NiFi has.\",\n-                                \"requiredPermission\": \"execute code\"\n+                                \"configurations\": [\n+                                    {\n+                                        \"configuration\": \"The \\\"Folder ID\\\" property should be set to the ID of the Google Drive folder that files reside in.     See processor documentation / additional details for more information on how to determine a Google Drive folder's ID.\\n    If the flow being built is to be reused elsewhere, it's a good idea to parameterize     this property by setting it to something like `#{GOOGLE_DRIVE_FOLDER_ID}`.\\n\\nThe \\\"GCP Credentials Provider Service\\\" property should specify an instance of the GCPCredentialsService in order to provide credentials for accessing the folder.\\n\\nThe 'success' Relationship of this Processor is then connected to FetchGoogleDrive.\\n\",\n+                                        \"processorClassName\": \"org.apache.nifi.processors.gcp.drive.ListGoogleDrive\"\n+                                    },\n+                                    {\n+                                        \"configuration\": \"\\\"File ID\\\" = \\\"${drive.id}\\\"\\n\\nThe \\\"GCP Credentials Provider Service\\\" property should specify an instance of the GCPCredentialsService in order to provide credentials for accessing the bucket.\\n\",\n+                                        \"processorClassName\": \"org.apache.nifi.processors.gcp.drive.FetchGoogleDrive\"\n+                                    }\n+                                ],\n+                                \"description\": \"Retrieve all files in a Google Drive folder\",\n+                                \"keywords\": [\n+                                    \"google\",\n+                                    \"drive\",\n+                                    \"google cloud\",\n+                                    \"state\",\n+                                    \"retrieve\",\n+                                    \"fetch\",\n+                                    \"all\",\n+                                    \"stream\"\n+                                ],\n+                                \"notes\": \"\"\n                             }\n                         ],\n-                        \"group\": \"org.apache.nifi\",\n-                        \"multiProcessorUseCases\": [],\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+                            \"Google Doc Export 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+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Web Page (HTML)\",\n+                                        \"value\": \"application/zip\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"EPUB\",\n+                                        \"value\": \"application/epub+zip\"\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                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Module Directory\",\n-                                \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"MULTIPLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\",\n-                                        \"DIRECTORY\"\n-                                    ]\n-                                },\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Google Doc Export Type\",\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+                            \"Google Drawing Export Type\": {\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+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SVG\",\n+                                        \"value\": \"image/svg+xml\"\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                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Script Body\",\n-                                \"required\": false,\n+                                \"name\": \"Google Drawing Export Type\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Script Engine\": {\n+                            \"Google Presentation Export Type\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Groovy 4.0.21 [Groovy Scripting Engine 2.0]\",\n-                                        \"displayName\": \"Groovy\",\n-                                        \"value\": \"Groovy\"\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+                                    },\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\": \"Groovy\",\n-                                \"description\": \"Language Engine for executing scripts\",\n-                                \"displayName\": \"Script Engine\",\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\": \"Script Engine\",\n+                                \"name\": \"Google Presentation Export 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+                            \"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\": \"Microsoft Excel\",\n+                                        \"value\": \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\"\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+                                    {\n+                                        \"description\": \"\",\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\": \"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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Script File\",\n-                                \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\"\n-                                    ]\n-                                },\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Google Spreadsheet Export Type\",\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables 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\": \"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\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\n+                                }\n                             }\n                         },\n-                        \"restricted\": true,\n+                        \"readsAttributes\": [\n+                            {\n+                                \"description\": \"The id of the file\",\n+                                \"name\": \"drive.id\"\n+                            }\n+                        ],\n                         \"seeAlso\": [\n-                            \"org.apache.nifi.processors.script.ExecuteScript\"\n+                            \"org.apache.nifi.processors.gcp.drive.ListGoogleDrive\",\n+                            \"org.apache.nifi.processors.gcp.drive.PutGoogleDrive\"\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-                                \"LOCAL\",\n-                                \"CLUSTER\"\n-                            ]\n-                        },\n-                        \"supportedRelationships\": [],\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\": true,\n+                        \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n-                        \"supportsSensitiveDynamicProperties\": true,\n+                        \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"groovy\",\n-                            \"invoke\",\n-                            \"script\"\n+                            \"drive\",\n+                            \"fetch\",\n+                            \"google\",\n+                            \"storage\"\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+                        \"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                         \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\"\n+                        \"version\": \"2.0.0-M3\",\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-scripting-nar\",\n+                        \"artifact\": \"nifi-gcp-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\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-                        \"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+                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n                         \"multiProcessorUseCases\": [],\n-                        \"primaryNodeOnly\": false,\n+                        \"primaryNodeOnly\": true,\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+                            \"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+                                \"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\": \"2.0.0-M3\"\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\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Module Directory\",\n+                                \"name\": \"et-time-window\",\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+                            \"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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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                                 \"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\": \"2.0.0-M3\"\n                                 }\n                             },\n-                            \"Record Writer\": {\n-                                \"description\": \"The Record Writer to use for serializing Records after they have been transformed\",\n-                                \"displayName\": \"Record Writer\",\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                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Record Writer\",\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+                                \"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.RecordSetWriterFactory\",\n+                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n                                     \"version\": \"2.0.0-M3\"\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+                            \"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\": \"Script Body\",\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\": \"2.0.0-M3\"\n+                                }\n                             },\n-                            \"Script Engine\": {\n+                            \"recursive-search\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"Clojure\",\n-                                        \"value\": \"Clojure\"\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"Groovy\",\n-                                        \"value\": \"Groovy\"\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"Groovy\",\n-                                \"description\": \"The Language to use for the script\",\n-                                \"displayName\": \"Script Language\",\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                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Script Engine\",\n+                                \"name\": \"recursive-search\",\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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.ScriptedPartitionRecord\",\n-                            \"org.apache.nifi.processors.script.ScriptedTransformRecord\",\n-                            \"org.apache.nifi.processors.script.ScriptedValidateRecord\"\n+                            \"org.apache.nifi.processors.gcp.drive.FetchGoogleDrive\",\n+                            \"org.apache.nifi.processors.gcp.drive.PutGoogleDrive\"\n                         ],\n-                        \"sideEffectFree\": true,\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\": \"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+                                \"description\": \"All FlowFiles that are received are routed to success\",\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-                            {\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                         ],\n-                        \"supportsBatching\": true,\n+                        \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"filter\",\n-                            \"groovy\",\n-                            \"record\",\n-                            \"script\"\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.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+                        \"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                         \"useCases\": [],\n                         \"version\": \"2.0.0-M3\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"Sets the mime.type attribute to the MIME Type specified by the Record Writer\",\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 number of records within the flow file.\",\n-                                \"name\": \"record.count\"\n+                                \"description\": \"The size of the file\",\n+                                \"name\": \"drive.size\"\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 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-scripting-nar\",\n+                        \"artifact\": \"nifi-gcp-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -15366,199 +19458,199 @@\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 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                         \"multiProcessorUseCases\": [],\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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-                                \"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\": \"2.0.0-M3\"\n-                                }\n-                            },\n-                            \"Record Writer\": {\n-                                \"description\": \"The Record Writer to use for serializing Records after they have been transformed\",\n-                                \"displayName\": \"Record Writer\",\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\": \"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\": \"2.0.0-M3\"\n-                                }\n+                                \"name\": \"chunked-upload-size\",\n+                                \"required\": false,\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+                            \"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\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Script Body\",\n+                                \"name\": \"chunked-upload-threshold\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Script Engine\": {\n+                            \"conflict-resolution-strategy\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Clojure\",\n-                                        \"value\": \"Clojure\"\n+                                        \"description\": \"Handle file conflict as failure.\",\n+                                        \"displayName\": \"fail\",\n+                                        \"value\": \"fail\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Groovy\",\n-                                        \"value\": \"Groovy\"\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\": \"Groovy\",\n-                                \"description\": \"The Language to use for the script\",\n-                                \"displayName\": \"Script Language\",\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\": \"Script Engine\",\n+                                \"name\": \"conflict-resolution-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+                            \"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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Script File\",\n-                                \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\"\n-                                    ]\n-                                },\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"file-name\",\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\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+                                \"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\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\n+                                }\n                             }\n                         },\n-                        \"restricted\": true,\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.script.ScriptedFilterRecord\",\n-                            \"org.apache.nifi.processors.script.ScriptedTransformRecord\",\n-                            \"org.apache.nifi.processors.script.ScriptedValidateRecord\"\n+                            \"org.apache.nifi.processors.gcp.drive.FetchGoogleDrive\",\n+                            \"org.apache.nifi.processors.gcp.drive.ListGoogleDrive\"\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\": \"Files that have been successfully written to Google Drive are transferred to this relationship.\",\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+                                \"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\": \"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                         ],\n                         \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"groovy\",\n-                            \"group\",\n-                            \"organize\",\n-                            \"partition\",\n-                            \"record\",\n-                            \"script\",\n-                            \"segment\",\n-                            \"split\"\n+                            \"drive\",\n+                            \"google\",\n+                            \"put\",\n+                            \"storage\"\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.gcp.drive.PutGoogleDrive\",\n+                        \"typeDescription\": \"Writes the contents of a FlowFile as a file in Google Drive.\",\n                         \"useCases\": [],\n                         \"version\": \"2.0.0-M3\",\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 id of the file\",\n+                                \"name\": \"drive.id\"\n                             },\n                             {\n-                                \"description\": \"Sets the mime.type attribute to the MIME Type specified by the Record Writer\",\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 number of records within the flow file.\",\n-                                \"name\": \"record.count\"\n+                                \"description\": \"The size of the file\",\n+                                \"name\": \"drive.size\"\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 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\": \"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 error code returned by Google Drive\",\n+                                \"name\": \"error.code\"\n                             },\n                             {\n-                                \"description\": \"The number of partitioned FlowFiles generated from the parent FlowFile\",\n-                                \"name\": \"fragment.count\"\n+                                \"description\": \"The error message returned by Google Drive\",\n+                                \"name\": \"error.message\"\n                             }\n                         ]\n                     },\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-scripting-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-gcp-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -15566,185 +19658,153 @@\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 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                         \"multiProcessorUseCases\": [],\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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+                            \"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\": \"2.0.0-M3\"\n                                 }\n                             },\n-                            \"Record Writer\": {\n-                                \"description\": \"The Record Writer to use for serializing Records after they have been transformed\",\n-                                \"displayName\": \"Record Writer\",\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\": \"Record Writer\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"api-endpoint\",\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\": \"2.0.0-M3\"\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+                            \"gcp-project-id\": {\n+                                \"description\": \"Google Cloud Project ID\",\n+                                \"displayName\": \"Project ID\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Script Body\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"gcp-project-id\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Script Engine\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Clojure\",\n-                                        \"value\": \"Clojure\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Groovy\",\n-                                        \"value\": \"Groovy\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"Groovy\",\n-                                \"description\": \"The Language to use for the script\",\n-                                \"displayName\": \"Script Language\",\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\": \"Script Engine\",\n+                                \"name\": \"gcp-pubsub-publish-batch-size\",\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+                            \"gcp-pubsub-subscription\": {\n+                                \"description\": \"Name of the Google Cloud Pub/Sub Subscription\",\n+                                \"displayName\": \"Subscription\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Script File\",\n-                                \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\"\n-                                    ]\n-                                },\n+                                \"name\": \"gcp-pubsub-subscription\",\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\": \"2.0.0-M3\"\n+                                }\n                             }\n                         },\n-                        \"restricted\": true,\n                         \"seeAlso\": [\n-                            \"org.apache.nifi.processors.jolt.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+                            \"org.apache.nifi.processors.gcp.pubsub.PublishGCPubSub\"\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 are routed to this relationship after a successful Google Cloud Pub/Sub operation.\",\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                         ],\n-                        \"supportsBatching\": true,\n+                        \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"filter\",\n-                            \"groovy\",\n-                            \"modify\",\n-                            \"record\",\n-                            \"script\",\n-                            \"transform\",\n-                            \"update\"\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.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.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                         \"useCases\": [],\n                         \"version\": \"2.0.0-M3\",\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\": \"Acknowledgement Id of the consumed Google Cloud PubSub message\",\n+                                \"name\": \"gcp.pubsub.ackId\"\n                             },\n                             {\n-                                \"description\": \"The number of records in the FlowFile\",\n-                                \"name\": \"record.count\"\n+                                \"description\": \"Serialized size of the consumed Google Cloud PubSub message\",\n+                                \"name\": \"gcp.pubsub.messageSize\"\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\": \"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\": true,\n-                        \"artifact\": \"nifi-scripting-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-gcp-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -15752,306 +19812,578 @@\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+                        \"dynamicProperties\": [\n                             {\n-                                \"explanation\": \"Provides operator the ability to execute arbitrary code assuming all permissions that NiFi has.\",\n-                                \"requiredPermission\": \"execute code\"\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                         \"multiProcessorUseCases\": [],\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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+                            \"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\": \"2.0.0-M3\"\n                                 }\n                             },\n-                            \"Record Writer\": {\n-                                \"description\": \"The Record Writer to use for serializing Records after they have been transformed\",\n-                                \"displayName\": \"Record Writer\",\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\": \"Record Writer\",\n+                                \"name\": \"Input 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.RecordSetWriterFactory\",\n-                                    \"version\": \"2.0.0-M3\"\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+                            \"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                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Script Body\",\n-                                \"required\": false,\n+                                \"name\": \"Maximum Message Size\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Script Engine\": {\n+                            \"Message Derivation Strategy\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Clojure\",\n-                                        \"value\": \"Clojure\"\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\": \"Groovy\",\n-                                        \"value\": \"Groovy\"\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\": \"Groovy\",\n-                                \"description\": \"The Language to use for the script\",\n-                                \"displayName\": \"Script Language\",\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\": \"Script Engine\",\n+                                \"name\": \"Message Derivation 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+                            \"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\": \"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\": \"2.0.0-M3\"\n+                                }\n+                            },\n+                            \"Record Writer\": {\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 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\": \"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\": \"2.0.0-M3\"\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\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Script File\",\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"gcp-project-id\",\n                                 \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\"\n-                                    ]\n-                                },\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"gcp-pubsub-publish-batch-delay\",\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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. 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\": \"2.0.0-M3\"\n+                                }\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+                            \"org.apache.nifi.processors.gcp.pubsub.ConsumeGCPubSub\"\n                         ],\n-                        \"sideEffectFree\": true,\n+                        \"sideEffectFree\": false,\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+                                \"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\": \"In case of any issue during processing the incoming flow file, the incoming FlowFile will be 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-                                \"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+                                \"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\": true,\n-                        \"supportsDynamicProperties\": false,\n+                        \"supportsBatching\": false,\n+                        \"supportsDynamicProperties\": true,\n                         \"supportsDynamicRelationships\": 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-                            \"groovy\",\n-                            \"record\",\n-                            \"script\",\n-                            \"validate\"\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.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+                        \"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                         \"useCases\": [],\n                         \"version\": \"2.0.0-M3\",\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\": \"ID of the pubsub message published to the configured Google Cloud PubSub topic\",\n+                                \"name\": \"gcp.pubsub.messageId\"\n                             },\n                             {\n-                                \"description\": \"The number of records within the flow file.\",\n-                                \"name\": \"record.count\"\n+                                \"description\": \"Count of pubsub messages published to the configured Google Cloud PubSub topic\",\n+                                \"name\": \"gcp.pubsub.count.records\"\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\": \"Name of the Google Cloud PubSub topic the message was published to\",\n+                                \"name\": \"gcp.pubsub.topic\"\n                             }\n                         ]\n-                    }\n-                ],\n-                \"reportingTasks\": [\n+                    },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-scripting-nar\",\n+                        \"artifact\": \"nifi-gcp-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\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-                        \"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+                        \"defaultYieldDuration\": \"1 sec\",\n+                        \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n+                        \"multiProcessorUseCases\": [],\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\": \"2.0.0-M3\"\n+                                }\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+                                \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"name\": \"A script engine property to update\",\n-                                \"value\": \"The value to set it to\"\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"gcp-bytes-outstanding\",\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"gcp-messages-outstanding\",\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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-                        \"explicitRestrictions\": [\n+                        \"sideEffectFree\": false,\n+                        \"supportedRelationships\": [\n                             {\n-                                \"explanation\": \"Provides operator the ability to execute arbitrary code assuming all permissions that NiFi has.\",\n-                                \"requiredPermission\": \"execute code\"\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+                        \"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+                        \"useCases\": [],\n+                        \"version\": \"2.0.0-M3\",\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\": \"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+                            {\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\": \"f2215c6\"\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+                        \"multiProcessorUseCases\": [],\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+                            \"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\": \"2.0.0-M3\"\n+                                }\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\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Module Directory\",\n+                                \"name\": \"gcp-batch-bytes\",\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"gcp-ordering-key\",\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+                            \"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\": \"Script Body\",\n-                                \"required\": false,\n+                                \"name\": \"gcp-pubsub-publish-batch-delay\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Script Engine\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Groovy 4.0.21 [Groovy Scripting Engine 2.0]\",\n-                                        \"displayName\": \"Groovy\",\n-                                        \"value\": \"Groovy\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"Groovy\",\n-                                \"description\": \"Language Engine for executing scripts\",\n-                                \"displayName\": \"Script Engine\",\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\": \"Script Engine\",\n+                                \"name\": \"gcp-pubsub-publish-batch-size\",\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+                            \"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\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Script File\",\n-                                \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\"\n-                                    ]\n-                                },\n+                                \"name\": \"gcp-pubsub-topic\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"restricted\": true,\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.gcp.pubsub.lite.ConsumeGCPubSubLite\"\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+                                \"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-                        \"supportsSensitiveDynamicProperties\": true,\n+                        \"supportsDynamicRelationships\": 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-                            \"execute\",\n-                            \"groovy\",\n-                            \"reporting\",\n-                            \"script\"\n+                            \"gcp\",\n+                            \"google\",\n+                            \"google-cloud\",\n+                            \"lite\",\n+                            \"message\",\n+                            \"publish\",\n+                            \"pubsub\"\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\": \"2.0.0-M3\"\n-                    }\n-                ]\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"2.0.0-M3\"\n-        },\n-        {\n-            \"artifact\": \"nifi-jolt-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [],\n-                \"processors\": [\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+                        \"useCases\": [],\n+                        \"version\": \"2.0.0-M3\",\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-jolt-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-gcp-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -16064,232 +20396,152 @@\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"multiProcessorUseCases\": [],\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Custom Module Directory\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"jolt-transform-custom\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Jolt Transform\",\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+                            \"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\": \"2.0.0-M3\"\n+                                }\n+                            },\n+                            \"gcp-project-id\": {\n+                                \"description\": \"Google Cloud Project ID\",\n+                                \"displayName\": \"Project ID\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Custom Module Directory\",\n+                                \"name\": \"gcp-project-id\",\n                                 \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"MULTIPLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\",\n-                                        \"DIRECTORY\"\n-                                    ]\n-                                },\n                                 \"sensitive\": false\n                             },\n-                            \"Custom Transformation Class Name\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"jolt-transform-custom\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Jolt Transform\",\n-                                        \"propertyName\": \"Jolt Transform\"\n-                                    }\n-                                ],\n-                                \"description\": \"Fully Qualified Class Name for Custom Transformation\",\n-                                \"displayName\": \"Custom Transformation Class Name\",\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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Custom Transformation Class Name\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"gcp-retry-count\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Jolt Specification\": {\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+                            \"gcs-bucket\": {\n+                                \"defaultValue\": \"${gcs.bucket}\",\n+                                \"description\": \"Bucket of the object.\",\n+                                \"displayName\": \"Bucket\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Jolt Specification\",\n-                                \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\",\n-                                        \"TEXT\"\n-                                    ]\n-                                },\n+                                \"name\": \"gcs-bucket\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Jolt Transform\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Shift input JSON/data to create the output JSON.\",\n-                                        \"displayName\": \"Shift\",\n-                                        \"value\": \"jolt-transform-shift\"\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\": \"Remove values from input data to create the output JSON.\",\n-                                        \"displayName\": \"Remove\",\n-                                        \"value\": \"jolt-transform-remove\"\n-                                    },\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\": \"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-                                        \"description\": \"Writes when key is missing or value is null\",\n-                                        \"displayName\": \"Modify - Default\",\n-                                        \"value\": \"jolt-transform-modify-default\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Always overwrite value\",\n-                                        \"displayName\": \"Modify - Overwrite\",\n-                                        \"value\": \"jolt-transform-modify-overwrite\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Writes when key is missing\",\n-                                        \"displayName\": \"Modify - Define\",\n-                                        \"value\": \"jolt-transform-modify-define\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"jolt-transform-chain\",\n-                                \"description\": \"Specifies the Jolt Transformation that should be used with the provided specification.\",\n-                                \"displayName\": \"Jolt Transform\",\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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Jolt Transform\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"gcs-generation\",\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+                            \"gcs-key\": {\n+                                \"defaultValue\": \"${filename}\",\n+                                \"description\": \"Name of the object.\",\n+                                \"displayName\": \"Key\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Max String Length\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"gcs-key\",\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+                            \"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\": \"Pretty Print\",\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\": \"2.0.0-M3\"\n+                                }\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+                            \"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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Transform Cache Size\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"storage-api-url\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"sideEffectFree\": true,\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 FlowFile with transformed content will be routed 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\": \"If a FlowFile fails processing for any reason (for example, the FlowFile is not valid JSON), it will be routed 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\": true,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"cardinality\",\n-                            \"chainr\",\n-                            \"defaultr\",\n-                            \"jolt\",\n-                            \"json\",\n-                            \"removr\",\n-                            \"shiftr\",\n-                            \"sort\",\n-                            \"transform\"\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.jolt.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+                        \"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                         \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"Always set to application/json\",\n-                                \"name\": \"mime.type\"\n-                            }\n-                        ]\n+                        \"version\": \"2.0.0-M3\"\n                     },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-jolt-nar\",\n+                        \"artifact\": \"nifi-gcp-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -16299,1488 +20551,2878 @@\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-                        \"multiProcessorUseCases\": [],\n-                        \"primaryNodeOnly\": false,\n-                        \"propertyDescriptors\": {\n-                            \"Custom Module Directory\": {\n-                                \"dependencies\": [\n+                        \"multiProcessorUseCases\": [\n+                            {\n+                                \"configurations\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"jolt-transform-custom\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Jolt Transform\",\n-                                        \"propertyName\": \"Jolt Transform\"\n+                                        \"configuration\": \"The \\\"Bucket\\\" property should be set to the name of the GCS bucket that files reside in. If the flow being built is to be reused elsewhere, it's a good idea to parameterize     this property by setting it to something like `#{GCS_SOURCE_BUCKET}`.\\nConfigure the \\\"Project ID\\\" property to reflect the ID of your Google Compute Cloud Project.\\n\\nThe \\\"GCP Credentials Provider Service\\\" property should specify an instance of the GCPCredentialsService in order to provide credentials for accessing the bucket.\\n\\nThe 'success' Relationship of this Processor is then connected to FetchGCSObject.\\n\",\n+                                        \"processorClassName\": \"org.apache.nifi.processors.gcp.storage.ListGCSBucket\"\n+                                    },\n+                                    {\n+                                        \"configuration\": \"\\\"Bucket\\\" = \\\"${gcs.bucket}\\\"\\n\\\"Name\\\" = \\\"${filename}\\\"\\n\\nThe \\\"GCP Credentials Provider Service\\\" property should specify an instance of the GCPCredentialsService in order to provide credentials for accessing the bucket.\\n\",\n+                                        \"processorClassName\": \"org.apache.nifi.processors.gcp.storage.FetchGCSObject\"\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+                                \"description\": \"Retrieve all files in a Google Compute Storage (GCS) bucket\",\n+                                \"keywords\": [\n+                                    \"gcp\",\n+                                    \"gcs\",\n+                                    \"google cloud\",\n+                                    \"google compute storage\",\n+                                    \"state\",\n+                                    \"retrieve\",\n+                                    \"fetch\",\n+                                    \"all\",\n+                                    \"stream\"\n+                                ],\n+                                \"notes\": \"\"\n+                            }\n+                        ],\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\": \"2.0.0-M3\"\n+                                }\n+                            },\n+                            \"gcp-project-id\": {\n+                                \"description\": \"Google Cloud Project ID\",\n+                                \"displayName\": \"Project ID\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Custom Module Directory\",\n+                                \"name\": \"gcp-project-id\",\n                                 \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"MULTIPLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\",\n-                                        \"DIRECTORY\"\n-                                    ]\n-                                },\n                                 \"sensitive\": false\n                             },\n-                            \"Custom Transformation Class Name\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"jolt-transform-custom\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Jolt Transform\",\n-                                        \"propertyName\": \"Jolt Transform\"\n-                                    }\n-                                ],\n-                                \"description\": \"Fully Qualified Class Name for Custom Transformation\",\n-                                \"displayName\": \"Custom Transformation Class Name\",\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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Custom Transformation Class Name\",\n-                                \"required\": false,\n+                                \"name\": \"gcs-bucket\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Jolt Specification\": {\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+                            \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Jolt Specification\",\n+                                \"name\": \"gcs-generation\",\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\": \"Shift input JSON/data to create the output JSON.\",\n-                                        \"displayName\": \"Shift\",\n-                                        \"value\": \"jolt-transform-shift\"\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\": \"Remove values from input data to create the output JSON.\",\n-                                        \"displayName\": \"Remove\",\n-                                        \"value\": \"jolt-transform-remove\"\n-                                    },\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\": \"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-                                        \"description\": \"Writes when key is missing or value is null\",\n-                                        \"displayName\": \"Modify - Default\",\n-                                        \"value\": \"jolt-transform-modify-default\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Always overwrite value\",\n-                                        \"displayName\": \"Modify - Overwrite\",\n-                                        \"value\": \"jolt-transform-modify-overwrite\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Writes when key is missing\",\n-                                        \"displayName\": \"Modify - Define\",\n-                                        \"value\": \"jolt-transform-modify-define\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"jolt-transform-chain\",\n-                                \"description\": \"Specifies the Jolt Transformation that should be used with the provided specification.\",\n-                                \"displayName\": \"Jolt Transform\",\n+                            \"gcs-key\": {\n+                                \"defaultValue\": \"${filename}\",\n+                                \"description\": \"Name of the object.\",\n+                                \"displayName\": \"Key\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Jolt Transform\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"gcs-key\",\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+                            \"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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Transform Cache Size\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"gcs-object-range-length\",\n+                                \"required\": false,\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+                            \"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\": \"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\": \"2.0.0-M3\"\n-                                }\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"gcs-object-range-start\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n                             },\n-                            \"jolt-record-record-writer\": {\n-                                \"description\": \"Specifies the Controller Service to use for writing out the records\",\n-                                \"displayName\": \"Record Writer\",\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\": \"Environment variables 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. Supported proxies: HTTP + AuthN\",\n+                                \"displayName\": \"Proxy Configuration Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"jolt-record-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\": \"2.0.0-M3\"\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"storage-api-url\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n                             }\n                         },\n-                        \"sideEffectFree\": true,\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\": \"The original FlowFile that was transformed. If the FlowFile fails processing, nothing will be sent to this relationship\",\n-                                \"name\": \"original\"\n+                                \"description\": \"FlowFiles are routed to this relationship after a successful Google Cloud Storage operation.\",\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+                                \"description\": \"FlowFiles are routed to this relationship if the Google Cloud Storage operation fails.\",\n                                 \"name\": \"failure\"\n-                            },\n-                            {\n-                                \"description\": \"The FlowFile with transformed content will be routed to this relationship\",\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                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"cardinality\",\n-                            \"chainr\",\n-                            \"defaultr\",\n-                            \"jolt\",\n-                            \"record\",\n-                            \"removr\",\n-                            \"shiftr\",\n-                            \"sort\",\n-                            \"transform\"\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.jolt.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+                        \"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                         \"useCases\": [],\n                         \"version\": \"2.0.0-M3\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"The number of records in an outgoing FlowFile\",\n-                                \"name\": \"record.count\"\n+                                \"description\": \"The name of the file, parsed if possible from the Content-Disposition response header\",\n+                                \"name\": \"filename\"\n                             },\n                             {\n-                                \"description\": \"The MIME Type that the configured Record Writer indicates is appropriate\",\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-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\n-        },\n-        {\n-            \"artifact\": \"nifi-record-serialization-services-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [\n+                    },\n                     {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-record-serialization-services-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-gcp-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\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+                        \"multiProcessorUseCases\": [],\n+                        \"primaryNodeOnly\": true,\n                         \"propertyDescriptors\": {\n-                            \"cache-size\": {\n-                                \"defaultValue\": \"1000\",\n-                                \"description\": \"Specifies how many Schemas should be cached\",\n-                                \"displayName\": \"Cache 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\": \"cache-size\",\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\": \"2.0.0-M3\"\n+                                }\n                             },\n-                            \"schema-access-strategy\": {\n+                            \"et-initial-listing-target\": {\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\": \"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\": \"The schema reference information will be provided through a configured Schema Reference Reader service implementation.\",\n-                                        \"displayName\": \"Schema Reference Reader\",\n-                                        \"value\": \"schema-reference-reader\"\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-                                        \"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+                                        \"dependentValues\": [\n+                                            \"entities\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Listing Strategy\",\n+                                        \"propertyName\": \"listing-strategy\"\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+                                \"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\": \"schema-access-strategy\",\n-                                \"required\": true,\n+                                \"name\": \"et-initial-listing-target\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"schema-branch\": {\n+                            \"et-state-cache\": {\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"schema-name\"\n+                                            \"entities\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n+                                        \"propertyDisplayName\": \"Listing Strategy\",\n+                                        \"propertyName\": \"listing-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+                                \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"schema-branch\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"et-state-cache\",\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\": \"2.0.0-M3\"\n+                                }\n                             },\n-                            \"schema-name\": {\n-                                \"defaultValue\": \"${schema.name}\",\n+                            \"et-time-window\": {\n+                                \"defaultValue\": \"3 hours\",\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"schema-name\"\n+                                            \"window\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n+                                        \"propertyDisplayName\": \"Entity Tracking Initial Listing Target\",\n+                                        \"propertyName\": \"et-initial-listing-target\"\n                                     }\n                                 ],\n-                                \"description\": \"Specifies the name of the schema to lookup in the Schema Registry property\",\n-                                \"displayName\": \"Schema Name\",\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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"schema-name\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"et-time-window\",\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"gcp-project-id\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"schema-reference-reader\": {\n-                                \"dependencies\": [\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"gcs-prefix\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"gcs-use-generations\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"schema-reference-reader\"\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\": \"Service implementation responsible for reading FlowFile attributes or content to determine the Schema Reference Identifier\",\n-                                \"displayName\": \"Schema Reference Reader\",\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\": \"schema-reference-reader\",\n+                                \"name\": \"gcs-use-generations\",\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.SchemaReferenceReader\",\n-                                    \"version\": \"2.0.0-M3\"\n-                                }\n+                                \"sensitive\": false\n                             },\n-                            \"schema-registry\": {\n-                                \"dependencies\": [\n+                            \"listing-strategy\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"schema-reference-reader\",\n-                                            \"schema-name\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\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-                                \"description\": \"Specifies the Controller Service to use for the Schema Registry\",\n-                                \"displayName\": \"Schema Registry\",\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\": \"schema-registry\",\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. 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.schemaregistry.services.SchemaRegistry\",\n+                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n                                     \"version\": \"2.0.0-M3\"\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+                            \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"schema-text\",\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\": \"2.0.0-M3\"\n+                                }\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+                            \"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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"schema-version\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"storage-api-url\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"providedApiImplementations\": [\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-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n-                                \"version\": \"2.0.0-M3\"\n+                                \"description\": \"FlowFiles are routed to this relationship after a successful Google Cloud Storage 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                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"avro\",\n-                            \"comma\",\n-                            \"delimited\",\n-                            \"parse\",\n-                            \"reader\",\n-                            \"record\",\n-                            \"row\",\n-                            \"separated\",\n-                            \"values\"\n+                            \"gcs\",\n+                            \"google\",\n+                            \"google cloud\",\n+                            \"list\",\n+                            \"storage\"\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\": \"2.0.0-M3\"\n+                        \"triggerSerially\": true,\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+                        \"useCases\": [],\n+                        \"version\": \"2.0.0-M3\",\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+                            },\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\": false,\n-                        \"artifact\": \"nifi-record-serialization-services-nar\",\n+                        \"artifact\": \"nifi-gcp-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\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 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+                        \"multiProcessorUseCases\": [],\n+                        \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Schema Reference Writer\": {\n+                            \"File Resource Service\": {\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"schema-reference-writer\"\n+                                            \"FILE_RESOURCE_SERVICE\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Schema Write Strategy\",\n-                                        \"propertyName\": \"Schema Write Strategy\"\n+                                        \"propertyDisplayName\": \"Resource Transfer Source\",\n+                                        \"propertyName\": \"Resource Transfer Source\"\n                                     }\n                                 ],\n-                                \"description\": \"Service implementation responsible for writing FlowFile attributes or content header with Schema reference information\",\n-                                \"displayName\": \"Schema Reference Writer\",\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\": \"Schema Reference Writer\",\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.schemaregistry.services.SchemaReferenceWriter\",\n+                                    \"type\": \"org.apache.nifi.fileresource.service.api.FileResourceService\",\n                                     \"version\": \"2.0.0-M3\"\n                                 }\n                             },\n-                            \"Schema Write Strategy\": {\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\": \"2.0.0-M3\"\n+                                }\n+                            },\n+                            \"Resource Transfer Source\": {\n                                 \"allowableValues\": [\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-                                    },\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+                                        \"description\": \"The content of the incoming FlowFile provides the source for transfer\",\n+                                        \"displayName\": \"FlowFile Content\",\n+                                        \"value\": \"FLOWFILE_CONTENT\"\n                                     },\n                                     {\n-                                        \"description\": \"The schema reference information will be written through a configured Schema Reference Writer service implementation.\",\n-                                        \"displayName\": \"Schema Reference Writer\",\n-                                        \"value\": \"schema-reference-writer\"\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\": \"avro-embedded\",\n-                                \"description\": \"Specifies how the schema for a Record should be added to the data.\",\n-                                \"displayName\": \"Schema Write Strategy\",\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\": \"Schema Write Strategy\",\n+                                \"name\": \"Resource Transfer Source\",\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+                            \"gcp-project-id\": {\n+                                \"description\": \"Google Cloud Project ID\",\n+                                \"displayName\": \"Project ID\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"gcp-project-id\",\n+                                \"required\": false,\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\": \"cache-size\",\n+                                \"name\": \"gcp-retry-count\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"compression-format\": {\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\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"gcs-bucket\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"gcs-content-disposition-type\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"BZIP2\",\n-                                        \"value\": \"BZIP2\"\n+                                        \"description\": \"Indicates that the object should be loaded and rendered within the browser.\",\n+                                        \"displayName\": \"Inline\",\n+                                        \"value\": \"inline\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"DEFLATE\",\n-                                        \"value\": \"DEFLATE\"\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\": \"Environment variables 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\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"gcs-key\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"gcs-object-acl\": {\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\": \"\",\n-                                        \"displayName\": \"NONE\",\n-                                        \"value\": \"NONE\"\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\": \"\",\n-                                        \"displayName\": \"SNAPPY\",\n-                                        \"value\": \"SNAPPY\"\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\": \"\",\n-                                        \"displayName\": \"LZO\",\n-                                        \"value\": \"LZO\"\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\": \"Compression type to use when writing Avro files. Default is None.\",\n-                                \"displayName\": \"Compression Format\",\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\": \"compression-format\",\n-                                \"required\": true,\n+                                \"name\": \"gcs-object-acl\",\n+                                \"required\": false,\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+                            \"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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"encoder-pool-size\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"gcs-object-crc32c\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"schema-access-strategy\": {\n+                            \"gcs-overwrite-object\": {\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+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\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\": \"false\",\n+                                        \"value\": \"false\"\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\": \"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\": \"schema-access-strategy\",\n+                                \"name\": \"gcs-overwrite-object\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"schema-branch\": {\n-                                \"dependencies\": [\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\": \"Environment variables 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-                                        \"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 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\": \"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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"schema-branch\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"gzip.content.enabled\",\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+                            \"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\": \"schema-cache\",\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.RecordSchemaCacheService\",\n+                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n                                     \"version\": \"2.0.0-M3\"\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+                            \"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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"FlowFiles are routed to this relationship after a successful Google Cloud Storage operation.\",\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+                        \"supportsDynamicProperties\": true,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\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.gcp.storage.PutGCSObject\",\n+                        \"typeDescription\": \"Writes the contents of a FlowFile as an object in a Google Cloud Storage.\",\n+                        \"useCases\": [],\n+                        \"version\": \"2.0.0-M3\",\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-gcp-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"f2215c6\"\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+                        \"multiProcessorUseCases\": [],\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\": \"2.0.0-M3\"\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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"schema-name\",\n-                                \"required\": false,\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-                            \"schema-reference-reader\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"schema-reference-reader\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"Service implementation responsible for reading FlowFile attributes or content to determine the Schema Reference Identifier\",\n-                                \"displayName\": \"Schema Reference 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+                        \"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+                        \"useCases\": [],\n+                        \"version\": \"2.0.0-M3\"\n+                    },\n+                    {\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-gcp-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"f2215c6\"\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+                        \"multiProcessorUseCases\": [],\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\": \"schema-reference-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.schemaregistry.services.SchemaReferenceReader\",\n+                                    \"type\": \"org.apache.nifi.gcp.credentials.service.GCPCredentialsService\",\n                                     \"version\": \"2.0.0-M3\"\n                                 }\n                             },\n-                            \"schema-registry\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"schema-reference-reader\",\n-                                            \"schema-name\"\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+                            \"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\": \"Environment variables 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+                        \"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+                            },\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+                        \"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.GetGcpVisionAnnotateImagesOperationStatus\",\n+                        \"typeDescription\": \"Retrieves the current status of an Google Vision operation.\",\n+                        \"useCases\": [],\n+                        \"version\": \"2.0.0-M3\"\n+                    },\n+                    {\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-gcp-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"f2215c6\"\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+                        \"multiProcessorUseCases\": [],\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\": \"schema-registry\",\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\": \"2.0.0-M3\"\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables 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\": \"Environment variables 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\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"vision-feature-type\",\n                                 \"required\": false,\n+                                \"sensitive\": false\n+                            }\n+                        },\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.gcp.vision.GetGcpVisionAnnotateFilesOperationStatus\"\n+                        ],\n+                        \"sideEffectFree\": false,\n+                        \"supportedRelationships\": [\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+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": false,\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": 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.StartGcpVisionAnnotateFilesOperation\",\n+                        \"typeDescription\": \"Trigger a Vision operation on file input. It should be followed by GetGcpVisionAnnotateFilesOperationStatus processor in order to monitor operation status.\",\n+                        \"useCases\": [],\n+                        \"version\": \"2.0.0-M3\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"A unique identifier of the operation returned by the Vision server.\",\n+                                \"name\": \"operationKey\"\n+                            }\n+                        ]\n+                    },\n+                    {\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-gcp-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"f2215c6\"\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+                        \"multiProcessorUseCases\": [],\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-standard-services-api-nar\",\n+                                    \"artifact\": \"nifi-gcp-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.schemaregistry.services.SchemaRegistry\",\n+                                    \"type\": \"org.apache.nifi.gcp.credentials.service.GCPCredentialsService\",\n                                     \"version\": \"2.0.0-M3\"\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+                            \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"schema-text\",\n+                                \"name\": \"json-payload\",\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+                            \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"schema-version\",\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\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"vision-feature-type\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             }\n                         },\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.gcp.vision.GetGcpVisionAnnotateImagesOperationStatus\"\n+                        ],\n+                        \"sideEffectFree\": false,\n+                        \"supportedRelationships\": [\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+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": false,\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": 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.StartGcpVisionAnnotateImagesOperation\",\n+                        \"typeDescription\": \"Trigger a Vision operation on image input. It should be followed by GetGcpVisionAnnotateImagesOperationStatus processor in order to monitor operation status.\",\n+                        \"useCases\": [],\n+                        \"version\": \"2.0.0-M3\",\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\": \"2.0.0-M3\"\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\": \"f2215c6\"\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Kerberos Keytab\",\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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.serialization.RecordSetWriterFactory\",\n+                                \"type\": \"org.apache.nifi.kerberos.KerberosCredentialsService\",\n                                 \"version\": \"2.0.0-M3\"\n                             }\n                         ],\n+                        \"restricted\": true,\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+                            \"Authentication\",\n+                            \"Credentials\",\n+                            \"Kerberos\",\n+                            \"Keytab\",\n+                            \"Principal\",\n+                            \"Security\"\n                         ],\n-                        \"type\": \"org.apache.nifi.avro.AvroRecordSetWriter\",\n-                        \"typeDescription\": \"Writes the contents of a RecordSet in Binary Avro format.\",\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\": \"2.0.0-M3\"\n-                    },\n+                    }\n+                ],\n+                \"processors\": [],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\n+        },\n+        {\n+            \"artifact\": \"nifi-smb-smbj-client-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-record-serialization-services-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-smb-smbj-client-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"group\": \"org.apache.nifi\",\n                         \"propertyDescriptors\": {\n-                            \"accept-empty-extensions\": {\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+                                \"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-                                \"description\": \"If set to true, empty extensions will be accepted and will be associated to a null value.\",\n-                                \"displayName\": \"Accept empty extensions\",\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\": \"accept-empty-extensions\",\n+                                \"name\": \"enable-dfs\",\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+                            \"hostname\": {\n+                                \"description\": \"The network host of the SMB file server.\",\n+                                \"displayName\": \"Hostname\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"datetime-representation\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"hostname\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"inference-strategy\": {\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"port\",\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"share\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"smb-dialect\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Includes only CEF header fields into the inferred schema.\",\n-                                        \"displayName\": \"Headers only\",\n-                                        \"value\": \"headers-only\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"AUTO\",\n+                                        \"value\": \"AUTO\"\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\": \"SMB 2.0.2\",\n+                                        \"value\": \"SMB_2_0_2\"\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\": \"SMB 2.1\",\n+                                        \"value\": \"SMB_2_1\"\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\": \"SMB 3.0\",\n+                                        \"value\": \"SMB_3_0\"\n+                                    },\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"infer-schema\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\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\": \"Defines the set of fields should be included in the schema and the way the fields are being interpreted.\",\n-                                \"displayName\": \"Inference Strategy\",\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\": \"inference-strategy\",\n+                                \"name\": \"smb-dialect\",\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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+                            \"timeout\": {\n+                                \"defaultValue\": \"5 sec\",\n+                                \"description\": \"Timeout for read and write operations.\",\n+                                \"displayName\": \"Timeout\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"raw-message-field\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"timeout\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"schema-access-strategy\": {\n+                            \"use-encryption\": {\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 schema reference information will be provided through a configured Schema Reference Reader service implementation.\",\n-                                        \"displayName\": \"Schema Reference Reader\",\n-                                        \"value\": \"schema-reference-reader\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\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\": \"\",\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\": \"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\": \"schema-access-strategy\",\n+                                \"name\": \"use-encryption\",\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+                            \"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\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\n+                    }\n+                ],\n+                \"processors\": [],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\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\": \"f2215c6\"\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. 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-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"schema-branch\",\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+                        \"multiProcessorUseCases\": [],\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"groovyx-additional-classpath\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"schema-inference-cache\": {\n-                                \"dependencies\": [\n+                            \"groovyx-failure-strategy\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"infer-schema\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\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-                                \"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+                                \"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\": \"schema-inference-cache\",\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"groovyx-script-body\",\n                                 \"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\": \"2.0.0-M3\"\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+                            \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"schema-name\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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-                            \"schema-reference-reader\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"schema-reference-reader\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"Service implementation responsible for reading FlowFile attributes or content to determine the Schema Reference Identifier\",\n-                                \"displayName\": \"Schema Reference Reader\",\n+                            {\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+                        \"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+                        \"useCases\": [],\n+                        \"version\": \"2.0.0-M3\"\n+                    }\n+                ],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"2.0.0-M3\"\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\": \"f2215c6\"\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+                        \"multiProcessorUseCases\": [],\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\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"schema-reference-reader\",\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.schemaregistry.services.SchemaReferenceReader\",\n+                                    \"type\": \"org.apache.nifi.oauth2.OAuth2AccessTokenProvider\",\n                                     \"version\": \"2.0.0-M3\"\n                                 }\n                             },\n-                            \"schema-registry\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"schema-reference-reader\",\n-                                            \"schema-name\"\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+                            \"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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"read-timeout\",\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\": \"schema-registry\",\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.schemaregistry.services.SchemaRegistry\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n                                     \"version\": \"2.0.0-M3\"\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+                            \"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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"schema-text\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"salesforce-api-version\",\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+                            \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"schema-version\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"salesforce-url\",\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\": \"2.0.0-M3\"\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.salesforce.QuerySalesforceObject\"\n+                        ],\n+                        \"sideEffectFree\": false,\n+                        \"supportedRelationships\": [\n+                            {\n+                                \"description\": \"For FlowFiles created as a result of a successful execution.\",\n+                                \"name\": \"success\"\n+                            },\n+                            {\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                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"cef\",\n-                            \"parser\",\n-                            \"reader\",\n-                            \"record\"\n+                            \"put\",\n+                            \"salesforce\",\n+                            \"sobject\"\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\": \"2.0.0-M3\"\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+                        \"useCases\": [],\n+                        \"version\": \"2.0.0-M3\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"The error message returned by Salesforce.\",\n+                                \"name\": \"error.message\"\n+                            }\n+                        ]\n                     },\n                     {\n                         \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-record-serialization-services-nar\",\n+                        \"artifact\": \"nifi-salesforce-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\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_ALLOWED\",\n+                        \"multiProcessorUseCases\": [],\n+                        \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\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+                            \"age-delay\": {\n+                                \"dependencies\": [\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+                                        \"propertyDisplayName\": \"Age Field\",\n+                                        \"propertyName\": \"age-field\"\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+                                        \"dependentValues\": [\n+                                            \"property-based-query\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Query Type\",\n+                                        \"propertyName\": \"query-type\"\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+                                \"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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"CSV Format\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"age-delay\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Comment Marker\": {\n+                            \"age-field\": {\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"custom\"\n+                                            \"property-based-query\"\n                                         ],\n-                                        \"propertyDisplayName\": \"CSV Format\",\n-                                        \"propertyName\": \"CSV Format\"\n+                                        \"propertyDisplayName\": \"Query Type\",\n+                                        \"propertyName\": \"query-type\"\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\": \"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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Comment Marker\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"age-field\",\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+                            \"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                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Date Format\",\n-                                \"required\": false,\n+                                \"name\": \"create-zero-record-files\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Escape Character\": {\n-                                \"defaultValue\": \"\\\\\",\n+                            \"custom-soql-query\": {\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"custom\"\n+                                            \"custom-query\"\n                                         ],\n-                                        \"propertyDisplayName\": \"CSV Format\",\n-                                        \"propertyName\": \"CSV Format\"\n+                                        \"propertyDisplayName\": \"Query Type\",\n+                                        \"propertyName\": \"query-type\"\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\": \"Specify the SOQL query to run.\",\n+                                \"displayName\": \"Custom SOQL Query\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Escape Character\",\n+                                \"name\": \"custom-soql-query\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Null String\": {\n+                            \"custom-where-condition\": {\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"custom\"\n+                                            \"property-based-query\"\n                                         ],\n-                                        \"propertyDisplayName\": \"CSV Format\",\n-                                        \"propertyName\": \"CSV Format\"\n+                                        \"propertyDisplayName\": \"Query Type\",\n+                                        \"propertyName\": \"query-type\"\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+                                \"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\": \"Null String\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"custom-where-condition\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Quote Character\": {\n-                                \"defaultValue\": \"\\\"\",\n+                            \"field-names\": {\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"custom\"\n+                                            \"property-based-query\"\n                                         ],\n-                                        \"propertyDisplayName\": \"CSV Format\",\n-                                        \"propertyName\": \"CSV Format\"\n+                                        \"propertyDisplayName\": \"Query Type\",\n+                                        \"propertyName\": \"query-type\"\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\": \"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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Quote Character\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"field-names\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Record Separator\": {\n-                                \"defaultValue\": \"\\\\n\",\n+                            \"initial-age-filter\": {\n                                 \"dependencies\": [\n                                     {\n+                                        \"propertyDisplayName\": \"Age Field\",\n+                                        \"propertyName\": \"age-field\"\n+                                    },\n+                                    {\n                                         \"dependentValues\": [\n-                                            \"custom\"\n+                                            \"property-based-query\"\n                                         ],\n-                                        \"propertyDisplayName\": \"CSV Format\",\n-                                        \"propertyName\": \"CSV Format\"\n+                                        \"propertyDisplayName\": \"Query Type\",\n+                                        \"propertyName\": \"query-type\"\n                                     }\n                                 ],\n-                                \"description\": \"Specifies the characters to use in order to separate CSV Records\",\n-                                \"displayName\": \"Record Separator\",\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"initial-age-filter\",\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\": \"Record Separator\",\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\": \"2.0.0-M3\"\n+                                }\n                             },\n-                            \"Skip Header Line\": {\n+                            \"query-type\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"description\": \"Provide query by properties.\",\n+                                        \"displayName\": \"Property Based Query\",\n+                                        \"value\": \"property-based-query\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"description\": \"Provide custom SOQL query.\",\n+                                        \"displayName\": \"Custom Query\",\n+                                        \"value\": \"custom-query\"\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+                                \"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\": \"Skip Header Line\",\n+                                \"name\": \"query-type\",\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+                            \"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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Timestamp Format\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"read-timeout\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\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+                            \"record-writer\": {\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"custom\"\n+                                            \"property-based-query\"\n                                         ],\n-                                        \"propertyDisplayName\": \"CSV Format\",\n-                                        \"propertyName\": \"CSV Format\"\n+                                        \"propertyDisplayName\": \"Query Type\",\n+                                        \"propertyName\": \"query-type\"\n                                     }\n                                 ],\n-                                \"description\": \"Whether or not white space should be removed from the beginning and end of fields\",\n-                                \"displayName\": \"Trim Fields\",\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\": \"Trim Fields\",\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\": \"2.0.0-M3\"\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"salesforce-api-version\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Trim double quote\": {\n-                                \"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+                            \"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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"salesforce-url\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"sobject-name\": {\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"rfc-4180\"\n+                                            \"property-based-query\"\n                                         ],\n-                                        \"propertyDisplayName\": \"CSV Format\",\n-                                        \"propertyName\": \"CSV Format\"\n+                                        \"propertyDisplayName\": \"Query Type\",\n+                                        \"propertyName\": \"query-type\"\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+                                \"description\": \"The Salesforce sObject to be queried\",\n+                                \"displayName\": \"sObject Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"sobject-name\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            }\n+                        },\n+                        \"seeAlso\": [\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\": \"For FlowFiles created as a result of a successful query.\",\n+                                \"name\": \"success\"\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+                        ],\n+                        \"supportsBatching\": false,\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"query\",\n+                            \"salesforce\",\n+                            \"sobject\",\n+                            \"soql\"\n+                        ],\n+                        \"triggerSerially\": true,\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+                        \"useCases\": [],\n+                        \"version\": \"2.0.0-M3\",\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\": \"2.0.0-M3\"\n+        },\n+        {\n+            \"artifact\": \"nifi-windows-event-log-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n+                \"processors\": [\n+                    {\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-windows-event-log-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"f2215c6\"\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+                        \"multiProcessorUseCases\": [],\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"Trim double quote\",\n+                                \"name\": \"maxBuffer\",\n                                 \"required\": true,\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+                            \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Value Separator\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"maxQueue\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"csv-reader-csv-parser\": {\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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+                        \"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+                        \"useCases\": [],\n+                        \"version\": \"2.0.0-M3\",\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\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\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\": \"f2215c6\"\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"mongo-uri\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"mongo-write-concern\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"The CSV parser implementation from the Apache Commons CSV library.\",\n-                                        \"displayName\": \"Apache Commons CSV\",\n-                                        \"value\": \"commons-csv\"\n+                                        \"description\": \"Write operations that use this write concern will wait for acknowledgement, using the default write concern configured on the server\",\n+                                        \"displayName\": \"ACKNOWLEDGED\",\n+                                        \"value\": \"ACKNOWLEDGED\"\n                                     },\n                                     {\n-                                        \"description\": \"The CSV parser implementation from the Jackson Dataformats library.\",\n-                                        \"displayName\": \"Jackson CSV\",\n-                                        \"value\": \"jackson-csv\"\n+                                        \"description\": \"Write operations that use this write concern will return as soon as the message is written to the socket. Exceptions are raised for network issues, but not server errors\",\n+                                        \"displayName\": \"UNACKNOWLEDGED\",\n+                                        \"value\": \"UNACKNOWLEDGED\"\n                                     },\n                                     {\n-                                        \"description\": \"The CSV parser implementation from the FastCSV library. NOTE: This parser only officially supports RFC-4180, so it recommended to set the 'CSV Format' property to 'RFC 4180'. It does handle some non-compliant CSV data, for that case set the 'CSV Format' property to 'CUSTOM' and the other custom format properties (such as 'Trim Fields', 'Trim double quote', etc.) as appropriate. Be aware that this may cause errors if FastCSV doesn't handle the property settings correctly (such as 'Ignore Header'), but otherwise may process the input as expected even if the data is not fully RFC-4180 compliant.\",\n-                                        \"displayName\": \"FastCSV\",\n-                                        \"value\": \"fast-csv\"\n+                                        \"description\": \"Deprecated.  Use of \\\"JOURNALED\\\" is preferred\",\n+                                        \"displayName\": \"FSYNCED\",\n+                                        \"value\": \"FSYNCED\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Write operations wait for the server to group commit to the journal file on disk\",\n+                                        \"displayName\": \"JOURNALED\",\n+                                        \"value\": \"JOURNALED\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Deprecated.  Use of \\\"W2\\\" is preferred\",\n+                                        \"displayName\": \"REPLICA_ACKNOWLEDGED\",\n+                                        \"value\": \"REPLICA_ACKNOWLEDGED\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Exceptions are raised for network issues, and server errors; waits on a majority of servers for the write operation\",\n+                                        \"displayName\": \"MAJORITY\",\n+                                        \"value\": \"MAJORITY\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Write operations that use this write concern will wait for acknowledgement from a single member\",\n+                                        \"displayName\": \"W1\",\n+                                        \"value\": \"W1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Write operations that use this write concern will wait for acknowledgement from two members\",\n+                                        \"displayName\": \"W2\",\n+                                        \"value\": \"W2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Write operations that use this write concern will wait for acknowledgement from three members\",\n+                                        \"displayName\": \"W3\",\n+                                        \"value\": \"W3\"\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+                                \"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\": \"csv-reader-csv-parser\",\n+                                \"name\": \"mongo-write-concern\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"csvutils-allow-duplicate-header-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-                                    }\n-                                ],\n-                                \"defaultValue\": \"true\",\n-                                \"dependencies\": [\n+                                        \"displayName\": \"REQUIRED\",\n+                                        \"value\": \"REQUIRED\"\n+                                    },\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"custom\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"CSV Format\",\n-                                        \"propertyName\": \"CSV Format\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"NONE\",\n+                                        \"value\": \"NONE\"\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.\\nHandling 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* FastCSV - duplicate headers will be de-duplicated with the field value being that of the left-most duplicate CSV column\",\n-                                \"displayName\": \"Allow Duplicate Header Names\",\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\": \"csvutils-allow-duplicate-header-names\",\n+                                \"name\": \"ssl-client-auth\",\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+                            \"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\": \"csvutils-character-set\",\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\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-mongodb-services-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"f2215c6\"\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\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"mongo-collection-name\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\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+                            \"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\": \"Environment variables 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\": \"ignore-csv-header\",\n+                                \"name\": \"mongo-lookup-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\": \"2.0.0-M3\"\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@@ -17789,30 +23431,20 @@\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 schema reference information will be provided through a configured Schema Reference Reader service implementation.\",\n-                                        \"displayName\": \"Schema Reference Reader\",\n-                                        \"value\": \"schema-reference-reader\"\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+                                        \"description\": \"\",\n+                                        \"displayName\": \"Infer from Result\",\n+                                        \"value\": \"infer\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"infer-schema\",\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\": \"schema-access-strategy\",\n                                 \"required\": true,\n@@ -17847,45 +23479,20 @@\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\": \"Environment variables and FlowFile Attributes\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n                                 \"name\": \"schema-name\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"schema-reference-reader\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"schema-reference-reader\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"Service implementation responsible for reading FlowFile attributes or content to determine the Schema Reference Identifier\",\n-                                \"displayName\": \"Schema Reference Reader\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"schema-reference-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.schemaregistry.services.SchemaReferenceReader\",\n-                                    \"version\": \"2.0.0-M3\"\n-                                }\n-                            },\n                             \"schema-registry\": {\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n                                             \"schema-reference-reader\",\n                                             \"schema-name\"\n                                         ],\n@@ -17948,4124 +23555,3022 @@\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.lookup.LookupService\",\n                                 \"version\": \"2.0.0-M3\"\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+                            \"lookup\",\n+                            \"mongo\",\n+                            \"mongodb\",\n+                            \"record\"\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+                        \"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\": \"2.0.0-M3\"\n-                    },\n+                    }\n+                ],\n+                \"processors\": [],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"2.0.0-M3\"\n+        },\n+        {\n+            \"artifact\": \"nifi-site-to-site-reporting-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-record-serialization-services-nar\",\n+                        \"artifact\": \"nifi-site-to-site-reporting-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"group\": \"org.apache.nifi\",\n                         \"propertyDescriptors\": {\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-                                \"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-                                    {\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\": \"Environment variables 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-                                    {\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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Escape Character\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Include Header Line\": {\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Batch Size\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Communications Timeout\": {\n+                                \"defaultValue\": \"30 secs\",\n+                                \"description\": \"Specifies how long to wait to a response from the destination before deciding that an error has occurred and canceling the transaction\",\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+                            \"Compress 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 the CSV column names should be written out as the first line.\",\n-                                \"displayName\": \"Include Header Line\",\n+                                \"description\": \"Indicates whether or not to compress the data being sent.\",\n+                                \"displayName\": \"Compress Events\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Include Header Line\",\n+                                \"name\": \"Compress Events\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\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-                                            \"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+                            \"Destination URL\": {\n+                                \"description\": \"The URL of the destination NiFi instance or, if clustered, a comma-separated list of address in the format of http(s)://host:port/nifi. This destination URL will only be used to initiate the Site-to-Site connection. The data sent by this reporting task will be load-balanced on all the nodes of the destination (if clustered).\",\n+                                \"displayName\": \"Destination URL\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Include Trailing Delimiter\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Destination URL\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Null String\",\n-                                \"required\": false,\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+                            \"Input Port Name\": {\n+                                \"description\": \"The name of the Input Port to deliver data to.\",\n+                                \"displayName\": \"Input Port Name\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Quote Character\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Input Port Name\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\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-                                            \"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+                            \"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\": \"Quote Mode\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Instance URL\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\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+                            \"SSL Context Service\": {\n+                                \"description\": \"The SSL Context Service to use when communicating with the destination. 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\": \"Record Separator\",\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.RestrictedSSLContextService\",\n+                                    \"version\": \"2.0.0-M3\"\n+                                }\n                             },\n-                            \"Schema Reference Writer\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"schema-reference-writer\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Write Strategy\",\n-                                        \"propertyName\": \"Schema Write Strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"Service implementation responsible for writing FlowFile attributes or content header with Schema reference information\",\n-                                \"displayName\": \"Schema Reference Writer\",\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\": \"Schema Reference 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.schemaregistry.services.SchemaReferenceWriter\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n                                     \"version\": \"2.0.0-M3\"\n                                 }\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 schema reference information will be written through a configured Schema Reference Writer service implementation.\",\n-                                        \"displayName\": \"Schema Reference Writer\",\n-                                        \"value\": \"schema-reference-writer\"\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+                            \"s2s-http-proxy-hostname\": {\n+                                \"description\": \"Specify the proxy server's hostname to use. If not specified, HTTP traffics are sent directly to the target NiFi instance.\",\n+                                \"displayName\": \"HTTP Proxy hostname\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Schema Write Strategy\",\n-                                \"required\": true,\n+                                \"name\": \"s2s-http-proxy-hostname\",\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+                            \"s2s-http-proxy-password\": {\n+                                \"description\": \"Specify an user password to connect to the proxy server, optional.\",\n+                                \"displayName\": \"HTTP Proxy password\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Time Format\",\n+                                \"name\": \"s2s-http-proxy-password\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n+                            },\n+                            \"s2s-http-proxy-port\": {\n+                                \"description\": \"Specify the proxy server's port number, optional. If not specified, default port 80 will be used.\",\n+                                \"displayName\": \"HTTP Proxy port\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"s2s-http-proxy-port\",\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+                            \"s2s-http-proxy-username\": {\n+                                \"description\": \"Specify an user name to connect to the proxy server, optional.\",\n+                                \"displayName\": \"HTTP Proxy username\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Timestamp Format\",\n+                                \"name\": \"s2s-http-proxy-username\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Trim Fields\": {\n+                            \"s2s-transport-protocol\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"displayName\": \"RAW\",\n+                                        \"value\": \"RAW\"\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+                                        \"displayName\": \"HTTP\",\n+                                        \"value\": \"HTTP\"\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\": \"RAW\",\n+                                \"description\": \"Specifies which transport protocol to use for Site-to-Site communication.\",\n+                                \"displayName\": \"Transport Protocol\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Trim Fields\",\n+                                \"name\": \"s2s-transport-protocol\",\n                                 \"required\": true,\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+                            }\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\": \"2.0.0-M3\"\n+                            }\n+                        ],\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"db\",\n+                            \"record\",\n+                            \"s2s\",\n+                            \"site\"\n+                        ],\n+                        \"type\": \"org.apache.nifi.reporting.sink.SiteToSiteReportingRecordSink\",\n+                        \"typeDescription\": \"Provides a service to write records using a configured RecordSetWriter over a Site-to-Site connection.\",\n+                        \"version\": \"2.0.0-M3\"\n+                    }\n+                ],\n+                \"processors\": [],\n+                \"reportingTasks\": [\n+                    {\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-site-to-site-reporting-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"f2215c6\"\n+                        },\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"1 min\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"explicitRestrictions\": [\n+                            {\n+                                \"explanation\": \"Provides operator the ability to send sensitive details contained in bulletin events to any external system.\",\n+                                \"requiredPermission\": \"export nifi details\"\n+                            }\n+                        ],\n+                        \"group\": \"org.apache.nifi\",\n+                        \"propertyDescriptors\": {\n+                            \"Communications Timeout\": {\n+                                \"defaultValue\": \"30 secs\",\n+                                \"description\": \"Specifies how long to wait to a response from the destination before deciding that an error has occurred and canceling the transaction\",\n+                                \"displayName\": \"Communications Timeout\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Value Separator\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Communications Timeout\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"csv-writer\": {\n+                            \"Compress Events\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"The CSV writer implementation from the Apache Commons CSV library.\",\n-                                        \"displayName\": \"Apache Commons CSV\",\n-                                        \"value\": \"commons-csv\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n-                                        \"description\": \"The CSV writer implementation from the FastCSV library. NOTE: This writer only officially supports RFC-4180, so it recommended to set the 'CSV Format' property to 'RFC 4180'. It does handle some non-compliant CSV data, for that case set the 'CSV Format' property to 'CUSTOM' and the other custom format properties (such as 'Trim Fields', 'Trim double quote', etc.) as appropriate. Be aware that this may cause errors if FastCSV doesn't handle the property settings correctly (such as 'Quote Mode'), but otherwise may process the output as expected even if the data is not fully RFC-4180 compliant.\",\n-                                        \"displayName\": \"FastCSV\",\n-                                        \"value\": \"fast-csv\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"commons-csv\",\n-                                \"description\": \"Specifies which writer implementation to use to write CSV records. NOTE: Different writers may support different subsets of functionality and may also exhibit different levels of performance.\",\n-                                \"displayName\": \"CSV Writer\",\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"Indicates whether or not to compress the data being sent.\",\n+                                \"displayName\": \"Compress Events\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"csv-writer\",\n+                                \"name\": \"Compress Events\",\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+                            \"Destination URL\": {\n+                                \"description\": \"The URL of the destination NiFi instance or, if clustered, a comma-separated list of address in the format of http(s)://host:port/nifi. This destination URL will only be used to initiate the Site-to-Site connection. The data sent by this reporting task will be load-balanced on all the nodes of the destination (if clustered).\",\n+                                \"displayName\": \"Destination URL\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"csvutils-character-set\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Destination URL\",\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+                            \"Input Port Name\": {\n+                                \"description\": \"The name of the Input Port to deliver data to.\",\n+                                \"displayName\": \"Input Port Name\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"schema-access-strategy\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Input Port Name\",\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+                            \"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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"schema-branch\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Instance URL\",\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+                            \"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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Platform\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"SSL Context Service\": {\n+                                \"description\": \"The SSL Context Service to use when communicating with the destination. 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-cache\",\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.RecordSchemaCacheService\",\n+                                    \"type\": \"org.apache.nifi.ssl.RestrictedSSLContextService\",\n                                     \"version\": \"2.0.0-M3\"\n                                 }\n                             },\n-                            \"schema-name\": {\n-                                \"defaultValue\": \"${schema.name}\",\n-                                \"dependencies\": [\n+                            \"include-null-values\": {\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\": \"Indicate if null values should be included in records. Default will be false\",\n+                                \"displayName\": \"Include Null Values\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"schema-name\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"include-null-values\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"schema-reference-reader\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"schema-reference-reader\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"Service implementation responsible for reading FlowFile attributes or content to determine the Schema Reference Identifier\",\n-                                \"displayName\": \"Schema Reference Reader\",\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\": \"schema-reference-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.schemaregistry.services.SchemaReferenceReader\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n                                     \"version\": \"2.0.0-M3\"\n                                 }\n                             },\n-                            \"schema-registry\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"schema-reference-reader\",\n-                                            \"schema-name\"\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+                            \"s2s-http-proxy-hostname\": {\n+                                \"description\": \"Specify the proxy server's hostname to use. If not specified, HTTP traffics are sent directly to the target NiFi instance.\",\n+                                \"displayName\": \"HTTP Proxy hostname\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"schema-registry\",\n+                                \"name\": \"s2s-http-proxy-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.schemaregistry.services.SchemaRegistry\",\n-                                    \"version\": \"2.0.0-M3\"\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+                            \"s2s-http-proxy-password\": {\n+                                \"description\": \"Specify an user password to connect to the proxy server, optional.\",\n+                                \"displayName\": \"HTTP Proxy password\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"schema-text\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"s2s-http-proxy-password\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n+                            },\n+                            \"s2s-http-proxy-port\": {\n+                                \"description\": \"Specify the proxy server's port number, optional. If not specified, default port 80 will be used.\",\n+                                \"displayName\": \"HTTP Proxy port\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"s2s-http-proxy-port\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"schema-version\": {\n-                                \"dependencies\": [\n+                            \"s2s-http-proxy-username\": {\n+                                \"description\": \"Specify an user name to connect to the proxy server, optional.\",\n+                                \"displayName\": \"HTTP Proxy username\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"s2s-http-proxy-username\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"s2s-transport-protocol\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"schema-name\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"RAW\",\n+                                        \"value\": \"RAW\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"HTTP\",\n+                                        \"value\": \"HTTP\"\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+                                \"defaultValue\": \"RAW\",\n+                                \"description\": \"Specifies which transport protocol to use for Site-to-Site communication.\",\n+                                \"displayName\": \"Transport Protocol\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"schema-version\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"s2s-transport-protocol\",\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.RecordSetWriterFactory\",\n-                                \"version\": \"2.0.0-M3\"\n-                            }\n+                        \"restricted\": true,\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\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+                            \"bulletin\",\n+                            \"site\",\n+                            \"site to site\"\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+                        \"type\": \"org.apache.nifi.reporting.SiteToSiteBulletinReportingTask\",\n+                        \"typeDescription\": \"Publishes Bulletin events using the Site To Site protocol. Note: only up to 5 bulletins are stored per component and up to 10 bulletins at controller level for a duration of up to 5 minutes. If this reporting task is not scheduled frequently enough some bulletins may not be sent.\",\n                         \"version\": \"2.0.0-M3\"\n                     },\n                     {\n                         \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-record-serialization-services-nar\",\n+                        \"artifact\": \"nifi-site-to-site-reporting-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n-                        \"explicitRestrictions\": [\n-                            {\n-                                \"explanation\": \"Patterns and Expressions can reference resources over HTTP\",\n-                                \"requiredPermission\": \"reference remote resources\"\n-                            }\n-                        ],\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\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+                            \"Communications Timeout\": {\n+                                \"defaultValue\": \"30 secs\",\n+                                \"description\": \"Specifies how long to wait to a response from the destination before deciding that an error has occurred and canceling the transaction\",\n+                                \"displayName\": \"Communications Timeout\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Grok Expression\",\n+                                \"name\": \"Communications Timeout\",\n                                 \"required\": true,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\",\n-                                        \"TEXT\",\n-                                        \"URL\"\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Grok Pattern File\",\n-                                \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\",\n-                                        \"TEXT\",\n-                                        \"URL\"\n-                                    ]\n-                                },\n                                 \"sensitive\": false\n                             },\n-                            \"no-match-behavior\": {\n+                            \"Compress Events\": {\n                                 \"allowableValues\": [\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-                                    },\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\": \"true\",\n+                                        \"value\": \"true\"\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+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\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+                                \"defaultValue\": \"true\",\n+                                \"description\": \"Indicates whether or not to compress the data being sent.\",\n+                                \"displayName\": \"Compress Events\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"no-match-behavior\",\n+                                \"name\": \"Compress Events\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"schema-access-strategy\": {\n-                                \"allowableValues\": [\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-                                    },\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 schema reference information will be provided through a configured Schema Reference Reader service implementation.\",\n-                                        \"displayName\": \"Schema Reference Reader\",\n-                                        \"value\": \"schema-reference-reader\"\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+                            \"Destination URL\": {\n+                                \"description\": \"The URL of the destination NiFi instance or, if clustered, a comma-separated list of address in the format of http(s)://host:port/nifi. This destination URL will only be used to initiate the Site-to-Site connection. The data sent by this reporting task will be load-balanced on all the nodes of the destination (if clustered).\",\n+                                \"displayName\": \"Destination URL\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"schema-access-strategy\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Destination URL\",\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\": \"Environment variables 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+                            \"Input Port Name\": {\n+                                \"description\": \"The name of the Input Port to deliver data to.\",\n+                                \"displayName\": \"Input Port Name\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"schema-name\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Input Port Name\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"schema-reference-reader\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"schema-reference-reader\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"Service implementation responsible for reading FlowFile attributes or content to determine the Schema Reference Identifier\",\n-                                \"displayName\": \"Schema Reference Reader\",\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\": \"schema-reference-reader\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Instance URL\",\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.SchemaReferenceReader\",\n-                                    \"version\": \"2.0.0-M3\"\n-                                }\n+                                \"sensitive\": false\n                             },\n-                            \"schema-registry\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"schema-reference-reader\",\n-                                            \"schema-name\"\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 when communicating with the destination. 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\": \"2.0.0-M3\"\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\": \"Environment variables 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\": \"Environment variables 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\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\n-                    },\n-                    {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-record-serialization-services-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"f2215c6\"\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+                            \"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\": \"false\",\n-                                \"description\": \"Whether to allow comments when parsing the JSON document\",\n-                                \"displayName\": \"Allow Comments\",\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\": \"Allow Comments\",\n+                                \"name\": \"include-null-values\",\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+                            \"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\": \"Date Format\",\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\": \"2.0.0-M3\"\n+                                }\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+                            \"s2s-http-proxy-hostname\": {\n+                                \"description\": \"Specify the proxy server's hostname to use. If not specified, HTTP traffics are sent directly to the target NiFi instance.\",\n+                                \"displayName\": \"HTTP Proxy hostname\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Max String Length\",\n-                                \"required\": true,\n+                                \"name\": \"s2s-http-proxy-hostname\",\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+                            \"s2s-http-proxy-password\": {\n+                                \"description\": \"Specify an user password to connect to the proxy server, optional.\",\n+                                \"displayName\": \"HTTP Proxy password\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Time Format\",\n+                                \"name\": \"s2s-http-proxy-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+                            \"s2s-http-proxy-port\": {\n+                                \"description\": \"Specify the proxy server's port number, optional. If not specified, default port 80 will be used.\",\n+                                \"displayName\": \"HTTP Proxy port\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Timestamp Format\",\n+                                \"name\": \"s2s-http-proxy-port\",\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 schema reference information will be provided through a configured Schema Reference Reader service implementation.\",\n-                                        \"displayName\": \"Schema Reference Reader\",\n-                                        \"value\": \"schema-reference-reader\"\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+                            \"s2s-http-proxy-username\": {\n+                                \"description\": \"Specify an user name to connect to the proxy server, optional.\",\n+                                \"displayName\": \"HTTP Proxy username\",\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-                                    {\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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"schema-branch\",\n+                                \"name\": \"s2s-http-proxy-username\",\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+                            \"s2s-metrics-application-id\": {\n+                                \"defaultValue\": \"nifi\",\n+                                \"description\": \"The Application ID to be included in the metrics\",\n+                                \"displayName\": \"Application ID\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"schema-name\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"s2s-metrics-application-id\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"schema-reference-reader\": {\n-                                \"dependencies\": [\n+                            \"s2s-metrics-format\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"schema-reference-reader\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"Service implementation responsible for reading FlowFile attributes or content to determine the Schema Reference Identifier\",\n-                                \"displayName\": \"Schema Reference Reader\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"schema-reference-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.schemaregistry.services.SchemaReferenceReader\",\n-                                    \"version\": \"2.0.0-M3\"\n-                                }\n-                            },\n-                            \"schema-registry\": {\n-                                \"dependencies\": [\n+                                        \"description\": \"Metrics will be formatted according to the Ambari Metrics API. See Additional Details in Usage documentation.\",\n+                                        \"displayName\": \"Ambari Format\",\n+                                        \"value\": \"ambari-format\"\n+                                    },\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"schema-reference-reader\",\n-                                            \"schema-name\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n+                                        \"description\": \"Metrics will be formatted using the Record Writer property of this reporting task. See Additional Details in Usage documentation to have the description of the default schema.\",\n+                                        \"displayName\": \"Record Format\",\n+                                        \"value\": \"record-format\"\n                                     }\n                                 ],\n-                                \"description\": \"Specifies the Controller Service to use for the Schema Registry\",\n-                                \"displayName\": \"Schema Registry\",\n+                                \"defaultValue\": \"ambari-format\",\n+                                \"description\": \"The output format that will be used for the metrics. If Record Format is selected, a Record Writer must be provided. If Ambari Format is selected, the Record Writer property should be empty.\",\n+                                \"displayName\": \"Output Format\",\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\": \"2.0.0-M3\"\n-                                }\n+                                \"name\": \"s2s-metrics-format\",\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+                            \"s2s-metrics-hostname\": {\n+                                \"defaultValue\": \"${hostname(true)}\",\n+                                \"description\": \"The Hostname of this NiFi instance to be included in the metrics\",\n+                                \"displayName\": \"Hostname\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"schema-text\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"s2s-metrics-hostname\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"schema-version\": {\n-                                \"dependencies\": [\n+                            \"s2s-transport-protocol\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"schema-name\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"RAW\",\n+                                        \"value\": \"RAW\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"HTTP\",\n+                                        \"value\": \"HTTP\"\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+                                \"defaultValue\": \"RAW\",\n+                                \"description\": \"Specifies which transport protocol to use for Site-to-Site communication.\",\n+                                \"displayName\": \"Transport Protocol\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"schema-version\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"s2s-transport-protocol\",\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\": \"2.0.0-M3\"\n-                            }\n-                        ],\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.json.JsonTreeReader\"\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\n                         ],\n-                        \"supportsDynamicProperties\": true,\n+                        \"supportsDynamicProperties\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"json\",\n-                            \"jsonpath\",\n-                            \"parser\",\n-                            \"reader\",\n-                            \"record\"\n+                            \"metrics\",\n+                            \"site\",\n+                            \"site to site\",\n+                            \"status\"\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+                        \"type\": \"org.apache.nifi.reporting.SiteToSiteMetricsReportingTask\",\n+                        \"typeDescription\": \"Publishes same metrics as the Ambari Reporting task using the Site To Site protocol.\",\n                         \"version\": \"2.0.0-M3\"\n                     },\n                     {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-record-serialization-services-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-site-to-site-reporting-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"explicitRestrictions\": [\n+                            {\n+                                \"explanation\": \"Provides operator the ability to send sensitive details contained in Provenance events to any external system.\",\n+                                \"requiredPermission\": \"export nifi details\"\n+                            }\n+                        ],\n                         \"group\": \"org.apache.nifi\",\n                         \"propertyDescriptors\": {\n-                            \"Allow Scientific Notation\": {\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Batch Size\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Communications Timeout\": {\n+                                \"defaultValue\": \"30 secs\",\n+                                \"description\": \"Specifies how long to wait to a response from the destination before deciding that an error has occurred and canceling the transaction\",\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+                            \"Compress 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 or not scientific notation should be used when writing numbers\",\n-                                \"displayName\": \"Allow Scientific Notation\",\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"Indicates whether or not to compress the data being sent.\",\n+                                \"displayName\": \"Compress Events\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Allow Scientific Notation\",\n+                                \"name\": \"Compress Events\",\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+                            \"Destination URL\": {\n+                                \"description\": \"The URL of the destination NiFi instance or, if clustered, a comma-separated list of address in the format of http(s)://host:port/nifi. This destination URL will only be used to initiate the Site-to-Site connection. The data sent by this reporting task will be load-balanced on all the nodes of the destination (if clustered).\",\n+                                \"displayName\": \"Destination URL\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Destination URL\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Input Port Name\": {\n+                                \"description\": \"The name of the Input Port to deliver data to.\",\n+                                \"displayName\": \"Input Port Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Input Port Name\",\n+                                \"required\": true,\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Instance URL\",\n+                                \"required\": 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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Platform\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"SSL Context Service\": {\n+                                \"description\": \"The SSL Context Service to use when communicating with the destination. 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\": \"Date Format\",\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\": \"2.0.0-M3\"\n+                                }\n                             },\n-                            \"Pretty Print JSON\": {\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\": \"false\",\n-                                \"description\": \"Specifies whether or not the JSON should be pretty printed\",\n-                                \"displayName\": \"Pretty Print JSON\",\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\": \"Pretty Print JSON\",\n+                                \"name\": \"include-null-values\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Schema Reference Writer\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"schema-reference-writer\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Write Strategy\",\n-                                        \"propertyName\": \"Schema Write Strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"Service implementation responsible for writing FlowFile attributes or content header with Schema reference information\",\n-                                \"displayName\": \"Schema Reference Writer\",\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\": \"Schema Reference Writer\",\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.schemaregistry.services.SchemaReferenceWriter\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n                                     \"version\": \"2.0.0-M3\"\n                                 }\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 schema reference information will be written through a configured Schema Reference Writer service implementation.\",\n-                                        \"displayName\": \"Schema Reference Writer\",\n-                                        \"value\": \"schema-reference-writer\"\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+                            \"s2s-http-proxy-hostname\": {\n+                                \"description\": \"Specify the proxy server's hostname to use. If not specified, HTTP traffics are sent directly to the target NiFi instance.\",\n+                                \"displayName\": \"HTTP Proxy hostname\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Schema Write Strategy\",\n-                                \"required\": true,\n+                                \"name\": \"s2s-http-proxy-hostname\",\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+                            \"s2s-http-proxy-password\": {\n+                                \"description\": \"Specify an user password to connect to the proxy server, optional.\",\n+                                \"displayName\": \"HTTP Proxy password\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Time Format\",\n+                                \"name\": \"s2s-http-proxy-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+                            \"s2s-http-proxy-port\": {\n+                                \"description\": \"Specify the proxy server's port number, optional. If not specified, default port 80 will be used.\",\n+                                \"displayName\": \"HTTP Proxy port\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Timestamp Format\",\n+                                \"name\": \"s2s-http-proxy-port\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\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+                            \"s2s-http-proxy-username\": {\n+                                \"description\": \"Specify an user name to connect to the proxy server, optional.\",\n+                                \"displayName\": \"HTTP Proxy username\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"compression-format\",\n-                                \"required\": true,\n+                                \"name\": \"s2s-http-proxy-username\",\n+                                \"required\": false,\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-                                            \"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+                            \"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, UPLOAD, 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\": \"compression-level\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"s2s-prov-task-event-filter\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\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+                            \"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, UPLOAD, 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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"output-grouping\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"s2s-prov-task-event-filter-exclude\",\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+                            \"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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"schema-access-strategy\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"s2s-prov-task-id-filter\",\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+                            \"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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"schema-branch\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"s2s-prov-task-id-filter-exclude\",\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+                            \"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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"schema-cache\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"s2s-prov-task-name-filter\",\n                                 \"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\": \"2.0.0-M3\"\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+                            \"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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"schema-name\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"s2s-prov-task-name-filter-exclude\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"schema-reference-reader\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"schema-reference-reader\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"Service implementation responsible for reading FlowFile attributes or content to determine the Schema Reference Identifier\",\n-                                \"displayName\": \"Schema Reference Reader\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"schema-reference-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.schemaregistry.services.SchemaReferenceReader\",\n-                                    \"version\": \"2.0.0-M3\"\n-                                }\n-                            },\n-                            \"schema-registry\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"schema-reference-reader\",\n-                                            \"schema-name\"\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+                            \"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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"schema-registry\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"s2s-prov-task-type-filter\",\n                                 \"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\": \"2.0.0-M3\"\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+                            \"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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"schema-text\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"s2s-prov-task-type-filter-exclude\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"schema-version\": {\n-                                \"dependencies\": [\n+                            \"s2s-transport-protocol\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"schema-name\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"RAW\",\n+                                        \"value\": \"RAW\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"HTTP\",\n+                                        \"value\": \"HTTP\"\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+                                \"defaultValue\": \"RAW\",\n+                                \"description\": \"Specifies which transport protocol to use for Site-to-Site communication.\",\n+                                \"displayName\": \"Transport Protocol\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"schema-version\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"s2s-transport-protocol\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"suppress-nulls\": {\n+                            \"start-position\": {\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\": \"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\": \"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\": \"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\": \"never-suppress\",\n-                                \"description\": \"Specifies how the writer should handle a null field\",\n-                                \"displayName\": \"Suppress Null Values\",\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\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"suppress-nulls\",\n+                                \"name\": \"start-position\",\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.RecordSetWriterFactory\",\n-                                \"version\": \"2.0.0-M3\"\n-                            }\n+                        \"restricted\": true,\n+                        \"stateful\": {\n+                            \"description\": \"Stores the Reporting Task's last event Id so that on restart the task knows where it left off.\",\n+                            \"scopes\": [\n+                                \"LOCAL\"\n+                            ]\n+                        },\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\n                         ],\n                         \"supportsDynamicProperties\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"json\",\n-                            \"record\",\n-                            \"recordset\",\n-                            \"resultset\",\n-                            \"row\",\n-                            \"serialize\",\n-                            \"writer\"\n+                            \"lineage\",\n+                            \"provenance\",\n+                            \"site\",\n+                            \"site to site\",\n+                            \"tracking\"\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+                        \"type\": \"org.apache.nifi.reporting.SiteToSiteProvenanceReportingTask\",\n+                        \"typeDescription\": \"Publishes Provenance events using the Site To Site protocol.\",\n                         \"version\": \"2.0.0-M3\"\n                     },\n                     {\n                         \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-record-serialization-services-nar\",\n+                        \"artifact\": \"nifi-site-to-site-reporting-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"group\": \"org.apache.nifi\",\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+                            \"Batch Size\": {\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\": \"Allow Comments\",\n+                                \"name\": \"Batch Size\",\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+                            \"Communications Timeout\": {\n+                                \"defaultValue\": \"30 secs\",\n+                                \"description\": \"Specifies how long to wait to a response from the destination before deciding that an error has occurred and canceling the transaction\",\n+                                \"displayName\": \"Communications Timeout\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Max String Length\",\n+                                \"name\": \"Communications Timeout\",\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+                            \"Component Name Filter Regex\": {\n+                                \"defaultValue\": \".*\",\n+                                \"description\": \"A regex specifying which component names to report.  Any component name matching this regex will be included.\",\n+                                \"displayName\": \"Component Name Filter Regex\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Time Format\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Component Name Filter Regex\",\n+                                \"required\": true,\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+                            \"Component Type Filter Regex\": {\n+                                \"defaultValue\": \"(Processor|ProcessGroup|RemoteProcessGroup|RootProcessGroup|Connection|InputPort|OutputPort)\",\n+                                \"description\": \"A regex specifying which component types to report.  Any component type matching this regex will be included.  Component types are: Processor, RootProcessGroup, ProcessGroup, RemoteProcessGroup, Connection, InputPort, OutputPort\",\n+                                \"displayName\": \"Component Type Filter Regex\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Timestamp Format\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Component Type Filter Regex\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"schema-access-strategy\": {\n+                            \"Compress Events\": {\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+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n-                                        \"description\": \"The schema reference information will be provided through a configured Schema Reference Reader service implementation.\",\n-                                        \"displayName\": \"Schema Reference Reader\",\n-                                        \"value\": \"schema-reference-reader\"\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\": \"true\",\n+                                \"description\": \"Indicates whether or not to compress the data being sent.\",\n+                                \"displayName\": \"Compress Events\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"schema-access-strategy\",\n+                                \"name\": \"Compress Events\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\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-                                            \"schema-reference-reader\",\n-                                            \"schema-name\",\n-                                            \"schema-text-property\"\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+                            \"Destination URL\": {\n+                                \"description\": \"The URL of the destination NiFi instance or, if clustered, a comma-separated list of address in the format of http(s)://host:port/nifi. This destination URL will only be used to initiate the Site-to-Site connection. The data sent by this reporting task will be load-balanced on all the nodes of the destination (if clustered).\",\n+                                \"displayName\": \"Destination URL\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"schema-application-strategy\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Destination URL\",\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+                            \"Input Port Name\": {\n+                                \"description\": \"The name of the Input Port to deliver data to.\",\n+                                \"displayName\": \"Input Port Name\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"schema-branch\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Input Port Name\",\n+                                \"required\": true,\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+                            \"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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Instance URL\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Platform\": {\n+                                \"defaultValue\": \"nifi\",\n+                                \"description\": \"The value to use for the platform field in each status record.\",\n+                                \"displayName\": \"Platform\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Platform\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"SSL Context Service\": {\n+                                \"description\": \"The SSL Context Service to use when communicating with the destination. 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-inference-cache\",\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.RecordSchemaCacheService\",\n+                                    \"type\": \"org.apache.nifi.ssl.RestrictedSSLContextService\",\n                                     \"version\": \"2.0.0-M3\"\n                                 }\n                             },\n-                            \"schema-name\": {\n-                                \"defaultValue\": \"${schema.name}\",\n-                                \"dependencies\": [\n+                            \"include-null-values\": {\n+                                \"allowableValues\": [\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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"schema-name\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"schema-reference-reader\": {\n-                                \"dependencies\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"schema-reference-reader\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"description\": \"Service implementation responsible for reading FlowFile attributes or content to determine the Schema Reference Identifier\",\n-                                \"displayName\": \"Schema Reference Reader\",\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\": \"schema-reference-reader\",\n+                                \"name\": \"include-null-values\",\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.SchemaReferenceReader\",\n-                                    \"version\": \"2.0.0-M3\"\n-                                }\n+                                \"sensitive\": false\n                             },\n-                            \"schema-registry\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"schema-reference-reader\",\n-                                            \"schema-name\"\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+                            \"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\": \"schema-registry\",\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.schemaregistry.services.SchemaRegistry\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n                                     \"version\": \"2.0.0-M3\"\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+                            \"s2s-http-proxy-hostname\": {\n+                                \"description\": \"Specify the proxy server's hostname to use. If not specified, HTTP traffics are sent directly to the target NiFi instance.\",\n+                                \"displayName\": \"HTTP Proxy hostname\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"schema-text\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"s2s-http-proxy-hostname\",\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+                            \"s2s-http-proxy-password\": {\n+                                \"description\": \"Specify an user password to connect to the proxy server, optional.\",\n+                                \"displayName\": \"HTTP Proxy password\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"schema-version\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"s2s-http-proxy-password\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n+                            },\n+                            \"s2s-http-proxy-port\": {\n+                                \"description\": \"Specify the proxy server's port number, optional. If not specified, default port 80 will be used.\",\n+                                \"displayName\": \"HTTP Proxy port\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"s2s-http-proxy-port\",\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+                            \"s2s-http-proxy-username\": {\n+                                \"description\": \"Specify an user name to connect to the proxy server, optional.\",\n+                                \"displayName\": \"HTTP Proxy username\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"starting-field-name\",\n+                                \"name\": \"s2s-http-proxy-username\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"starting-field-strategy\": {\n+                            \"s2s-transport-protocol\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Begins processing from the root node.\",\n-                                        \"displayName\": \"Root Node\",\n-                                        \"value\": \"ROOT_NODE\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"RAW\",\n+                                        \"value\": \"RAW\"\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+                                        \"description\": \"\",\n+                                        \"displayName\": \"HTTP\",\n+                                        \"value\": \"HTTP\"\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+                                \"defaultValue\": \"RAW\",\n+                                \"description\": \"Specifies which transport protocol to use for Site-to-Site communication.\",\n+                                \"displayName\": \"Transport Protocol\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"starting-field-strategy\",\n+                                \"name\": \"s2s-transport-protocol\",\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\": \"2.0.0-M3\"\n-                            }\n-                        ],\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.json.JsonPathReader\"\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\n                         ],\n                         \"supportsDynamicProperties\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"json\",\n-                            \"parser\",\n-                            \"reader\",\n-                            \"record\",\n-                            \"tree\"\n+                            \"history\",\n+                            \"metrics\",\n+                            \"site\",\n+                            \"site to site\",\n+                            \"status\"\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+                        \"type\": \"org.apache.nifi.reporting.SiteToSiteStatusReportingTask\",\n+                        \"typeDescription\": \"Publishes Status events using the Site To Site protocol.  The component type and name filter regexes form a union: only components matching both regexes will be reported.  However, all process groups are recursively searched for matching components, regardless of whether the process group matches the component filters.\",\n                         \"version\": \"2.0.0-M3\"\n-                    },\n+                    }\n+                ]\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"2.0.0-M3\"\n+        },\n+        {\n+            \"artifact\": \"nifi-network-processors-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n+                \"processors\": [\n                     {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-record-serialization-services-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-network-processors-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n-                        \"dynamicProperties\": [\n-                            {\n-                                \"description\": \"\",\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"name\": \"Name of the RecordReader\",\n-                                \"value\": \"A RecordReaderFactory controller service\"\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+                        \"multiProcessorUseCases\": [],\n+                        \"primaryNodeOnly\": false,\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+                            \"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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Service to Use\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"FIELDS_DESTINATION\",\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\": \"2.0.0-M3\"\n+                                \"description\": \"Optionally read if packets are received from UDP datagrams.\",\n+                                \"name\": \"udp.port\"\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\": \"2.0.0-M3\"\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-record-serialization-services-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"f2215c6\"\n-                        },\n-                        \"dynamicProperties\": [\n+                        \"sideEffectFree\": true,\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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Service to Use\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            }\n-                        },\n-                        \"providedApiImplementations\": [\n+                                \"description\": \"Any FlowFile that is successfully parsed as a netflowv5 data will be transferred 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\": \"2.0.0-M3\"\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-                        \"seeAlso\": [\n-                            \"org.apache.nifi.lookup.ReaderLookup\"\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\n                         ],\n-                        \"supportsDynamicProperties\": true,\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"lookup\",\n-                            \"record\",\n-                            \"recordset\",\n-                            \"result\",\n-                            \"row\",\n-                            \"serializer\",\n-                            \"set\",\n-                            \"writer\"\n+                            \"attributes\",\n+                            \"byte\",\n+                            \"datagram\",\n+                            \"netflow\",\n+                            \"network\",\n+                            \"packet\",\n+                            \"v5\"\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\": \"2.0.0-M3\"\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+                        \"useCases\": [],\n+                        \"version\": \"2.0.0-M3\",\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\": \"2.0.0-M3\"\n+        },\n+        {\n+            \"artifact\": \"nifi-web-client-provider-service-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-record-serialization-services-nar\",\n+                        \"artifact\": \"nifi-web-client-provider-service-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\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+                            \"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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"max-cache-size\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"connect-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.serialization.RecordSchemaCacheService\",\n-                                \"version\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\n-                    },\n-                    {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-record-serialization-services-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"f2215c6\"\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+                            \"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\": \"Character Set\",\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\": \"2.0.0-M3\"\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-                            \"syslog-5424-reader-raw-message\": {\n+                            \"redirect-handling-strategy\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"displayName\": \"FOLLOWED\",\n+                                        \"value\": \"FOLLOWED\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"displayName\": \"IGNORED\",\n+                                        \"value\": \"IGNORED\"\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\": \"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\": \"syslog-5424-reader-raw-message\",\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.ssl.SSLContextService\",\n+                                    \"version\": \"2.0.0-M3\"\n+                                }\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+                                \"dynamic\": 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.serialization.RecordReaderFactory\",\n+                                \"type\": \"org.apache.nifi.web.client.provider.api.WebClientServiceProvider\",\n                                 \"version\": \"2.0.0-M3\"\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+                            \"Client\",\n+                            \"HTTP\",\n+                            \"Web\"\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+                        \"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\": \"2.0.0-M3\"\n-                    },\n+                    }\n+                ],\n+                \"processors\": [],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"2.0.0-M3\"\n+        },\n+        {\n+            \"artifact\": \"nifi-update-attribute-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n+                \"processors\": [\n                     {\n                         \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-record-serialization-services-nar\",\n+                        \"artifact\": \"nifi-update-attribute-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\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 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+                        \"multiProcessorUseCases\": [],\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+                            \"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\": \"Environment variables 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\": \"Character Set\",\n-                                \"required\": true,\n+                                \"name\": \"Stateful Variables Initial Value\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"syslog-5424-reader-raw-message\": {\n+                            \"Store State\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"displayName\": \"Do not store state\",\n+                                        \"value\": \"Do not store state\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"displayName\": \"Store state locally\",\n+                                        \"value\": \"Store state locally\"\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\": \"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\": \"syslog-5424-reader-raw-message\",\n+                                \"name\": \"Store State\",\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\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-record-serialization-services-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"f2215c6\"\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+                            },\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\": \"Character Set\",\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Text\",\n+                                \"name\": \"canonical-value-lookup-cache-size\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"providedApiImplementations\": [\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-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n-                                \"version\": \"2.0.0-M3\"\n+                                \"description\": \"All successful FlowFiles are routed to this relationship\",\n+                                \"name\": \"success\"\n                             }\n                         ],\n-                        \"supportsDynamicProperties\": false,\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": true,\n+                        \"supportsDynamicRelationships\": false,\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+                            \"Attribute Expression Language\",\n+                            \"attributes\",\n+                            \"delete\",\n+                            \"modification\",\n+                            \"state\",\n+                            \"update\"\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\": \"2.0.0-M3\"\n-                    },\n-                    {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-record-serialization-services-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"f2215c6\"\n-                        },\n-                        \"group\": \"org.apache.nifi\",\n-                        \"providedApiImplementations\": [\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+                        \"useCases\": [\n                             {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n-                                \"version\": \"2.0.0-M3\"\n+                                \"configuration\": \"Leave \\\"Delete Attributes Expression\\\" and \\\"Stateful Variables Initial Value\\\" unset.\\nSet \\\"Store State\\\" to \\\"Do not store state\\\".\\n\\nAdd a new property. The name of the property will become the name of the newly added attribute.\\nThe value of the property will become the value of the newly added attribute. The value may use the NiFi Expression Language in order to reference other\\nattributes or call Expression Language functions.\\n\",\n+                                \"description\": \"Add a new FlowFile attribute\",\n+                                \"keywords\": [],\n+                                \"notes\": \"\"\n+                            },\n+                            {\n+                                \"configuration\": \"Leave \\\"Delete Attributes Expression\\\" and \\\"Stateful Variables Initial Value\\\" unset.\\nSet \\\"Store State\\\" to \\\"Do not store state\\\".\\n\\nAdd a new property. The name of the property will become the name of the attribute whose value will be overwritten.\\nThe value of the property will become the new value of the attribute. The value may use the NiFi Expression Language in order to reference other\\nattributes or call Expression Language functions.\\n\\nFor example, to change the `txId` attribute to the uppercase version of its current value, add a property named `txId` with a value of `${txId:toUpper()}`\\n\",\n+                                \"description\": \"Overwrite a FlowFile attribute with a new value\",\n+                                \"keywords\": [],\n+                                \"notes\": \"\"\n+                            },\n+                            {\n+                                \"configuration\": \"Leave \\\"Delete Attributes Expression\\\" and \\\"Stateful Variables Initial Value\\\" unset.\\nSet \\\"Store State\\\" to \\\"Do not store state\\\".\\n\\nAdd a new property whose name is `filename` and whose value is the desired filename.\\n\\nFor example, to set the filename to `abc.txt`, add a property named `filename` with a value of `abc.txt`.\\nTo add the `txId` attribute as a prefix to the filename, add a property named `filename` with a value of `${txId}${filename}`.\\nOr, to make the filename more readable, separate the txId from the rest of the filename with a hyphen by using a value of `${txId}-${filename}`.\\n\",\n+                                \"description\": \"Rename a file\",\n+                                \"keywords\": [],\n+                                \"notes\": \"\"\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\": \"2.0.0-M3\"\n-                    },\n+                        \"version\": \"2.0.0-M3\",\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\": \"2.0.0-M3\"\n+        },\n+        {\n+            \"artifact\": \"nifi-framework-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n+                \"processors\": [],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"2.0.0-M3\"\n+        },\n+        {\n+            \"artifact\": \"nifi-kafka-2-6-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-record-serialization-services-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-kafka-2-6-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\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\": \"ENVIRONMENT\",\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-                            \"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-                                \"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+                            \"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\": \"Timestamp Format\",\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"attribute_prefix\",\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"content_field_name\",\n-                                \"required\": false,\n+                                \"name\": \"ack.wait.time\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"parse_xml_attributes\": {\n+                            \"acks\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\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\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"true\",\n-                                \"dependencies\": [\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-                                        \"dependentValues\": [\n-                                            \"infer-schema\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\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-                                \"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+                                \"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\": \"parse_xml_attributes\",\n-                                \"required\": false,\n+                                \"name\": \"acks\",\n+                                \"required\": true,\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+                            \"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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"record_format\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"bootstrap.servers\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"schema-access-strategy\": {\n+                            \"compression.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+                                        \"description\": \"\",\n+                                        \"displayName\": \"none\",\n+                                        \"value\": \"none\"\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\": \"gzip\",\n+                                        \"value\": \"gzip\"\n                                     },\n                                     {\n-                                        \"description\": \"The schema reference information will be provided through a configured Schema Reference Reader service implementation.\",\n-                                        \"displayName\": \"Schema Reference Reader\",\n-                                        \"value\": \"schema-reference-reader\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"snappy\",\n+                                        \"value\": \"snappy\"\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\": \"\",\n+                                        \"displayName\": \"lz4\",\n+                                        \"value\": \"lz4\"\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\": \"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\": \"schema-access-strategy\",\n+                                \"name\": \"compression.type\",\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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"schema-branch\",\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+                            \"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\": \"schema-inference-cache\",\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.RecordSchemaCacheService\",\n+                                    \"type\": \"org.apache.nifi.kerberos.SelfContainedKerberosUserService\",\n                                     \"version\": \"2.0.0-M3\"\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+                            \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"schema-name\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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-                            \"schema-reference-reader\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"schema-reference-reader\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"Service implementation responsible for reading FlowFile attributes or content to determine the Schema Reference Identifier\",\n-                                \"displayName\": \"Schema Reference Reader\",\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\": \"schema-reference-reader\",\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.schemaregistry.services.SchemaReferenceReader\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n                                     \"version\": \"2.0.0-M3\"\n                                 }\n                             },\n-                            \"schema-registry\": {\n-                                \"dependencies\": [\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"sasl.kerberos.service.name\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"security.protocol\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"schema-reference-reader\",\n-                                            \"schema-name\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\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-                                \"description\": \"Specifies the Controller Service to use for the Schema Registry\",\n-                                \"displayName\": \"Schema Registry\",\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\": \"schema-registry\",\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.schemaregistry.services.SchemaRegistry\",\n+                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n                                     \"version\": \"2.0.0-M3\"\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\": \"Environment variables 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+                            \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"schema-version\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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.serialization.RecordReaderFactory\",\n+                                \"type\": \"org.apache.nifi.record.sink.RecordSinkService\",\n                                 \"version\": \"2.0.0-M3\"\n                             }\n                         ],\n-                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicProperties\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"parser\",\n-                            \"reader\",\n+                            \"kafka\",\n                             \"record\",\n-                            \"xml\"\n+                            \"sink\"\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.record.sink.kafka.KafkaRecordSink_2_6\",\n+                        \"typeDescription\": \"Provides a service to write records to a Kafka 2.6+ topic.\",\n                         \"version\": \"2.0.0-M3\"\n-                    },\n+                    }\n+                ],\n+                \"processors\": [\n                     {\n                         \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-record-serialization-services-nar\",\n+                        \"artifact\": \"nifi-kafka-2-6-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\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\": \"ENVIRONMENT\",\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+                        \"multiProcessorUseCases\": [],\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+                            \"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\": \"Date Format\",\n+                                \"name\": \"Commit Offsets\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Schema Reference Writer\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"schema-reference-writer\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Write Strategy\",\n-                                        \"propertyName\": \"Schema Write Strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"Service implementation responsible for writing FlowFile attributes or content header with Schema reference information\",\n-                                \"displayName\": \"Schema Reference Writer\",\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\": \"Schema Reference Writer\",\n+                                \"name\": \"Communications 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.schemaregistry.services.SchemaReferenceWriter\",\n-                                    \"version\": \"2.0.0-M3\"\n-                                }\n+                                \"sensitive\": false\n                             },\n-                            \"Schema Write Strategy\": {\n+                            \"auto.offset.reset\": {\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+                                        \"description\": \"Automatically reset the offset to the earliest offset\",\n+                                        \"displayName\": \"earliest\",\n+                                        \"value\": \"earliest\"\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\": \"Automatically reset the offset to the latest offset\",\n+                                        \"displayName\": \"latest\",\n+                                        \"value\": \"latest\"\n                                     },\n                                     {\n-                                        \"description\": \"The schema reference information will be written through a configured Schema Reference Writer service implementation.\",\n-                                        \"displayName\": \"Schema Reference Writer\",\n-                                        \"value\": \"schema-reference-writer\"\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\": \"no-schema\",\n-                                \"description\": \"Specifies how the schema for a Record should be added to the data.\",\n-                                \"displayName\": \"Schema Write Strategy\",\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\": \"Schema Write Strategy\",\n+                                \"name\": \"auto.offset.reset\",\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+                            \"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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Timestamp Format\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"aws.profile.name\",\n                                 \"required\": false,\n                                 \"sensitive\": false\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+                            \"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\": \"array_tag_name\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"bootstrap.servers\",\n+                                \"required\": true,\n                                 \"sensitive\": false\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+                            \"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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"array_wrapping\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"group.id\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"omit_xml_declaration\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n+                            \"header-name-regex\": {\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"dependentValues\": [\n+                                            \"USE_VALUE\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Output Strategy\",\n+                                        \"propertyName\": \"output-strategy\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Specifies whether or not to include XML declaration\",\n-                                \"displayName\": \"Omit XML Declaration\",\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\": \"omit_xml_declaration\",\n-                                \"required\": true,\n+                                \"name\": \"header-name-regex\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"pretty_print_xml\": {\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\": \"false\",\n-                                \"description\": \"Specifies whether or not the XML should be pretty printed\",\n-                                \"displayName\": \"Pretty Print XML\",\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\": \"pretty_print_xml\",\n+                                \"name\": \"honor-transactions\",\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-                            \"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+                            \"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\": \"root_tag_name\",\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.SelfContainedKerberosUserService\",\n+                                    \"version\": \"2.0.0-M3\"\n+                                }\n                             },\n-                            \"schema-access-strategy\": {\n+                            \"key-attribute-encoding\": {\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+                                        \"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 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\": \"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 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\": \"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\": \"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+                                \"defaultValue\": \"utf-8\",\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"schema-name\"\n+                                            \"USE_VALUE\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n+                                        \"propertyDisplayName\": \"Output Strategy\",\n+                                        \"propertyName\": \"output-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\": \"Environment variables 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+                                \"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\": \"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\": \"2.0.0-M3\"\n-                                }\n+                                \"name\": \"key-attribute-encoding\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             },\n-                            \"schema-name\": {\n-                                \"defaultValue\": \"${schema.name}\",\n-                                \"dependencies\": [\n+                            \"key-format\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"schema-name\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\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-                                \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"schema-name\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"schema-reference-reader\": {\n+                                \"defaultValue\": \"byte-array\",\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"schema-reference-reader\"\n+                                            \"USE_WRAPPER\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n+                                        \"propertyDisplayName\": \"Output Strategy\",\n+                                        \"propertyName\": \"output-strategy\"\n                                     }\n                                 ],\n-                                \"description\": \"Service implementation responsible for reading FlowFile attributes or content to determine the Schema Reference Identifier\",\n-                                \"displayName\": \"Schema Reference Reader\",\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\": \"schema-reference-reader\",\n+                                \"name\": \"key-format\",\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.SchemaReferenceReader\",\n-                                    \"version\": \"2.0.0-M3\"\n-                                }\n+                                \"sensitive\": false\n                             },\n-                            \"schema-registry\": {\n+                            \"key-record-reader\": {\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"schema-reference-reader\",\n-                                            \"schema-name\"\n+                                            \"record\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n+                                        \"propertyDisplayName\": \"Key Format\",\n+                                        \"propertyName\": \"key-format\"\n                                     }\n                                 ],\n-                                \"description\": \"Specifies the Controller Service to use for the Schema Registry\",\n-                                \"displayName\": \"Schema Registry\",\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\": \"schema-registry\",\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.schemaregistry.services.SchemaRegistry\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n                                     \"version\": \"2.0.0-M3\"\n                                 }\n                             },\n-                            \"schema-text\": {\n-                                \"defaultValue\": \"${avro.schema}\",\n+                            \"max-uncommit-offset-wait\": {\n+                                \"defaultValue\": \"1 secs\",\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"schema-text-property\"\n+                                            \"true\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n+                                        \"propertyDisplayName\": \"Commit Offsets\",\n+                                        \"propertyName\": \"Commit Offsets\"\n                                     }\n                                 ],\n-                                \"description\": \"The text of an Avro-formatted Schema\",\n-                                \"displayName\": \"Schema Text\",\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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"schema-text\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"max-uncommit-offset-wait\",\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.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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"schema-version\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"max.poll.records\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"suppress_nulls\": {\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\": \"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\": \"Write only the Kafka Record value to the FlowFile record.\",\n+                                        \"displayName\": \"Use Content as Value\",\n+                                        \"value\": \"USE_VALUE\"\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\": \"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\": \"never-suppress\",\n-                                \"description\": \"Specifies how the writer should handle a null field\",\n-                                \"displayName\": \"Suppress Null Values\",\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\": \"suppress_nulls\",\n+                                \"name\": \"output-strategy\",\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.RecordSetWriterFactory\",\n-                                \"version\": \"2.0.0-M3\"\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-                        ],\n-                        \"type\": \"org.apache.nifi.xml.XMLRecordSetWriter\",\n-                        \"typeDescription\": \"Writes a RecordSet to XML. The records are wrapped by a root tag.\",\n-                        \"version\": \"2.0.0-M3\"\n-                    },\n-                    {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-record-serialization-services-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"f2215c6\"\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+                            },\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\": \"Date Format\",\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\": \"2.0.0-M3\"\n+                                }\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+                            \"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\": \"Time Format\",\n-                                \"required\": false,\n-                                \"sensitive\": 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.serialization.RecordSetWriterFactory\",\n+                                    \"version\": \"2.0.0-M3\"\n+                                }\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+                            \"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\": \"Timestamp Format\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"sasl.kerberos.service.name\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"schema-access-strategy\": {\n+                            \"sasl.mechanism\": {\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+                                        \"description\": \"General Security Services API for Kerberos authentication\",\n+                                        \"displayName\": \"GSSAPI\",\n+                                        \"value\": \"GSSAPI\"\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\": \"Plain username and password authentication\",\n+                                        \"displayName\": \"PLAIN\",\n+                                        \"value\": \"PLAIN\"\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\": \"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\": \"The schema reference information will be provided through a configured Schema Reference Reader service implementation.\",\n-                                        \"displayName\": \"Schema Reference Reader\",\n-                                        \"value\": \"schema-reference-reader\"\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\": \"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\": \"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\": \"schema-access-strategy\",\n+                                \"name\": \"sasl.mechanism\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\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+                            \"sasl.password\": {\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"schema-reference-reader\",\n-                                            \"schema-name\",\n-                                            \"schema-text-property\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n-                                    },\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"NESTED_FIELD\"\n+                                            \"PLAIN\",\n+                                            \"SCRAM-SHA-512\",\n+                                            \"SCRAM-SHA-256\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Starting Field Strategy\",\n-                                        \"propertyName\": \"starting-field-strategy\"\n+                                        \"propertyDisplayName\": \"SASL Mechanism\",\n+                                        \"propertyName\": \"sasl.mechanism\"\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+                                \"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\": \"schema-application-strategy\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"sasl.password\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n                             },\n-                            \"schema-branch\": {\n-                                \"dependencies\": [\n+                            \"sasl.token.auth\": {\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 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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"schema-branch\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"schema-inference-cache\": {\n+                                \"defaultValue\": \"false\",\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"infer-schema\"\n+                                            \"SCRAM-SHA-512\",\n+                                            \"SCRAM-SHA-256\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n+                                        \"propertyDisplayName\": \"SASL Mechanism\",\n+                                        \"propertyName\": \"sasl.mechanism\"\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+                                \"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\": \"schema-inference-cache\",\n+                                \"name\": \"sasl.token.auth\",\n                                 \"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\": \"2.0.0-M3\"\n-                                }\n+                                \"sensitive\": false\n                             },\n-                            \"schema-name\": {\n-                                \"defaultValue\": \"${schema.name}\",\n+                            \"sasl.username\": {\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"schema-name\"\n+                                            \"PLAIN\",\n+                                            \"SCRAM-SHA-512\",\n+                                            \"SCRAM-SHA-256\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n+                                        \"propertyDisplayName\": \"SASL Mechanism\",\n+                                        \"propertyName\": \"sasl.mechanism\"\n                                     }\n                                 ],\n-                                \"description\": \"Specifies the name of the schema to lookup in the Schema Registry property\",\n-                                \"displayName\": \"Schema 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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"schema-name\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"sasl.username\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"schema-reference-reader\": {\n-                                \"dependencies\": [\n+                            \"security.protocol\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"schema-reference-reader\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\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-                                \"description\": \"Service implementation responsible for reading FlowFile attributes or content to determine the Schema Reference Identifier\",\n-                                \"displayName\": \"Schema Reference Reader\",\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\": \"schema-reference-reader\",\n+                                \"name\": \"security.protocol\",\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.SchemaReferenceReader\",\n-                                    \"version\": \"2.0.0-M3\"\n-                                }\n+                                \"sensitive\": false\n                             },\n-                            \"schema-registry\": {\n-                                \"dependencies\": [\n+                            \"separate-by-key\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"schema-reference-reader\",\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 Controller Service to use for the Schema Registry\",\n-                                \"displayName\": \"Schema Registry\",\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\": \"schema-registry\",\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.schemaregistry.services.SchemaRegistry\",\n+                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n                                     \"version\": \"2.0.0-M3\"\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\": \"Environment variables 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\": \"Environment variables 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+                            \"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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"starting-field-name\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"topic\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"starting-field-strategy\": {\n+                            \"topic_type\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Begins processing from the root node.\",\n-                                        \"displayName\": \"Root Node\",\n-                                        \"value\": \"ROOT_NODE\"\n+                                        \"description\": \"Topic is a full topic name or comma separated list of names\",\n+                                        \"displayName\": \"names\",\n+                                        \"value\": \"names\"\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+                                        \"description\": \"Topic is a regex using the Java Pattern syntax\",\n+                                        \"displayName\": \"pattern\",\n+                                        \"value\": \"pattern\"\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+                                \"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\": \"starting-field-strategy\",\n+                                \"name\": \"topic_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.serialization.RecordReaderFactory\",\n-                                \"version\": \"2.0.0-M3\"\n-                            }\n-                        ],\n                         \"seeAlso\": [\n-                            \"org.apache.nifi.json.JsonPathReader\"\n-                        ],\n-                        \"supportsDynamicProperties\": false,\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                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"parser\",\n-                            \"reader\",\n-                            \"record\",\n-                            \"tree\",\n-                            \"yaml\"\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-                        \"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\": \"2.0.0-M3\"\n-                    }\n-                ],\n-                \"processors\": [],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"2.0.0-M3\"\n-        },\n-        {\n-            \"artifact\": \"nifi-lookup-services-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [\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+                        \"useCases\": [],\n+                        \"version\": \"2.0.0-M3\",\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\": false,\n-                        \"artifact\": \"nifi-lookup-services-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-kafka-2-6-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n-                        \"explicitRestrictions\": [\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-                                \"explanation\": \"Provides operator the ability to read from any file that NiFi has access to.\",\n-                                \"requiredPermission\": \"read filesystem\"\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\": \"ENVIRONMENT\",\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+                        \"multiProcessorUseCases\": [],\n+                        \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"CSV Format\": {\n+                            \"Commit Offsets\": {\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+                                \"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\": \"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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Character Set\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Comment Marker\",\n+                                \"name\": \"Commit Offsets\",\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\": \"Environment variables 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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Quote Character\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\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-                                            \"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+                            \"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\": \"Quote Mode\",\n+                                \"name\": \"Communications Timeout\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Trim Fields\": {\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-                                    }\n-                                ],\n-                                \"defaultValue\": \"true\",\n-                                \"dependencies\": [\n+                                        \"description\": \"Automatically reset the offset to the latest offset\",\n+                                        \"displayName\": \"latest\",\n+                                        \"value\": \"latest\"\n+                                    },\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"custom\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"CSV Format\",\n-                                        \"propertyName\": \"CSV Format\"\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-                                \"description\": \"Whether or not white space should be removed from the beginning and end of fields\",\n-                                \"displayName\": \"Trim Fields\",\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\": \"Trim Fields\",\n+                                \"name\": \"auto.offset.reset\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Value Separator\": {\n-                                \"defaultValue\": \",\",\n+                            \"aws.profile.name\": {\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"custom\"\n+                                            \"AWS_MSK_IAM\"\n                                         ],\n-                                        \"propertyDisplayName\": \"CSV Format\",\n-                                        \"propertyName\": \"CSV Format\"\n+                                        \"propertyDisplayName\": \"SASL Mechanism\",\n+                                        \"propertyName\": \"sasl.mechanism\"\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\": \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Value Separator\",\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"bootstrap.servers\",\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+                            \"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\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"csv-file\",\n+                                \"name\": \"group.id\",\n                                 \"required\": true,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\"\n-                                    ]\n-                                },\n                                 \"sensitive\": false\n                             },\n-                            \"ignore-duplicates\": {\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\": \"Ignore duplicate keys for records in the CSV file.\",\n-                                \"displayName\": \"Ignore Duplicates\",\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\": \"ignore-duplicates\",\n+                                \"name\": \"honor-transactions\",\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+                            \"kerberos-user-service\": {\n+                                \"description\": \"Service supporting user authentication with Kerberos\",\n+                                \"displayName\": \"Kerberos User Service\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"lookup-key-column\",\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.RecordLookupService\",\n-                                \"version\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\n+                                }\n                             },\n-                            {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.lookup.LookupService\",\n-                                \"version\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-lookup-services-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"f2215c6\"\n-                        },\n-                        \"group\": \"org.apache.nifi\",\n-                        \"propertyDescriptors\": {\n-                            \"character-encoding\": {\n+                            \"key-attribute-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+                                        \"description\": \"The key is interpreted as a UTF-8 Encoded string.\",\n+                                        \"displayName\": \"UTF-8 Encoded\",\n+                                        \"value\": \"utf-8\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"UTF-16BE\",\n-                                        \"value\": \"UTF-16BE\"\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\": \"\",\n-                                        \"displayName\": \"US-ASCII\",\n-                                        \"value\": \"US-ASCII\"\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\": \"Specifies a character encoding to use.\",\n-                                \"displayName\": \"Character Encoding\",\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\": \"character-encoding\",\n+                                \"name\": \"key-attribute-encoding\",\n                                 \"required\": true,\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+                            \"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\": \"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\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\n+                                \"name\": \"max-uncommit-offset-wait\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n                             },\n-                            {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.lookup.LookupService\",\n-                                \"version\": \"2.0.0-M3\"\n-                            }\n-                        ],\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"cache\",\n-                            \"distributed\",\n-                            \"enrich\",\n-                            \"key\",\n-                            \"lookup\",\n-                            \"map\",\n-                            \"value\"\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\": \"2.0.0-M3\"\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-lookup-services-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"f2215c6\"\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+                            \"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\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"configuration-file\",\n-                                \"required\": true,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\"\n-                                    ]\n-                                },\n+                                \"name\": \"message-demarcator\",\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\": \"2.0.0-M3\"\n                             },\n-                            {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.lookup.LookupService\",\n-                                \"version\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\n-                    },\n-                    {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-lookup-services-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"f2215c6\"\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: 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+                            \"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\": \"proxy-configuration-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.proxy.ProxyConfigurationService\",\n-                                    \"version\": \"2.0.0-M3\"\n-                                }\n+                                \"sensitive\": false\n                             },\n-                            \"rest-lookup-authentication-strategy\": {\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"sasl.kerberos.service.name\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"sasl.mechanism\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"No Authentication\",\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\": \"Basic Authentication\",\n-                                        \"displayName\": \"Basic\",\n-                                        \"value\": \"BASIC\"\n+                                        \"description\": \"Plain username and password authentication\",\n+                                        \"displayName\": \"PLAIN\",\n+                                        \"value\": \"PLAIN\"\n                                     },\n                                     {\n-                                        \"description\": \"OAuth2 Authentication\",\n-                                        \"displayName\": \"OAuth2\",\n-                                        \"value\": \"OAUTH2\"\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\": \"Authentication strategy to use with REST service.\",\n-                                \"displayName\": \"Authentication Strategy\",\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\": \"rest-lookup-authentication-strategy\",\n+                                \"name\": \"sasl.mechanism\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"rest-lookup-basic-auth-password\": {\n+                            \"sasl.password\": {\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"BASIC\"\n+                                            \"PLAIN\",\n+                                            \"SCRAM-SHA-512\",\n+                                            \"SCRAM-SHA-256\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Authentication Strategy\",\n-                                        \"propertyName\": \"rest-lookup-authentication-strategy\"\n+                                        \"propertyDisplayName\": \"SASL Mechanism\",\n+                                        \"propertyName\": \"sasl.mechanism\"\n                                     }\n                                 ],\n-                                \"description\": \"The password to be used by the client to authenticate against the Remote URL.\",\n-                                \"displayName\": \"Basic Authentication Password\",\n+                                \"description\": \"Password provided with configured username when using PLAIN or SCRAM SASL Mechanisms\",\n+                                \"displayName\": \"Password\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"rest-lookup-basic-auth-password\",\n+                                \"name\": \"sasl.password\",\n                                 \"required\": false,\n                                 \"sensitive\": true\n                             },\n-                            \"rest-lookup-basic-auth-username\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"BASIC\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Authentication Strategy\",\n-                                        \"propertyName\": \"rest-lookup-authentication-strategy\"\n-                                    }\n-                                ],\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"rest-lookup-basic-auth-username\",\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"rest-lookup-connection-timeout\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"rest-lookup-digest-auth\": {\n+                            \"sasl.token.auth\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n@@ -22074,1275 +26579,893 @@\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n                                 \"defaultValue\": \"false\",\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"BASIC\"\n+                                            \"SCRAM-SHA-512\",\n+                                            \"SCRAM-SHA-256\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Authentication Strategy\",\n-                                        \"propertyName\": \"rest-lookup-authentication-strategy\"\n+                                        \"propertyDisplayName\": \"SASL Mechanism\",\n+                                        \"propertyName\": \"sasl.mechanism\"\n                                     }\n                                 ],\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+                                \"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\": \"rest-lookup-digest-auth\",\n+                                \"name\": \"sasl.token.auth\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"rest-lookup-oauth2-access-token-provider\": {\n+                            \"sasl.username\": {\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"OAUTH2\"\n+                                            \"PLAIN\",\n+                                            \"SCRAM-SHA-512\",\n+                                            \"SCRAM-SHA-256\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Authentication Strategy\",\n-                                        \"propertyName\": \"rest-lookup-authentication-strategy\"\n+                                        \"propertyDisplayName\": \"SASL Mechanism\",\n+                                        \"propertyName\": \"sasl.mechanism\"\n                                     }\n                                 ],\n-                                \"description\": \"Enables managed retrieval of OAuth2 Bearer Token applied to HTTP requests using the Authorization Header.\",\n-                                \"displayName\": \"OAuth2 Access Token Provider\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"rest-lookup-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\": \"2.0.0-M3\"\n-                                }\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"rest-lookup-read-timeout\",\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+                                \"description\": \"Username provided with configured password when using PLAIN or SCRAM SASL Mechanisms\",\n+                                \"displayName\": \"Username\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"rest-lookup-record-path\",\n+                                \"name\": \"sasl.username\",\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+                            \"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\": \"rest-lookup-record-reader\",\n+                                \"name\": \"security.protocol\",\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\": \"2.0.0-M3\"\n-                                }\n+                                \"sensitive\": false\n                             },\n-                            \"rest-lookup-response-handling-strategy\": {\n+                            \"separate-by-key\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Successful and unsuccessful HTTP responses are returned.\",\n-                                        \"displayName\": \"Returned\",\n-                                        \"value\": \"RETURNED\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n-                                        \"description\": \"Successful HTTP responses are returned and unsuccessful HTTP responses generate an exception.\",\n-                                        \"displayName\": \"Evaluated\",\n-                                        \"value\": \"EVALUATED\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"RETURNED\",\n-                                \"description\": \"Whether to return all responses or throw errors for unsuccessful HTTP status codes.\",\n-                                \"displayName\": \"Response Handling Strategy\",\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\": \"rest-lookup-response-handling-strategy\",\n-                                \"required\": true,\n+                                \"name\": \"separate-by-key\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"rest-lookup-ssl-context-service\": {\n-                                \"description\": \"The SSL Context Service used to provide client certificate information for TLS/SSL connections.\",\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\": \"rest-lookup-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\": \"2.0.0-M3\"\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+                            \"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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"rest-lookup-url\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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-                        \"providedApiImplementations\": [\n-                            {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.lookup.RecordLookupService\",\n-                                \"version\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\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-                        \"supportsSensitiveDynamicProperties\": true,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"http\",\n-                            \"json\",\n-                            \"lookup\",\n-                            \"rest\",\n-                            \"xml\"\n+                            \"2.6\",\n+                            \"Consume\",\n+                            \"Get\",\n+                            \"Ingest\",\n+                            \"Ingress\",\n+                            \"Kafka\",\n+                            \"PubSub\",\n+                            \"Topic\"\n                         ],\n-                        \"type\": \"org.apache.nifi.lookup.RestLookupService\",\n-                        \"typeDescription\": \"Use a REST service to look up values.\",\n-                        \"version\": \"2.0.0-M3\"\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+                        \"useCases\": [],\n+                        \"version\": \"2.0.0-M3\",\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\": false,\n-                        \"artifact\": \"nifi-lookup-services-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-kafka-2-6-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n-                        \"explicitRestrictions\": [\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-                                \"explanation\": \"Provides operator the ability to read from any file that NiFi has access to.\",\n-                                \"requiredPermission\": \"read filesystem\"\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\": \"ENVIRONMENT\",\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+                        \"multiProcessorUseCases\": [],\n+                        \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"CSV Format\": {\n+                            \"Failure Strategy\": {\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\": \"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\": \"Same as RFC 4180. Available for compatibility reasons.\",\n-                                        \"displayName\": \"RFC4180\",\n-                                        \"value\": \"RFC4180\"\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\": \"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\": \"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\": \"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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Character Set\",\n+                                \"name\": \"Failure Strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Comment Marker\": {\n-                                \"dependencies\": [\n+                            \"Record Metadata Strategy\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"custom\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"CSV Format\",\n-                                        \"propertyName\": \"CSV Format\"\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-                                \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Comment Marker\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Escape Character\": {\n-                                \"defaultValue\": \"\\\\\",\n+                                \"defaultValue\": \"Use Configured Values\",\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"custom\"\n+                                            \"USE_WRAPPER\"\n                                         ],\n-                                        \"propertyDisplayName\": \"CSV Format\",\n-                                        \"propertyName\": \"CSV Format\"\n+                                        \"propertyDisplayName\": \"Publish Strategy\",\n+                                        \"propertyName\": \"publish-strategy\"\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\": \"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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Escape Character\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Record Metadata Strategy\",\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+                            \"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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Quote Character\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"ack.wait.time\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Quote Mode\": {\n+                            \"acks\": {\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+                                        \"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\": \"Values will be quoted unless the value is a number.\",\n-                                        \"displayName\": \"Quote Non-Numeric Values\",\n-                                        \"value\": \"NON_NUMERIC\"\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\": \"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\": \"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-                                \"description\": \"Specifies how fields should be quoted when they are written\",\n-                                \"displayName\": \"Quote 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\": \"Quote Mode\",\n+                                \"name\": \"acks\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\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+                            \"attribute-name-regex\": {\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"custom\"\n+                                            \"USE_VALUE\"\n                                         ],\n-                                        \"propertyDisplayName\": \"CSV Format\",\n-                                        \"propertyName\": \"CSV Format\"\n+                                        \"propertyDisplayName\": \"Publish Strategy\",\n+                                        \"propertyName\": \"publish-strategy\"\n                                     }\n                                 ],\n-                                \"description\": \"Whether or not white space should be removed from the beginning and end of fields\",\n-                                \"displayName\": \"Trim Fields\",\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\": \"Trim Fields\",\n-                                \"required\": true,\n+                                \"name\": \"attribute-name-regex\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Value Separator\": {\n-                                \"defaultValue\": \",\",\n+                            \"aws.profile.name\": {\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"custom\"\n+                                            \"AWS_MSK_IAM\"\n                                         ],\n-                                        \"propertyDisplayName\": \"CSV Format\",\n-                                        \"propertyName\": \"CSV Format\"\n+                                        \"propertyDisplayName\": \"SASL Mechanism\",\n+                                        \"propertyName\": \"sasl.mechanism\"\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\": \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Value Separator\",\n-                                \"required\": true,\n+                                \"name\": \"aws.profile.name\",\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+                            \"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\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"csv-file\",\n+                                \"name\": \"bootstrap.servers\",\n                                 \"required\": true,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\"\n-                                    ]\n-                                },\n                                 \"sensitive\": false\n                             },\n-                            \"ignore-duplicates\": {\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\": \"Ignore duplicate keys for records in the CSV file.\",\n-                                \"displayName\": \"Ignore Duplicates\",\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\": \"ignore-duplicates\",\n+                                \"name\": \"compression.type\",\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+                            \"kerberos-user-service\": {\n+                                \"description\": \"Service supporting user authentication with Kerberos\",\n+                                \"displayName\": \"Kerberos User Service\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"lookup-key-column\",\n-                                \"required\": true,\n-                                \"sensitive\": 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\": \"2.0.0-M3\"\n+                                }\n                             },\n-                            \"lookup-value-column\": {\n-                                \"description\": \"Lookup value column.\",\n-                                \"displayName\": \"Lookup Value Column\",\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\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"lookup-value-column\",\n+                                \"name\": \"max.block.ms\",\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.StringLookupService\",\n-                                \"version\": \"2.0.0-M3\"\n-                            },\n-                            {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.lookup.LookupService\",\n-                                \"version\": \"2.0.0-M3\"\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-                        ],\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\": \"2.0.0-M3\"\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-lookup-services-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"f2215c6\"\n-                        },\n-                        \"dynamicProperties\": [\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\": \"ENVIRONMENT\",\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-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.lookup.StringLookupService\",\n-                                \"version\": \"2.0.0-M3\"\n                             },\n-                            {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.lookup.LookupService\",\n-                                \"version\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-lookup-services-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"f2215c6\"\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+                            \"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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"configuration-file\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"max.request.size\",\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\": \"2.0.0-M3\"\n                             },\n-                            {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.lookup.LookupService\",\n-                                \"version\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-lookup-services-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"f2215c6\"\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+                            \"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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Cache Expiration\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"message-header-encoding\",\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+                            \"message-key-field\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"USE_VALUE\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Publish Strategy\",\n+                                        \"propertyName\": \"publish-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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"dbf-default-precision\",\n-                                \"required\": true,\n+                                \"name\": \"message-key-field\",\n+                                \"required\": false,\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+                            \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"dbf-default-scale\",\n-                                \"required\": true,\n+                                \"name\": \"partition\",\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+                            \"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 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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"dbrecord-lookup-cache-size\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"partitioner.class\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"dbrecord-lookup-clear-cache-on-enabled\": {\n+                            \"publish-strategy\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\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\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\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\": \"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\": \"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\": \"dbrecord-lookup-clear-cache-on-enabled\",\n+                                \"name\": \"publish-strategy\",\n                                 \"required\": true,\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+                            \"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                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"dbrecord-lookup-dbcp-service\",\n-                                \"required\": true,\n+                                \"name\": \"record-key-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\": \"2.0.0-M3\"\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"dbrecord-lookup-key-column\",\n-                                \"required\": true,\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables 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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"dbrecord-lookup-value-columns\",\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.RecordLookupService\",\n-                                \"version\": \"2.0.0-M3\"\n-                            },\n-                            {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.lookup.LookupService\",\n-                                \"version\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-lookup-services-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"f2215c6\"\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Cache Expiration\",\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"\",\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+                            \"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\": \"dbrecord-lookup-clear-cache-on-enabled\",\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\": \"2.0.0-M3\"\n+                                }\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+                            \"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\": \"dbrecord-lookup-dbcp-service\",\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.dbcp.DBCPService\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n                                     \"version\": \"2.0.0-M3\"\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"dbrecord-lookup-key-column\",\n-                                \"required\": true,\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"dbrecord-lookup-table-name\",\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"lookup-value-column\",\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.StringLookupService\",\n-                                \"version\": \"2.0.0-M3\"\n-                            },\n-                            {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.lookup.LookupService\",\n-                                \"version\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\n-                    },\n-                    {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-lookup-services-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"f2215c6\"\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+                            \"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\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"database-file\",\n-                                \"required\": true,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\"\n-                                    ]\n-                                },\n+                                \"name\": \"sasl.kerberos.service.name\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"lookup-anonymous-ip\": {\n+                            \"sasl.mechanism\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"description\": \"General Security Services API for Kerberos authentication\",\n+                                        \"displayName\": \"GSSAPI\",\n+                                        \"value\": \"GSSAPI\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\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\": \"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+                                \"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\": \"lookup-anonymous-ip\",\n+                                \"name\": \"sasl.mechanism\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"lookup-city\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n+                            \"sasl.password\": {\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\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\": \"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+                                \"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\": \"lookup-city\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"sasl.password\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n                             },\n-                            \"lookup-connection-type\": {\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\": \"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+                                \"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\": \"lookup-connection-type\",\n-                                \"required\": true,\n+                                \"name\": \"sasl.token.auth\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"lookup-domain\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n+                            \"sasl.username\": {\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\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\": \"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+                                \"description\": \"Username provided with configured password when using PLAIN or SCRAM SASL Mechanisms\",\n+                                \"displayName\": \"Username\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"lookup-domain\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"sasl.username\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"lookup-isp\": {\n+                            \"security.protocol\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"displayName\": \"PLAINTEXT\",\n+                                        \"value\": \"PLAINTEXT\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\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\": \"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+                                \"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\": \"lookup-isp\",\n+                                \"name\": \"security.protocol\",\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.RecordLookupService\",\n-                                \"version\": \"2.0.0-M3\"\n                             },\n-                            {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.lookup.LookupService\",\n-                                \"version\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\n-                    }\n-                ],\n-                \"processors\": [],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"2.0.0-M3\"\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\": \"f2215c6\"\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+                            \"ssl.context.service\": {\n+                                \"description\": \"Service supporting SSL communication with Kafka brokers\",\n+                                \"displayName\": \"SSL Context Service\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Kerberos Keytab\",\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\": \"2.0.0-M3\"\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\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"topic\",\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+                            \"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\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\n-                    }\n-                ],\n-                \"processors\": [],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"2.0.0-M3\"\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\": \"f2215c6\"\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-                        \"multiProcessorUseCases\": [],\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+                                \"name\": \"transactional-id-prefix\",\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+                            \"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\": \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Value to track\",\n+                                \"name\": \"use-transactions\",\n                                 \"required\": true,\n                                 \"sensitive\": false\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+                        ],\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+                                \"description\": \"FlowFiles for which all content was sent to Kafka.\",\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+                                \"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                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"Attribute Expression Language\",\n-                            \"data science\",\n-                            \"rolling\",\n-                            \"state\",\n-                            \"window\"\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-                        \"triggerSerially\": true,\n+                        \"triggerSerially\": false,\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+                        \"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                         \"useCases\": [],\n                         \"version\": \"2.0.0-M3\",\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+                                \"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-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"2.0.0-M3\"\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+                        \"artifact\": \"nifi-kafka-2-6-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -23352,762 +27475,355 @@\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+                                \"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\": \"ENVIRONMENT\",\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                         \"multiProcessorUseCases\": [],\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\": \"Environment variables 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+                            \"Failure Strategy\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Do not store state\",\n-                                        \"value\": \"Do not store state\"\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\": \"Store state locally\",\n-                                        \"value\": \"Store state locally\"\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\": \"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-                        ],\n-                        \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": true,\n-                        \"supportsDynamicRelationships\": false,\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-                        \"useCases\": [\n-                            {\n-                                \"configuration\": \"Leave \\\"Delete Attributes Expression\\\" and \\\"Stateful Variables Initial Value\\\" unset.\\nSet \\\"Store State\\\" to \\\"Do not store state\\\".\\n\\nAdd a new property. The name of the property will become the name of the newly added attribute.\\nThe value of the property will become the value of the newly added attribute. The value may use the NiFi Expression Language in order to reference other\\nattributes or call Expression Language functions.\\n\",\n-                                \"description\": \"Add a new FlowFile attribute\",\n-                                \"keywords\": [],\n-                                \"notes\": \"\"\n-                            },\n-                            {\n-                                \"configuration\": \"Leave \\\"Delete Attributes Expression\\\" and \\\"Stateful Variables Initial Value\\\" unset.\\nSet \\\"Store State\\\" to \\\"Do not store state\\\".\\n\\nAdd a new property. The name of the property will become the name of the attribute whose value will be overwritten.\\nThe value of the property will become the new value of the attribute. The value may use the NiFi Expression Language in order to reference other\\nattributes or call Expression Language functions.\\n\\nFor example, to change the `txId` attribute to the uppercase version of its current value, add a property named `txId` with a value of `${txId:toUpper()}`\\n\",\n-                                \"description\": \"Overwrite a FlowFile attribute with a new value\",\n-                                \"keywords\": [],\n-                                \"notes\": \"\"\n-                            },\n-                            {\n-                                \"configuration\": \"Leave \\\"Delete Attributes Expression\\\" and \\\"Stateful Variables Initial Value\\\" unset.\\nSet \\\"Store State\\\" to \\\"Do not store state\\\".\\n\\nAdd a new property whose name is `filename` and whose value is the desired filename.\\n\\nFor example, to set the filename to `abc.txt`, add a property named `filename` with a value of `abc.txt`.\\nTo add the `txId` attribute as a prefix to the filename, add a property named `filename` with a value of `${txId}${filename}`.\\nOr, to make the filename more readable, separate the txId from the rest of the filename with a hyphen by using a value of `${txId}-${filename}`.\\n\",\n-                                \"description\": \"Rename a file\",\n-                                \"keywords\": [],\n-                                \"notes\": \"\"\n-                            }\n-                        ],\n-                        \"version\": \"2.0.0-M3\",\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\": \"2.0.0-M3\"\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\": \"f2215c6\"\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"authentication-charset\",\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"connection-attempt-timeout\",\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"connection-timeout\",\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"custom-authorization\",\n-                                \"required\": false,\n-                                \"sensitive\": true\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+                                \"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\": \"input-buffer-size\",\n+                                \"name\": \"Failure Strategy\",\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+                            \"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\": \"max-binary-message-size\",\n+                                \"name\": \"ack.wait.time\",\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+                            \"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\": \"max-text-message-size\",\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"proxy-host\",\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"proxy-port\",\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"session-maintenance-interval\",\n+                                \"name\": \"acks\",\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+                            \"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\": \"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\": \"2.0.0-M3\"\n-                                }\n-                            },\n-                            \"user-name\": {\n-                                \"description\": \"The user name for Basic Authentication.\",\n-                                \"displayName\": \"User Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"user-name\",\n+                                \"name\": \"attribute-name-regex\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"user-password\": {\n-                                \"description\": \"The user password for Basic Authentication.\",\n-                                \"displayName\": \"User Password\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"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+                            \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"websocket-uri\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            }\n-                        },\n-                        \"providedApiImplementations\": [\n-                            {\n-                                \"artifact\": \"nifi-websocket-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.websocket.WebSocketClientService\",\n-                                \"version\": \"2.0.0-M3\"\n-                            },\n-                            {\n-                                \"artifact\": \"nifi-websocket-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.websocket.WebSocketService\",\n-                                \"version\": \"2.0.0-M3\"\n-                            }\n-                        ],\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"Jetty\",\n-                            \"WebSocket\",\n-                            \"client\"\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\": \"2.0.0-M3\"\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-websocket-services-jetty-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"f2215c6\"\n-                        },\n-                        \"group\": \"org.apache.nifi\",\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"auth-path-spec\",\n+                                \"name\": \"aws.profile.name\",\n                                 \"required\": false,\n                                 \"sensitive\": false\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+                            \"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\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"auth-roles\",\n-                                \"required\": false,\n+                                \"name\": \"bootstrap.servers\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"basic-auth\": {\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-                                    }\n-                                ],\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\": \"basic-auth\",\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+                                        \"displayName\": \"gzip\",\n+                                        \"value\": \"gzip\"\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+                                        \"description\": \"\",\n+                                        \"displayName\": \"snappy\",\n+                                        \"value\": \"snappy\"\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+                                        \"description\": \"\",\n+                                        \"displayName\": \"lz4\",\n+                                        \"value\": \"lz4\"\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+                                \"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\": \"client-authentication\",\n+                                \"name\": \"compression.type\",\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+                            \"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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"input-buffer-size\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"kafka-key\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"listen-port\": {\n-                                \"description\": \"The port number on which this WebSocketServer listens to.\",\n-                                \"displayName\": \"Listen Port\",\n+                            \"kerberos-user-service\": {\n+                                \"description\": \"Service supporting user authentication with Kerberos\",\n+                                \"displayName\": \"Kerberos User Service\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"listen-port\",\n-                                \"required\": true,\n-                                \"sensitive\": 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\": \"2.0.0-M3\"\n+                                }\n                             },\n-                            \"login-service\": {\n+                            \"key-attribute-encoding\": {\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+                                        \"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\": \"hash\",\n-                                \"description\": \"Specify which Login Service to use for Basic Authentication.\",\n-                                \"displayName\": \"Login Service\",\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\": \"login-service\",\n-                                \"required\": false,\n+                                \"name\": \"key-attribute-encoding\",\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+                            \"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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"max-binary-message-size\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"max.block.ms\",\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+                            \"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-text-message-size\",\n+                                \"name\": \"max.request.size\",\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-                                \"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\": \"2.0.0-M3\"\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+                            \"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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"users-properties-file\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"message-demarcator\",\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-websocket-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.websocket.WebSocketServerService\",\n-                                \"version\": \"2.0.0-M3\"\n                             },\n-                            {\n-                                \"artifact\": \"nifi-websocket-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.websocket.WebSocketService\",\n-                                \"version\": \"2.0.0-M3\"\n-                            }\n-                        ],\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"Jetty\",\n-                            \"WebSocket\",\n-                            \"server\"\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\": \"2.0.0-M3\"\n-                    }\n-                ],\n-                \"processors\": [],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"2.0.0-M3\"\n-        },\n-        {\n-            \"artifact\": \"nifi-jetty-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [],\n-                \"processors\": [],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"2.0.0-M3\"\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\": \"f2215c6\"\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-                        \"multiProcessorUseCases\": [],\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+                            \"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\": \"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\": \"2.0.0-M3\"\n-                                }\n+                                \"name\": \"message-header-encoding\",\n+                                \"required\": false,\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+                            \"partition\": {\n+                                \"description\": \"Specifies which Partition Records will go to.\",\n+                                \"displayName\": \"Partition\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"read-timeout\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"partition\",\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+                            \"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\": \"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\": \"2.0.0-M3\"\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"salesforce-api-version\",\n-                                \"required\": true,\n+                                \"name\": \"partitioner.class\",\n+                                \"required\": false,\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+                            \"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\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"salesforce-url\",\n-                                \"required\": true,\n+                                \"name\": \"sasl.kerberos.service.name\",\n+                                \"required\": false,\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-                            }\n-                        ],\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.salesforce.QuerySalesforceObject\"\n-                        ],\n-                        \"sideEffectFree\": false,\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"For FlowFiles created as a result of a successful execution.\",\n-                                \"name\": \"success\"\n                             },\n-                            {\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-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"put\",\n-                            \"salesforce\",\n-                            \"sobject\"\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-                        \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"The error message returned by Salesforce.\",\n-                                \"name\": \"error.message\"\n-                            }\n-                        ]\n-                    },\n-                    {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-salesforce-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"f2215c6\"\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_ALLOWED\",\n-                        \"multiProcessorUseCases\": [],\n-                        \"primaryNodeOnly\": false,\n-                        \"propertyDescriptors\": {\n-                            \"age-delay\": {\n-                                \"dependencies\": [\n+                            \"sasl.mechanism\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"propertyDisplayName\": \"Age Field\",\n-                                        \"propertyName\": \"age-field\"\n+                                        \"description\": \"General Security Services API for Kerberos authentication\",\n+                                        \"displayName\": \"GSSAPI\",\n+                                        \"value\": \"GSSAPI\"\n                                     },\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"property-based-query\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Query Type\",\n-                                        \"propertyName\": \"query-type\"\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-                                \"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+                                \"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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"age-delay\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"sasl.mechanism\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"age-field\": {\n+                            \"sasl.password\": {\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"property-based-query\"\n+                                            \"PLAIN\",\n+                                            \"SCRAM-SHA-512\",\n+                                            \"SCRAM-SHA-256\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Query Type\",\n-                                        \"propertyName\": \"query-type\"\n+                                        \"propertyDisplayName\": \"SASL Mechanism\",\n+                                        \"propertyName\": \"sasl.mechanism\"\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+                                \"description\": \"Password provided with configured username when using PLAIN or SCRAM SASL Mechanisms\",\n+                                \"displayName\": \"Password\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"age-field\",\n+                                \"name\": \"sasl.password\",\n                                 \"required\": false,\n-                                \"sensitive\": false\n+                                \"sensitive\": true\n                             },\n-                            \"create-zero-record-files\": {\n+                            \"sasl.token.auth\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n@@ -24116,1541 +27832,2087 @@\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n                                 \"defaultValue\": \"false\",\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"property-based-query\"\n+                                            \"SCRAM-SHA-512\",\n+                                            \"SCRAM-SHA-256\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Query Type\",\n-                                        \"propertyName\": \"query-type\"\n+                                        \"propertyDisplayName\": \"SASL Mechanism\",\n+                                        \"propertyName\": \"sasl.mechanism\"\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+                                \"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\": \"create-zero-record-files\",\n-                                \"required\": true,\n-                                \"sensitive\": false\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"custom-soql-query\",\n-                                \"required\": true,\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"custom-where-condition\",\n+                                \"name\": \"sasl.token.auth\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"field-names\": {\n+                            \"sasl.username\": {\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"property-based-query\"\n+                                            \"PLAIN\",\n+                                            \"SCRAM-SHA-512\",\n+                                            \"SCRAM-SHA-256\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Query Type\",\n-                                        \"propertyName\": \"query-type\"\n+                                        \"propertyDisplayName\": \"SASL Mechanism\",\n+                                        \"propertyName\": \"sasl.mechanism\"\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+                                \"description\": \"Username provided with configured password when using PLAIN or SCRAM SASL Mechanisms\",\n+                                \"displayName\": \"Username\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"field-names\",\n+                                \"name\": \"sasl.username\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"initial-age-filter\": {\n-                                \"dependencies\": [\n+                            \"security.protocol\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"propertyDisplayName\": \"Age Field\",\n-                                        \"propertyName\": \"age-field\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"PLAINTEXT\",\n+                                        \"value\": \"PLAINTEXT\"\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"initial-age-filter\",\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\": \"2.0.0-M3\"\n-                                }\n-                            },\n-                            \"query-type\": {\n-                                \"allowableValues\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SSL\",\n+                                        \"value\": \"SSL\"\n+                                    },\n                                     {\n-                                        \"description\": \"Provide query by properties.\",\n-                                        \"displayName\": \"Property Based Query\",\n-                                        \"value\": \"property-based-query\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SASL_PLAINTEXT\",\n+                                        \"value\": \"SASL_PLAINTEXT\"\n                                     },\n                                     {\n-                                        \"description\": \"Provide custom SOQL query.\",\n-                                        \"displayName\": \"Custom Query\",\n-                                        \"value\": \"custom-query\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SASL_SSL\",\n+                                        \"value\": \"SASL_SSL\"\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+                                \"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\": \"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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"read-timeout\",\n+                                \"name\": \"security.protocol\",\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+                            \"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\": \"record-writer\",\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.RecordSetWriterFactory\",\n+                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n                                     \"version\": \"2.0.0-M3\"\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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+                            \"topic\": {\n+                                \"description\": \"The name of the Kafka Topic to publish to.\",\n+                                \"displayName\": \"Topic Name\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"salesforce-url\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"topic\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"sobject-name\": {\n+                            \"transactional-id-prefix\": {\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"property-based-query\"\n+                                            \"true\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Query Type\",\n-                                        \"propertyName\": \"query-type\"\n+                                        \"propertyDisplayName\": \"Use Transactions\",\n+                                        \"propertyName\": \"use-transactions\"\n                                     }\n                                 ],\n-                                \"description\": \"The Salesforce sObject to be queried\",\n-                                \"displayName\": \"sObject Name\",\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\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"sobject-name\",\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-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.salesforce.PutSalesforceObject\"\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-                        \"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 for which all content was sent to Kafka.\",\n                                 \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"The input flowfile gets sent to this relationship when the query fails.\",\n+                                \"description\": \"Any FlowFile that cannot be sent to Kafka will be routed to this 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+                        \"supportsDynamicProperties\": true,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"query\",\n-                            \"salesforce\",\n-                            \"sobject\",\n-                            \"soql\"\n+                            \"2.6\",\n+                            \"Apache\",\n+                            \"Kafka\",\n+                            \"Message\",\n+                            \"PubSub\",\n+                            \"Put\",\n+                            \"Send\"\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.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                         \"useCases\": [],\n                         \"version\": \"2.0.0-M3\",\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\": \"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\": \"2.0.0-M3\"\n         },\n         {\n-            \"artifact\": \"nifi-geohash-nar\",\n+            \"artifact\": \"nifi-aws-nar\",\n             \"componentManifest\": {\n-                \"controllerServices\": [],\n-                \"processors\": [\n+                \"controllerServices\": [\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-geohash-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-aws-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\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-                        \"multiProcessorUseCases\": [],\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+                            \"aws-credentials-provider-service\": {\n+                                \"description\": \"The Controller Service that is used to obtain AWS credentials provider\",\n+                                \"displayName\": \"AWS Credentials Provider Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"geohash-format\",\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"geohash-level\",\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"geohash-record-path\",\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"latitude-record-path\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n+                                \"name\": \"aws-credentials-provider-service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-aws-service-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.processors.aws.credentials.provider.service.AWSCredentialsProviderService\",\n+                                    \"version\": \"2.0.0-M3\"\n+                                }\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+                            \"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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"longitude-record-path\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"cache-expiration\",\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 to encode latitude/longitude to geohash or decode geohash to latitude/longitude\",\n-                                \"displayName\": \"Mode\",\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\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"mode\",\n+                                \"name\": \"cache-size\",\n                                 \"required\": true,\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+                            \"communications-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\": \"record-reader\",\n+                                \"name\": \"communications-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\": \"2.0.0-M3\"\n-                                }\n+                                \"sensitive\": false\n                             },\n-                            \"record-writer\": {\n-                                \"description\": \"Specifies the record writer service to use for writing data\",\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\",\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\": \"2.0.0-M3\"\n                                 }\n                             },\n-                            \"routing-strategy\": {\n+                            \"region\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SKIP\",\n-                                        \"value\": \"SKIP\"\n+                                        \"description\": \"AWS Region Code : us-gov-east-1\",\n+                                        \"displayName\": \"AWS GovCloud (US-East)\",\n+                                        \"value\": \"us-gov-east-1\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SPLIT\",\n-                                        \"value\": \"SPLIT\"\n+                                        \"description\": \"AWS Region Code : us-gov-west-1\",\n+                                        \"displayName\": \"AWS GovCloud (US-West)\",\n+                                        \"value\": \"us-gov-west-1\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"REQUIRE\",\n-                                        \"value\": \"REQUIRE\"\n+                                        \"description\": \"AWS Region Code : af-south-1\",\n+                                        \"displayName\": \"Africa (Cape Town)\",\n+                                        \"value\": \"af-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-east-1\",\n+                                        \"displayName\": \"Asia Pacific (Hong Kong)\",\n+                                        \"value\": \"ap-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-south-2\",\n+                                        \"displayName\": \"Asia Pacific (Hyderabad)\",\n+                                        \"value\": \"ap-south-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-southeast-3\",\n+                                        \"displayName\": \"Asia Pacific (Jakarta)\",\n+                                        \"value\": \"ap-southeast-3\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-southeast-4\",\n+                                        \"displayName\": \"Asia Pacific (Melbourne)\",\n+                                        \"value\": \"ap-southeast-4\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-south-1\",\n+                                        \"displayName\": \"Asia Pacific (Mumbai)\",\n+                                        \"value\": \"ap-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-northeast-3\",\n+                                        \"displayName\": \"Asia Pacific (Osaka)\",\n+                                        \"value\": \"ap-northeast-3\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-northeast-2\",\n+                                        \"displayName\": \"Asia Pacific (Seoul)\",\n+                                        \"value\": \"ap-northeast-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-southeast-1\",\n+                                        \"displayName\": \"Asia Pacific (Singapore)\",\n+                                        \"value\": \"ap-southeast-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-southeast-2\",\n+                                        \"displayName\": \"Asia Pacific (Sydney)\",\n+                                        \"value\": \"ap-southeast-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-northeast-1\",\n+                                        \"displayName\": \"Asia Pacific (Tokyo)\",\n+                                        \"value\": \"ap-northeast-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ca-central-1\",\n+                                        \"displayName\": \"Canada (Central)\",\n+                                        \"value\": \"ca-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ca-west-1\",\n+                                        \"displayName\": \"Canada West (Calgary)\",\n+                                        \"value\": \"ca-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : cn-north-1\",\n+                                        \"displayName\": \"China (Beijing)\",\n+                                        \"value\": \"cn-north-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : cn-northwest-1\",\n+                                        \"displayName\": \"China (Ningxia)\",\n+                                        \"value\": \"cn-northwest-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-central-1\",\n+                                        \"displayName\": \"Europe (Frankfurt)\",\n+                                        \"value\": \"eu-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-west-1\",\n+                                        \"displayName\": \"Europe (Ireland)\",\n+                                        \"value\": \"eu-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-west-2\",\n+                                        \"displayName\": \"Europe (London)\",\n+                                        \"value\": \"eu-west-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-south-1\",\n+                                        \"displayName\": \"Europe (Milan)\",\n+                                        \"value\": \"eu-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-west-3\",\n+                                        \"displayName\": \"Europe (Paris)\",\n+                                        \"value\": \"eu-west-3\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-south-2\",\n+                                        \"displayName\": \"Europe (Spain)\",\n+                                        \"value\": \"eu-south-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-north-1\",\n+                                        \"displayName\": \"Europe (Stockholm)\",\n+                                        \"value\": \"eu-north-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-central-2\",\n+                                        \"displayName\": \"Europe (Zurich)\",\n+                                        \"value\": \"eu-central-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : il-central-1\",\n+                                        \"displayName\": \"Israel (Tel Aviv)\",\n+                                        \"value\": \"il-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : me-south-1\",\n+                                        \"displayName\": \"Middle East (Bahrain)\",\n+                                        \"value\": \"me-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : me-central-1\",\n+                                        \"displayName\": \"Middle East (UAE)\",\n+                                        \"value\": \"me-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : sa-east-1\",\n+                                        \"displayName\": \"South America (Sao Paulo)\",\n+                                        \"value\": \"sa-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-east-1\",\n+                                        \"displayName\": \"US East (N. Virginia)\",\n+                                        \"value\": \"us-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-east-2\",\n+                                        \"displayName\": \"US East (Ohio)\",\n+                                        \"value\": \"us-east-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-iso-east-1\",\n+                                        \"displayName\": \"US ISO East\",\n+                                        \"value\": \"us-iso-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-iso-west-1\",\n+                                        \"displayName\": \"US ISO WEST\",\n+                                        \"value\": \"us-iso-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-isob-east-1\",\n+                                        \"displayName\": \"US ISOB East (Ohio)\",\n+                                        \"value\": \"us-isob-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-west-1\",\n+                                        \"displayName\": \"US West (N. California)\",\n+                                        \"value\": \"us-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-west-2\",\n+                                        \"displayName\": \"US West (Oregon)\",\n+                                        \"value\": \"us-west-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-cn-global\",\n+                                        \"displayName\": \"aws-cn-global\",\n+                                        \"value\": \"aws-cn-global\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-global\",\n+                                        \"displayName\": \"aws-global\",\n+                                        \"value\": \"aws-global\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-iso-b-global\",\n+                                        \"displayName\": \"aws-iso-b-global\",\n+                                        \"value\": \"aws-iso-b-global\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-iso-global\",\n+                                        \"displayName\": \"aws-iso-global\",\n+                                        \"value\": \"aws-iso-global\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-us-gov-global\",\n+                                        \"displayName\": \"aws-us-gov-global\",\n+                                        \"value\": \"aws-us-gov-global\"\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\": \"us-west-2\",\n+                                \"description\": \"The region of the cloud resources\",\n+                                \"displayName\": \"Region\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"routing-strategy\",\n+                                \"name\": \"region\",\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                             },\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-                        ],\n-                        \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\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-                        \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"The MIME type indicated by the record writer\",\n-                                \"name\": \"mime.type\"\n+                            \"schema-registry-name\": {\n+                                \"description\": \"The name of the Schema Registry\",\n+                                \"displayName\": \"Schema Registry Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"schema-registry-name\",\n+                                \"required\": true,\n+                                \"sensitive\": false\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\": \"2.0.0-M3\"\n-        },\n-        {\n-            \"artifact\": \"nifi-server-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [],\n-                \"processors\": [],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"2.0.0-M3\"\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\": \"f2215c6\"\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.schemaregistry.services.SchemaReferenceReader\",\n-                                \"version\": \"2.0.0-M3\"\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\": \"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\": \"2.0.0-M3\"\n+                                }\n                             }\n-                        ],\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"avro\",\n-                            \"confluent\",\n-                            \"kafka\",\n-                            \"registry\",\n-                            \"schema\"\n-                        ],\n-                        \"type\": \"org.apache.nifi.confluent.schemaregistry.ConfluentEncodedSchemaReferenceReader\",\n-                        \"typeDescription\": \"Reads Schema Identifier according to Confluent encoding as a header consisting of a byte marker and an integer represented as four bytes\",\n-                        \"version\": \"2.0.0-M3\"\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-confluent-platform-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"f2215c6\"\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.schemaregistry.services.SchemaReferenceWriter\",\n+                                \"type\": \"org.apache.nifi.schemaregistry.services.SchemaRegistry\",\n                                 \"version\": \"2.0.0-M3\"\n                             }\n                         ],\n                         \"supportsDynamicProperties\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n                             \"avro\",\n-                            \"confluent\",\n-                            \"kafka\",\n+                            \"aws\",\n+                            \"glue\",\n                             \"registry\",\n                             \"schema\"\n                         ],\n-                        \"type\": \"org.apache.nifi.confluent.schemaregistry.ConfluentEncodedSchemaReferenceWriter\",\n-                        \"typeDescription\": \"Writes Schema Identifier according to Confluent encoding as a header consisting of a byte marker and an integer represented as four bytes\",\n+                        \"type\": \"org.apache.nifi.aws.schemaregistry.AmazonGlueSchemaRegistry\",\n+                        \"typeDescription\": \"Provides a Schema Registry that interacts with the AWS Glue Schema Registry so that those Schemas that are stored in the Glue Schema Registry can be used in NiFi. When a Schema is looked up by name by this registry, it will find a Schema in the Glue Schema Registry with their names.\",\n                         \"version\": \"2.0.0-M3\"\n                     },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-confluent-platform-nar\",\n+                        \"artifact\": \"nifi-aws-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n-                        \"dynamicProperties\": [\n+                        \"explicitRestrictions\": [\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+                                \"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-                            \"authentication-type\": {\n+                            \"Access Key\": {\n+                                \"description\": \"\",\n+                                \"displayName\": \"Access Key ID\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Access Key\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n+                            },\n+                            \"Assume Role ARN\": {\n+                                \"description\": \"The AWS Role ARN for cross account access. This is used in conjunction with Assume Role Session Name and other Assume Role properties.\",\n+                                \"displayName\": \"Assume Role ARN\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Assume Role ARN\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Assume Role Session Name\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"propertyDisplayName\": \"Assume Role ARN\",\n+                                        \"propertyName\": \"Assume Role ARN\"\n+                                    }\n+                                ],\n+                                \"description\": \"The AWS Role Session Name for cross account access. This is used in conjunction with Assume Role ARN.\",\n+                                \"displayName\": \"Assume Role Session Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Assume Role Session Name\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Credentials File\": {\n+                                \"description\": \"Path to a file containing AWS access key and secret key in properties file format.\",\n+                                \"displayName\": \"Credentials File\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Credentials File\",\n+                                \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"SINGLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\"\n+                                    ]\n+                                },\n+                                \"sensitive\": false\n+                            },\n+                            \"Secret Key\": {\n+                                \"description\": \"\",\n+                                \"displayName\": \"Secret Access Key\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Secret Key\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n+                            },\n+                            \"Session Time\": {\n+                                \"defaultValue\": \"3600\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"propertyDisplayName\": \"Assume Role ARN\",\n+                                        \"propertyName\": \"Assume Role ARN\"\n+                                    }\n+                                ],\n+                                \"description\": \"Session time for role based session (between 900 and 3600 seconds). This is used in conjunction with Assume Role ARN.\",\n+                                \"displayName\": \"Assume Role Session Time\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Session Time\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"anonymous-credentials\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"BASIC\",\n-                                        \"value\": \"BASIC\"\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\": \"NONE\",\n-                                \"description\": \"HTTP Client Authentication Type for Confluent Schema Registry\",\n-                                \"displayName\": \"Authentication Type\",\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"If true, uses Anonymous credentials\",\n+                                \"displayName\": \"Use Anonymous Credentials\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"authentication-type\",\n+                                \"name\": \"anonymous-credentials\",\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+                            \"assume-role-external-id\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"propertyDisplayName\": \"Assume Role ARN\",\n+                                        \"propertyName\": \"Assume Role ARN\"\n+                                    }\n+                                ],\n+                                \"description\": \"External ID for cross-account access. This is used in conjunction with Assume Role ARN.\",\n+                                \"displayName\": \"Assume Role External ID\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"cache-expiration\",\n-                                \"required\": true,\n+                                \"name\": \"assume-role-external-id\",\n+                                \"required\": false,\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+                            \"assume-role-proxy-host\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"propertyDisplayName\": \"Assume Role ARN\",\n+                                        \"propertyName\": \"Assume Role ARN\"\n+                                    }\n+                                ],\n+                                \"description\": \"Proxy host for cross-account access, if needed within your environment. This will configure a proxy to request for temporary access keys into another AWS account.\",\n+                                \"displayName\": \"Assume Role Proxy Host\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"cache-size\",\n-                                \"required\": true,\n+                                \"name\": \"assume-role-proxy-host\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"password\": {\n+                            \"assume-role-proxy-port\": {\n                                 \"dependencies\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"BASIC\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Authentication Type\",\n-                                        \"propertyName\": \"authentication-type\"\n+                                        \"propertyDisplayName\": \"Assume Role ARN\",\n+                                        \"propertyName\": \"Assume Role ARN\"\n                                     }\n                                 ],\n-                                \"description\": \"Password for authentication to Confluent Schema Registry\",\n-                                \"displayName\": \"Password\",\n+                                \"description\": \"Proxy port for cross-account access, if needed within your environment. This will configure a proxy to request for temporary access keys into another AWS account.\",\n+                                \"displayName\": \"Assume Role Proxy Port\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"password\",\n+                                \"name\": \"assume-role-proxy-port\",\n                                 \"required\": false,\n-                                \"sensitive\": true\n+                                \"sensitive\": false\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+                            \"assume-role-ssl-context-service\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"propertyDisplayName\": \"Assume Role ARN\",\n+                                        \"propertyName\": \"Assume Role ARN\"\n+                                    }\n+                                ],\n+                                \"description\": \"SSL Context Service used when connecting to the STS Endpoint.\",\n+                                \"displayName\": \"Assume Role SSL Context Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"ssl-context\",\n+                                \"name\": \"assume-role-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\": \"2.0.0-M3\"\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"url\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"username\": {\n+                            \"assume-role-sts-endpoint\": {\n                                 \"dependencies\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"BASIC\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Authentication Type\",\n-                                        \"propertyName\": \"authentication-type\"\n+                                        \"propertyDisplayName\": \"Assume Role ARN\",\n+                                        \"propertyName\": \"Assume Role ARN\"\n                                     }\n                                 ],\n-                                \"description\": \"Username for authentication to Confluent Schema Registry\",\n-                                \"displayName\": \"Username\",\n+                                \"description\": \"The default AWS Security Token Service (STS) endpoint (\\\"sts.amazonaws.com\\\") works for all accounts that are not for China (Beijing) region or GovCloud. You only need to set this property to \\\"sts.cn-north-1.amazonaws.com.cn\\\" when you are requesting session credentials for services in China(Beijing) region or to \\\"sts.us-gov-west-1.amazonaws.com\\\" for GovCloud.\",\n+                                \"displayName\": \"Assume Role STS Endpoint Override\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"username\",\n+                                \"name\": \"assume-role-sts-endpoint\",\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\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\n-                    }\n-                ],\n-                \"processors\": [],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"2.0.0-M3\"\n-        },\n-        {\n-            \"artifact\": \"nifi-image-viewer-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [],\n-                \"processors\": [],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"2.0.0-M3\"\n-        },\n-        {\n-            \"artifact\": \"nifi-opentelemetry-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [],\n-                \"processors\": [\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-opentelemetry-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"f2215c6\"\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-                        \"multiProcessorUseCases\": [],\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Address\",\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+                            \"assume-role-sts-region\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-south-2\",\n+                                        \"displayName\": \"Asia Pacific (Hyderabad)\",\n+                                        \"value\": \"ap-south-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-south-1\",\n+                                        \"displayName\": \"Asia Pacific (Mumbai)\",\n+                                        \"value\": \"ap-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-south-1\",\n+                                        \"displayName\": \"Europe (Milan)\",\n+                                        \"value\": \"eu-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-south-2\",\n+                                        \"displayName\": \"Europe (Spain)\",\n+                                        \"value\": \"eu-south-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-gov-east-1\",\n+                                        \"displayName\": \"AWS GovCloud (US-East)\",\n+                                        \"value\": \"us-gov-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : me-central-1\",\n+                                        \"displayName\": \"Middle East (UAE)\",\n+                                        \"value\": \"me-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : il-central-1\",\n+                                        \"displayName\": \"Israel (Tel Aviv)\",\n+                                        \"value\": \"il-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ca-central-1\",\n+                                        \"displayName\": \"Canada (Central)\",\n+                                        \"value\": \"ca-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-central-1\",\n+                                        \"displayName\": \"Europe (Frankfurt)\",\n+                                        \"value\": \"eu-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-iso-west-1\",\n+                                        \"displayName\": \"US ISO WEST\",\n+                                        \"value\": \"us-iso-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-central-2\",\n+                                        \"displayName\": \"Europe (Zurich)\",\n+                                        \"value\": \"eu-central-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-west-1\",\n+                                        \"displayName\": \"US West (N. California)\",\n+                                        \"value\": \"us-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-west-2\",\n+                                        \"displayName\": \"US West (Oregon)\",\n+                                        \"value\": \"us-west-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : af-south-1\",\n+                                        \"displayName\": \"Africa (Cape Town)\",\n+                                        \"value\": \"af-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-north-1\",\n+                                        \"displayName\": \"Europe (Stockholm)\",\n+                                        \"value\": \"eu-north-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-west-3\",\n+                                        \"displayName\": \"Europe (Paris)\",\n+                                        \"value\": \"eu-west-3\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-west-2\",\n+                                        \"displayName\": \"Europe (London)\",\n+                                        \"value\": \"eu-west-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-west-1\",\n+                                        \"displayName\": \"Europe (Ireland)\",\n+                                        \"value\": \"eu-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-northeast-3\",\n+                                        \"displayName\": \"Asia Pacific (Osaka)\",\n+                                        \"value\": \"ap-northeast-3\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-northeast-2\",\n+                                        \"displayName\": \"Asia Pacific (Seoul)\",\n+                                        \"value\": \"ap-northeast-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-northeast-1\",\n+                                        \"displayName\": \"Asia Pacific (Tokyo)\",\n+                                        \"value\": \"ap-northeast-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : me-south-1\",\n+                                        \"displayName\": \"Middle East (Bahrain)\",\n+                                        \"value\": \"me-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : sa-east-1\",\n+                                        \"displayName\": \"South America (Sao Paulo)\",\n+                                        \"value\": \"sa-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-east-1\",\n+                                        \"displayName\": \"Asia Pacific (Hong Kong)\",\n+                                        \"value\": \"ap-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : cn-north-1\",\n+                                        \"displayName\": \"China (Beijing)\",\n+                                        \"value\": \"cn-north-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ca-west-1\",\n+                                        \"displayName\": \"Canada West (Calgary)\",\n+                                        \"value\": \"ca-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-gov-west-1\",\n+                                        \"displayName\": \"AWS GovCloud (US-West)\",\n+                                        \"value\": \"us-gov-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-southeast-1\",\n+                                        \"displayName\": \"Asia Pacific (Singapore)\",\n+                                        \"value\": \"ap-southeast-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-southeast-2\",\n+                                        \"displayName\": \"Asia Pacific (Sydney)\",\n+                                        \"value\": \"ap-southeast-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-iso-east-1\",\n+                                        \"displayName\": \"US ISO East\",\n+                                        \"value\": \"us-iso-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-southeast-3\",\n+                                        \"displayName\": \"Asia Pacific (Jakarta)\",\n+                                        \"value\": \"ap-southeast-3\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-southeast-4\",\n+                                        \"displayName\": \"Asia Pacific (Melbourne)\",\n+                                        \"value\": \"ap-southeast-4\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-east-1\",\n+                                        \"displayName\": \"US East (N. Virginia)\",\n+                                        \"value\": \"us-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-east-2\",\n+                                        \"displayName\": \"US East (Ohio)\",\n+                                        \"value\": \"us-east-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : cn-northwest-1\",\n+                                        \"displayName\": \"China (Ningxia)\",\n+                                        \"value\": \"cn-northwest-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-isob-east-1\",\n+                                        \"displayName\": \"US ISOB East (Ohio)\",\n+                                        \"value\": \"us-isob-east-1\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"us-west-2\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"propertyDisplayName\": \"Assume Role ARN\",\n+                                        \"propertyName\": \"Assume Role ARN\"\n+                                    }\n+                                ],\n+                                \"description\": \"The AWS Security Token Service (STS) region\",\n+                                \"displayName\": \"Assume Role STS Region\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Batch Size\",\n-                                \"required\": true,\n+                                \"name\": \"assume-role-sts-region\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Client Authentication\": {\n+                            \"assume-role-sts-signer-override\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"WANT\",\n-                                        \"value\": \"WANT\"\n+                                        \"displayName\": \"Default Signature\",\n+                                        \"value\": \"Default Signature\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"REQUIRED\",\n-                                        \"value\": \"REQUIRED\"\n+                                        \"displayName\": \"Signature Version 4\",\n+                                        \"value\": \"AWS4SignerType\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"NONE\",\n-                                        \"value\": \"NONE\"\n+                                        \"displayName\": \"Custom Signature\",\n+                                        \"value\": \"CustomSignerType\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"WANT\",\n-                                \"description\": \"Client authentication policy for TLS communication with HTTPS\",\n-                                \"displayName\": \"Client Authentication\",\n+                                \"defaultValue\": \"Default Signature\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"propertyDisplayName\": \"Assume Role ARN\",\n+                                        \"propertyName\": \"Assume Role ARN\"\n+                                    }\n+                                ],\n+                                \"description\": \"The AWS STS library uses Signature Version 4 by default. This property allows you to plug in your own custom signer implementation.\",\n+                                \"displayName\": \"Assume Role STS Signer Override\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Client Authentication\",\n-                                \"required\": true,\n+                                \"name\": \"assume-role-sts-signer-override\",\n+                                \"required\": false,\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+                            \"custom-signer-class-name\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"CustomSignerType\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Assume Role STS Signer Override\",\n+                                        \"propertyName\": \"assume-role-sts-signer-override\"\n+                                    }\n+                                ],\n+                                \"description\": \"Fully qualified class name of the custom signer class. The signer must implement com.amazonaws.auth.Signer interface.\",\n+                                \"displayName\": \"Custom Signer Class Name\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Port\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"custom-signer-class-name\",\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+                            \"custom-signer-module-location\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"CustomSignerType\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Assume Role STS Signer Override\",\n+                                        \"propertyName\": \"assume-role-sts-signer-override\"\n+                                    }\n+                                ],\n+                                \"description\": \"Comma-separated list of paths to files and/or directories which contain the custom signer's JAR file and its dependencies (if any).\",\n+                                \"displayName\": \"Custom Signer Module Location\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Queue Capacity\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"custom-signer-module-location\",\n+                                \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"MULTIPLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\",\n+                                        \"DIRECTORY\"\n+                                    ]\n+                                },\n                                 \"sensitive\": false\n                             },\n-                            \"SSL Context Service\": {\n-                                \"description\": \"SSL Context Service enables TLS communication for HTTPS\",\n-                                \"displayName\": \"SSL Context Service\",\n+                            \"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 the Default Credential chain, including EC2 instance profiles or roles, environment variables, default user credentials, etc.\",\n+                                \"displayName\": \"Use Default Credentials\",\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\": \"2.0.0-M3\"\n-                                }\n+                                \"name\": \"default-credentials\",\n+                                \"required\": false,\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+                            \"profile-name\": {\n+                                \"description\": \"The AWS profile name for credentials from the profile configuration file.\",\n+                                \"displayName\": \"Profile Name\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Worker Threads\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"profile-name\",\n+                                \"required\": false,\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-aws-service-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.processors.aws.credentials.provider.service.AWSCredentialsProviderService\",\n+                                \"version\": \"2.0.0-M3\"\n+                            },\n+                            {\n+                                \"artifact\": \"nifi-aws-service-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.processors.aws.credentials.provider.AwsCredentialsProviderService\",\n+                                \"version\": \"2.0.0-M3\"\n                             }\n                         ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": false,\n+                        \"restricted\": true,\n                         \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"OTLP\",\n-                            \"OTel\",\n-                            \"OpenTelemetry\",\n-                            \"logs\",\n-                            \"metrics\",\n-                            \"telemetry\",\n-                            \"traces\"\n+                            \"aws\",\n+                            \"credentials\",\n+                            \"provider\"\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-                        \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\",\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\": \"2.0.0-M3\"\n-        },\n-        {\n-            \"artifact\": \"nifi-hubspot-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [],\n-                \"processors\": [\n+                        \"type\": \"org.apache.nifi.processors.aws.credentials.provider.service.AWSCredentialsProviderControllerService\",\n+                        \"typeDescription\": \"Defines credentials for Amazon Web Services processors. Uses default credentials without configuration. Default credentials support EC2 instance profile/role, default user profile, environment variables, etc. Additional options include access key / secret key pairs, credentials file, named profile, and assume role credentials.\",\n+                        \"version\": \"2.0.0-M3\"\n+                    },\n                     {\n                         \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-hubspot-nar\",\n+                        \"artifact\": \"nifi-aws-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\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\": \"10 sec\",\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n-                        \"multiProcessorUseCases\": [],\n-                        \"primaryNodeOnly\": true,\n                         \"propertyDescriptors\": {\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\": \"access-token\",\n-                                \"required\": true,\n-                                \"sensitive\": true\n-                            },\n-                            \"incremental-delay\": {\n-                                \"defaultValue\": \"30 sec\",\n-                                \"dependencies\": [\n+                            \"encryption-strategy\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"true\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Incremental Loading\",\n-                                        \"propertyName\": \"is-incremental\"\n+                                        \"description\": \"No encryption.\",\n+                                        \"displayName\": \"None\",\n+                                        \"value\": \"NONE\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Use server-side, S3-managed encryption.\",\n+                                        \"displayName\": \"Server-side S3\",\n+                                        \"value\": \"SSE_S3\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Use server-side, KMS key to perform encryption.\",\n+                                        \"displayName\": \"Server-side KMS\",\n+                                        \"value\": \"SSE_KMS\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Use server-side, customer-supplied key to perform encryption.\",\n+                                        \"displayName\": \"Server-side Customer Key\",\n+                                        \"value\": \"SSE_C\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Use client-side, KMS key to perform encryption.\",\n+                                        \"displayName\": \"Client-side KMS\",\n+                                        \"value\": \"CSE_KMS\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Use client-side, customer-supplied key to perform encryption.\",\n+                                        \"displayName\": \"Client-side Customer Key\",\n+                                        \"value\": \"CSE_C\"\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+                                \"defaultValue\": \"NONE\",\n+                                \"description\": \"Strategy to use for S3 data encryption and decryption.\",\n+                                \"displayName\": \"Encryption Strategy\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"incremental-delay\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"encryption-strategy\",\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+                            \"key-id-or-key-material\": {\n+                                \"description\": \"For None and Server-side S3: not used. For Server-side KMS and Client-side KMS: the KMS Key ID must be configured. For Server-side Customer Key and Client-side Customer Key: the Key Material must be specified in Base64 encoded form. In case of Server-side Customer Key, the key must be an AES-256 key. In case of Client-side Customer Key, it can be an AES-256, AES-192 or AES-128 key.\",\n+                                \"displayName\": \"Key ID or Key Material\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"incremental-initial-start-time\",\n+                                \"name\": \"key-id-or-key-material\",\n                                 \"required\": false,\n-                                \"sensitive\": false\n+                                \"sensitive\": true\n                             },\n-                            \"is-incremental\": {\n+                            \"kms-region\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"description\": \"AWS Region Code : us-gov-west-1\",\n+                                        \"displayName\": \"AWS GovCloud (US)\",\n+                                        \"value\": \"us-gov-west-1\"\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\": \"is-incremental\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"object-type\": {\n-                                \"allowableValues\": [\n+                                        \"description\": \"AWS Region Code : us-gov-east-1\",\n+                                        \"displayName\": \"AWS GovCloud (US-East)\",\n+                                        \"value\": \"us-gov-east-1\"\n+                                    },\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+                                        \"description\": \"AWS Region Code : us-east-1\",\n+                                        \"displayName\": \"US East (N. Virginia)\",\n+                                        \"value\": \"us-east-1\"\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+                                        \"description\": \"AWS Region Code : us-east-2\",\n+                                        \"displayName\": \"US East (Ohio)\",\n+                                        \"value\": \"us-east-2\"\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+                                        \"description\": \"AWS Region Code : us-west-1\",\n+                                        \"displayName\": \"US West (N. California)\",\n+                                        \"value\": \"us-west-1\"\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+                                        \"description\": \"AWS Region Code : us-west-2\",\n+                                        \"displayName\": \"US West (Oregon)\",\n+                                        \"value\": \"us-west-2\"\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+                                        \"description\": \"AWS Region Code : eu-west-1\",\n+                                        \"displayName\": \"EU (Ireland)\",\n+                                        \"value\": \"eu-west-1\"\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+                                        \"description\": \"AWS Region Code : eu-west-2\",\n+                                        \"displayName\": \"EU (London)\",\n+                                        \"value\": \"eu-west-2\"\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+                                        \"description\": \"AWS Region Code : eu-west-3\",\n+                                        \"displayName\": \"EU (Paris)\",\n+                                        \"value\": \"eu-west-3\"\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+                                        \"description\": \"AWS Region Code : eu-central-1\",\n+                                        \"displayName\": \"EU (Frankfurt)\",\n+                                        \"value\": \"eu-central-1\"\n                                     },\n                                     {\n-                                        \"description\": \"Get emails on CRM records.\",\n-                                        \"displayName\": \"Emails\",\n-                                        \"value\": \"/crm/v3/objects/emails\"\n+                                        \"description\": \"AWS Region Code : eu-central-2\",\n+                                        \"displayName\": \"EU (Zurich)\",\n+                                        \"value\": \"eu-central-2\"\n                                     },\n                                     {\n-                                        \"description\": \"Get meetings on CRM records.\",\n-                                        \"displayName\": \"Meetings\",\n-                                        \"value\": \"/crm/v3/objects/meetings\"\n+                                        \"description\": \"AWS Region Code : eu-north-1\",\n+                                        \"displayName\": \"EU (Stockholm)\",\n+                                        \"value\": \"eu-north-1\"\n                                     },\n                                     {\n-                                        \"description\": \"Get notes on CRM records.\",\n-                                        \"displayName\": \"Notes\",\n-                                        \"value\": \"/crm/v3/objects/notes\"\n+                                        \"description\": \"AWS Region Code : eu-south-1\",\n+                                        \"displayName\": \"EU (Milan)\",\n+                                        \"value\": \"eu-south-1\"\n                                     },\n                                     {\n-                                        \"description\": \"Get tasks on CRM records.\",\n-                                        \"displayName\": \"Tasks\",\n-                                        \"value\": \"/crm/v3/objects/tasks\"\n+                                        \"description\": \"AWS Region Code : eu-south-2\",\n+                                        \"displayName\": \"EU (Spain)\",\n+                                        \"value\": \"eu-south-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-east-1\",\n+                                        \"displayName\": \"Asia Pacific (Hong Kong)\",\n+                                        \"value\": \"ap-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-south-1\",\n+                                        \"displayName\": \"Asia Pacific (Mumbai)\",\n+                                        \"value\": \"ap-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-south-2\",\n+                                        \"displayName\": \"Asia Pacific (Hyderabad)\",\n+                                        \"value\": \"ap-south-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-southeast-1\",\n+                                        \"displayName\": \"Asia Pacific (Singapore)\",\n+                                        \"value\": \"ap-southeast-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-southeast-2\",\n+                                        \"displayName\": \"Asia Pacific (Sydney)\",\n+                                        \"value\": \"ap-southeast-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-southeast-3\",\n+                                        \"displayName\": \"Asia Pacific (Jakarta)\",\n+                                        \"value\": \"ap-southeast-3\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-southeast-4\",\n+                                        \"displayName\": \"Asia Pacific (Melbourne)\",\n+                                        \"value\": \"ap-southeast-4\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-northeast-1\",\n+                                        \"displayName\": \"Asia Pacific (Tokyo)\",\n+                                        \"value\": \"ap-northeast-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-northeast-2\",\n+                                        \"displayName\": \"Asia Pacific (Seoul)\",\n+                                        \"value\": \"ap-northeast-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-northeast-3\",\n+                                        \"displayName\": \"Asia Pacific (Osaka)\",\n+                                        \"value\": \"ap-northeast-3\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : sa-east-1\",\n+                                        \"displayName\": \"South America (Sao Paulo)\",\n+                                        \"value\": \"sa-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : cn-north-1\",\n+                                        \"displayName\": \"China (Beijing)\",\n+                                        \"value\": \"cn-north-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : cn-northwest-1\",\n+                                        \"displayName\": \"China (Ningxia)\",\n+                                        \"value\": \"cn-northwest-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ca-central-1\",\n+                                        \"displayName\": \"Canada (Central)\",\n+                                        \"value\": \"ca-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ca-west-1\",\n+                                        \"displayName\": \"Canada West (Calgary)\",\n+                                        \"value\": \"ca-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : me-central-1\",\n+                                        \"displayName\": \"Middle East (UAE)\",\n+                                        \"value\": \"me-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : me-south-1\",\n+                                        \"displayName\": \"Middle East (Bahrain)\",\n+                                        \"value\": \"me-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : af-south-1\",\n+                                        \"displayName\": \"Africa (Cape Town)\",\n+                                        \"value\": \"af-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-iso-east-1\",\n+                                        \"displayName\": \"US ISO East\",\n+                                        \"value\": \"us-iso-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-isob-east-1\",\n+                                        \"displayName\": \"US ISOB East (Ohio)\",\n+                                        \"value\": \"us-isob-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-iso-west-1\",\n+                                        \"displayName\": \"US ISO West\",\n+                                        \"value\": \"us-iso-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : il-central-1\",\n+                                        \"displayName\": \"Israel (Tel Aviv)\",\n+                                        \"value\": \"il-central-1\"\n                                     }\n                                 ],\n-                                \"description\": \"The HubSpot Object Type requested\",\n-                                \"displayName\": \"Object Type\",\n+                                \"defaultValue\": \"us-west-2\",\n+                                \"description\": \"The Region of the AWS Key Management Service. Only used in case of Client-side KMS.\",\n+                                \"displayName\": \"KMS Region\",\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"result-limit\",\n+                                \"name\": \"kms-region\",\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-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.web.client.provider.api.WebClientServiceProvider\",\n-                                    \"version\": \"2.0.0-M3\"\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+                        \"providedApiImplementations\": [\n                             {\n-                                \"description\": \"For FlowFiles created as a result of a successful HTTP request.\",\n-                                \"name\": \"success\"\n+                                \"artifact\": \"nifi-aws-service-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.processors.aws.s3.AmazonS3EncryptionService\",\n+                                \"version\": \"2.0.0-M3\"\n                             }\n                         ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"hubspot\"\n+                            \"aws\",\n+                            \"decrypt\",\n+                            \"decryption\",\n+                            \"encrypt\",\n+                            \"encryption\",\n+                            \"key\",\n+                            \"s3\",\n+                            \"service\"\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-                        \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\",\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\": \"2.0.0-M3\"\n-        },\n-        {\n-            \"artifact\": \"nifi-oauth2-provider-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [\n+                        \"type\": \"org.apache.nifi.processors.aws.s3.encryption.StandardS3EncryptionService\",\n+                        \"typeDescription\": \"Adds configurable encryption to S3 Put and S3 Fetch operations.\",\n+                        \"version\": \"2.0.0-M3\"\n+                    },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-oauth2-provider-nar\",\n+                        \"artifact\": \"nifi-aws-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"group\": \"org.apache.nifi\",\n                         \"propertyDescriptors\": {\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\": \"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+                            \"AWS Credentials Provider service\": {\n+                                \"description\": \"The Controller Service that is used to obtain AWS credentials provider\",\n+                                \"displayName\": \"AWS Credentials Provider Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"HTTP Protocols\",\n+                                \"name\": \"AWS Credentials Provider service\",\n                                 \"required\": true,\n-                                \"sensitive\": false\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-aws-service-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.processors.aws.credentials.provider.service.AWSCredentialsProviderService\",\n+                                    \"version\": \"2.0.0-M3\"\n+                                }\n                             },\n-                            \"audience\": {\n-                                \"description\": \"Audience for the access token request defined in RFC 8693 Section 2.1\",\n-                                \"displayName\": \"Audience\",\n+                            \"Bucket\": {\n+                                \"defaultValue\": \"${s3.bucket}\",\n+                                \"description\": \"The S3 Bucket to interact with\",\n+                                \"displayName\": \"Bucket\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"audience\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Bucket\",\n+                                \"required\": true,\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+                            \"Object Key\": {\n+                                \"defaultValue\": \"${filename}\",\n+                                \"description\": \"The S3 Object Key to use. This is analogous to a filename for traditional file systems.\",\n+                                \"displayName\": \"Object Key\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"authorization-server-url\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Object Key\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"client-authentication-strategy\": {\n+                            \"Region\": {\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\": \"AWS Region Code : us-gov-west-1\",\n+                                        \"displayName\": \"AWS GovCloud (US)\",\n+                                        \"value\": \"us-gov-west-1\"\n                                     },\n                                     {\n-                                        \"description\": \"Send client authentication using HTTP Basic authentication.\",\n-                                        \"displayName\": \"BASIC_AUTHENTICATION\",\n-                                        \"value\": \"BASIC_AUTHENTICATION\"\n+                                        \"description\": \"AWS Region Code : us-gov-east-1\",\n+                                        \"displayName\": \"AWS GovCloud (US-East)\",\n+                                        \"value\": \"us-gov-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-east-1\",\n+                                        \"displayName\": \"US East (N. Virginia)\",\n+                                        \"value\": \"us-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-east-2\",\n+                                        \"displayName\": \"US East (Ohio)\",\n+                                        \"value\": \"us-east-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-west-1\",\n+                                        \"displayName\": \"US West (N. California)\",\n+                                        \"value\": \"us-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-west-2\",\n+                                        \"displayName\": \"US West (Oregon)\",\n+                                        \"value\": \"us-west-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-west-1\",\n+                                        \"displayName\": \"EU (Ireland)\",\n+                                        \"value\": \"eu-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-west-2\",\n+                                        \"displayName\": \"EU (London)\",\n+                                        \"value\": \"eu-west-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-west-3\",\n+                                        \"displayName\": \"EU (Paris)\",\n+                                        \"value\": \"eu-west-3\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-central-1\",\n+                                        \"displayName\": \"EU (Frankfurt)\",\n+                                        \"value\": \"eu-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-central-2\",\n+                                        \"displayName\": \"EU (Zurich)\",\n+                                        \"value\": \"eu-central-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-north-1\",\n+                                        \"displayName\": \"EU (Stockholm)\",\n+                                        \"value\": \"eu-north-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-south-1\",\n+                                        \"displayName\": \"EU (Milan)\",\n+                                        \"value\": \"eu-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-south-2\",\n+                                        \"displayName\": \"EU (Spain)\",\n+                                        \"value\": \"eu-south-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-east-1\",\n+                                        \"displayName\": \"Asia Pacific (Hong Kong)\",\n+                                        \"value\": \"ap-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-south-1\",\n+                                        \"displayName\": \"Asia Pacific (Mumbai)\",\n+                                        \"value\": \"ap-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-south-2\",\n+                                        \"displayName\": \"Asia Pacific (Hyderabad)\",\n+                                        \"value\": \"ap-south-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-southeast-1\",\n+                                        \"displayName\": \"Asia Pacific (Singapore)\",\n+                                        \"value\": \"ap-southeast-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-southeast-2\",\n+                                        \"displayName\": \"Asia Pacific (Sydney)\",\n+                                        \"value\": \"ap-southeast-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-southeast-3\",\n+                                        \"displayName\": \"Asia Pacific (Jakarta)\",\n+                                        \"value\": \"ap-southeast-3\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-southeast-4\",\n+                                        \"displayName\": \"Asia Pacific (Melbourne)\",\n+                                        \"value\": \"ap-southeast-4\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-northeast-1\",\n+                                        \"displayName\": \"Asia Pacific (Tokyo)\",\n+                                        \"value\": \"ap-northeast-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-northeast-2\",\n+                                        \"displayName\": \"Asia Pacific (Seoul)\",\n+                                        \"value\": \"ap-northeast-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-northeast-3\",\n+                                        \"displayName\": \"Asia Pacific (Osaka)\",\n+                                        \"value\": \"ap-northeast-3\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : sa-east-1\",\n+                                        \"displayName\": \"South America (Sao Paulo)\",\n+                                        \"value\": \"sa-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : cn-north-1\",\n+                                        \"displayName\": \"China (Beijing)\",\n+                                        \"value\": \"cn-north-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : cn-northwest-1\",\n+                                        \"displayName\": \"China (Ningxia)\",\n+                                        \"value\": \"cn-northwest-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ca-central-1\",\n+                                        \"displayName\": \"Canada (Central)\",\n+                                        \"value\": \"ca-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ca-west-1\",\n+                                        \"displayName\": \"Canada West (Calgary)\",\n+                                        \"value\": \"ca-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : me-central-1\",\n+                                        \"displayName\": \"Middle East (UAE)\",\n+                                        \"value\": \"me-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : me-south-1\",\n+                                        \"displayName\": \"Middle East (Bahrain)\",\n+                                        \"value\": \"me-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : af-south-1\",\n+                                        \"displayName\": \"Africa (Cape Town)\",\n+                                        \"value\": \"af-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-iso-east-1\",\n+                                        \"displayName\": \"US ISO East\",\n+                                        \"value\": \"us-iso-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-isob-east-1\",\n+                                        \"displayName\": \"US ISOB East (Ohio)\",\n+                                        \"value\": \"us-isob-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-iso-west-1\",\n+                                        \"displayName\": \"US ISO West\",\n+                                        \"value\": \"us-iso-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : il-central-1\",\n+                                        \"displayName\": \"Israel (Tel Aviv)\",\n+                                        \"value\": \"il-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Uses 's3.region' FlowFile attribute as region.\",\n+                                        \"displayName\": \"Use 's3.region' Attribute\",\n+                                        \"value\": \"attribute-defined-region\"\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\": \"us-west-2\",\n+                                \"description\": \"The AWS Region to connect to.\",\n+                                \"displayName\": \"Region\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"client-authentication-strategy\",\n+                                \"name\": \"Region\",\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.fileresource.service.api.FileResourceService\",\n+                                \"version\": \"2.0.0-M3\"\n+                            }\n+                        ],\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.aws.s3.FetchS3Object\"\n+                        ],\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"AWS\",\n+                            \"Amazon\",\n+                            \"S3\",\n+                            \"file\",\n+                            \"resource\"\n+                        ],\n+                        \"type\": \"org.apache.nifi.processors.aws.s3.service.S3FileResourceService\",\n+                        \"typeDescription\": \"Provides an Amazon Web Services (AWS) S3 file resource for other components.\",\n+                        \"version\": \"2.0.0-M3\"\n+                    }\n+                ],\n+                \"processors\": [\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-aws-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"f2215c6\"\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 dimension name/value pairs to be added to the metric. AWS supports a maximum of 10 dimensions.\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"name\": \"Dimension Name\",\n+                                \"value\": \"Dimension Value\"\n+                            }\n+                        ],\n+                        \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"multiProcessorUseCases\": [],\n+                        \"primaryNodeOnly\": false,\n+                        \"propertyDescriptors\": {\n+                            \"AWS Credentials Provider service\": {\n+                                \"description\": \"The Controller Service that is used to obtain AWS credentials provider\",\n+                                \"displayName\": \"AWS Credentials Provider Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"AWS Credentials Provider service\",\n+                                \"required\": true,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-aws-service-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.processors.aws.credentials.provider.service.AWSCredentialsProviderService\",\n+                                    \"version\": \"2.0.0-M3\"\n+                                }\n                             },\n-                            \"client-id\": {\n+                            \"Communications Timeout\": {\n+                                \"defaultValue\": \"30 secs\",\n                                 \"description\": \"\",\n-                                \"displayName\": \"Client ID\",\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+                            \"Endpoint Override URL\": {\n+                                \"description\": \"Endpoint URL to use instead of the AWS default including scheme, host, port, and path. The AWS libraries select an endpoint URL based on the AWS region, but this property overrides the selected endpoint URL, allowing use with other S3-compatible endpoints.\",\n+                                \"displayName\": \"Endpoint Override URL\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"client-id\",\n+                                \"name\": \"Endpoint Override URL\",\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+                            \"MetricName\": {\n+                                \"description\": \"The name of the metric\",\n+                                \"displayName\": \"Metric Name\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"client-secret\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"MetricName\",\n                                 \"required\": true,\n-                                \"sensitive\": true\n+                                \"sensitive\": false\n                             },\n-                            \"grant-type\": {\n+                            \"Namespace\": {\n+                                \"description\": \"The namespace for the metric data for CloudWatch\",\n+                                \"displayName\": \"Namespace\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Namespace\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Region\": {\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\": \"AWS Region Code : us-gov-east-1\",\n+                                        \"displayName\": \"AWS GovCloud (US-East)\",\n+                                        \"value\": \"us-gov-east-1\"\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\": \"AWS Region Code : us-gov-west-1\",\n+                                        \"displayName\": \"AWS GovCloud (US-West)\",\n+                                        \"value\": \"us-gov-west-1\"\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\": \"AWS Region Code : af-south-1\",\n+                                        \"displayName\": \"Africa (Cape Town)\",\n+                                        \"value\": \"af-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-east-1\",\n+                                        \"displayName\": \"Asia Pacific (Hong Kong)\",\n+                                        \"value\": \"ap-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-south-2\",\n+                                        \"displayName\": \"Asia Pacific (Hyderabad)\",\n+                                        \"value\": \"ap-south-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-southeast-3\",\n+                                        \"displayName\": \"Asia Pacific (Jakarta)\",\n+                                        \"value\": \"ap-southeast-3\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-southeast-4\",\n+                                        \"displayName\": \"Asia Pacific (Melbourne)\",\n+                                        \"value\": \"ap-southeast-4\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-south-1\",\n+                                        \"displayName\": \"Asia Pacific (Mumbai)\",\n+                                        \"value\": \"ap-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-northeast-3\",\n+                                        \"displayName\": \"Asia Pacific (Osaka)\",\n+                                        \"value\": \"ap-northeast-3\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-northeast-2\",\n+                                        \"displayName\": \"Asia Pacific (Seoul)\",\n+                                        \"value\": \"ap-northeast-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-southeast-1\",\n+                                        \"displayName\": \"Asia Pacific (Singapore)\",\n+                                        \"value\": \"ap-southeast-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-southeast-2\",\n+                                        \"displayName\": \"Asia Pacific (Sydney)\",\n+                                        \"value\": \"ap-southeast-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-northeast-1\",\n+                                        \"displayName\": \"Asia Pacific (Tokyo)\",\n+                                        \"value\": \"ap-northeast-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ca-central-1\",\n+                                        \"displayName\": \"Canada (Central)\",\n+                                        \"value\": \"ca-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ca-west-1\",\n+                                        \"displayName\": \"Canada West (Calgary)\",\n+                                        \"value\": \"ca-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : cn-north-1\",\n+                                        \"displayName\": \"China (Beijing)\",\n+                                        \"value\": \"cn-north-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : cn-northwest-1\",\n+                                        \"displayName\": \"China (Ningxia)\",\n+                                        \"value\": \"cn-northwest-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-central-1\",\n+                                        \"displayName\": \"Europe (Frankfurt)\",\n+                                        \"value\": \"eu-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-west-1\",\n+                                        \"displayName\": \"Europe (Ireland)\",\n+                                        \"value\": \"eu-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-west-2\",\n+                                        \"displayName\": \"Europe (London)\",\n+                                        \"value\": \"eu-west-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-south-1\",\n+                                        \"displayName\": \"Europe (Milan)\",\n+                                        \"value\": \"eu-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-west-3\",\n+                                        \"displayName\": \"Europe (Paris)\",\n+                                        \"value\": \"eu-west-3\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-south-2\",\n+                                        \"displayName\": \"Europe (Spain)\",\n+                                        \"value\": \"eu-south-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-north-1\",\n+                                        \"displayName\": \"Europe (Stockholm)\",\n+                                        \"value\": \"eu-north-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-central-2\",\n+                                        \"displayName\": \"Europe (Zurich)\",\n+                                        \"value\": \"eu-central-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : il-central-1\",\n+                                        \"displayName\": \"Israel (Tel Aviv)\",\n+                                        \"value\": \"il-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : me-south-1\",\n+                                        \"displayName\": \"Middle East (Bahrain)\",\n+                                        \"value\": \"me-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : me-central-1\",\n+                                        \"displayName\": \"Middle East (UAE)\",\n+                                        \"value\": \"me-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : sa-east-1\",\n+                                        \"displayName\": \"South America (Sao Paulo)\",\n+                                        \"value\": \"sa-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-east-1\",\n+                                        \"displayName\": \"US East (N. Virginia)\",\n+                                        \"value\": \"us-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-east-2\",\n+                                        \"displayName\": \"US East (Ohio)\",\n+                                        \"value\": \"us-east-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-iso-east-1\",\n+                                        \"displayName\": \"US ISO East\",\n+                                        \"value\": \"us-iso-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-iso-west-1\",\n+                                        \"displayName\": \"US ISO WEST\",\n+                                        \"value\": \"us-iso-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-isob-east-1\",\n+                                        \"displayName\": \"US ISOB East (Ohio)\",\n+                                        \"value\": \"us-isob-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-west-1\",\n+                                        \"displayName\": \"US West (N. California)\",\n+                                        \"value\": \"us-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-west-2\",\n+                                        \"displayName\": \"US West (Oregon)\",\n+                                        \"value\": \"us-west-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-cn-global\",\n+                                        \"displayName\": \"aws-cn-global\",\n+                                        \"value\": \"aws-cn-global\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-global\",\n+                                        \"displayName\": \"aws-global\",\n+                                        \"value\": \"aws-global\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-iso-b-global\",\n+                                        \"displayName\": \"aws-iso-b-global\",\n+                                        \"value\": \"aws-iso-b-global\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-iso-global\",\n+                                        \"displayName\": \"aws-iso-global\",\n+                                        \"value\": \"aws-iso-global\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-us-gov-global\",\n+                                        \"displayName\": \"aws-us-gov-global\",\n+                                        \"value\": \"aws-us-gov-global\"\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\": \"us-west-2\",\n+                                \"description\": \"\",\n+                                \"displayName\": \"Region\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"grant-type\",\n+                                \"name\": \"Region\",\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+                            \"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\": \"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\": \"2.0.0-M3\"\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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+                            \"Timestamp\": {\n+                                \"description\": \"A point in time expressed as the number of milliseconds since Jan 1, 1970 00:00:00 UTC. If not specified, the default value is set to the time the metric data was received\",\n+                                \"displayName\": \"Timestamp\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"refresh-window\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Timestamp\",\n+                                \"required\": false,\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+                            \"Unit\": {\n+                                \"description\": \"The unit of the metric. (e.g Seconds, Bytes, Megabytes, Percent, Count,  Kilobytes/Second, Terabits/Second, Count/Second) For details see http://docs.aws.amazon.com/AmazonCloudWatch/latest/APIReference/API_MetricDatum.html\",\n+                                \"displayName\": \"Unit\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"resource\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Unit\",\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+                            \"Value\": {\n+                                \"description\": \"The value for the metric. Must be a double\",\n+                                \"displayName\": \"Value\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"scope\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Value\",\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-                                \"displayName\": \"Password\",\n+                            \"maximum\": {\n+                                \"description\": \"The maximum value of the sample set. Must be a double\",\n+                                \"displayName\": \"Maximum\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"service-password\",\n-                                \"required\": true,\n-                                \"sensitive\": true\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"maximum\",\n+                                \"required\": false,\n+                                \"sensitive\": false\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+                            \"minimum\": {\n+                                \"description\": \"The minimum value of the sample set. Must be a double\",\n+                                \"displayName\": \"Minimum\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"service-user-name\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"minimum\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"ssl-context-service\": {\n-                                \"description\": \"\",\n-                                \"displayName\": \"SSL Context Service\",\n+                            \"proxy-configuration-service\": {\n+                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests.\",\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\": \"2.0.0-M3\"\n                                 }\n+                            },\n+                            \"sampleCount\": {\n+                                \"description\": \"The number of samples used for the statistic set. Must be a double\",\n+                                \"displayName\": \"Sample Count\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"sampleCount\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"sum\": {\n+                                \"description\": \"The sum of values for the sample set. Must be a double\",\n+                                \"displayName\": \"Sum\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"sum\",\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.oauth2.OAuth2AccessTokenProvider\",\n-                                \"version\": \"2.0.0-M3\"\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-                        \"supportsDynamicProperties\": false,\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": true,\n+                        \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"access token\",\n-                            \"authorization\",\n-                            \"http\",\n-                            \"oauth2\",\n-                            \"provider\"\n+                            \"amazon\",\n+                            \"aws\",\n+                            \"cloudwatch\",\n+                            \"metrics\",\n+                            \"publish\",\n+                            \"put\"\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+                        \"triggerSerially\": false,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.aws.cloudwatch.PutCloudWatchMetric\",\n+                        \"typeDescription\": \"Publishes metrics to Amazon CloudWatch. Metric can be either a single value, or a StatisticSet comprised of minimum, maximum, sum and sample count.\",\n+                        \"useCases\": [],\n                         \"version\": \"2.0.0-M3\"\n-                    }\n-                ],\n-                \"processors\": [],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\n-        },\n-        {\n-            \"artifact\": \"nifi-framework-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [],\n-                \"processors\": [],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\n-        },\n-        {\n-            \"artifact\": \"nifi-cdc-mysql-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [],\n-                \"processors\": [\n+                    },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-cdc-mysql-nar\",\n+                        \"artifact\": \"nifi-aws-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -25658,762 +29920,926 @@\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+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"multiProcessorUseCases\": [],\n-                        \"primaryNodeOnly\": true,\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+                            \"AWS Credentials Provider service\": {\n+                                \"description\": \"The Controller Service that is used to obtain AWS credentials provider\",\n+                                \"displayName\": \"AWS Credentials Provider Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"SSL Context Service\",\n-                                \"required\": false,\n+                                \"name\": \"AWS Credentials Provider service\",\n+                                \"required\": true,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"artifact\": \"nifi-aws-service-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n+                                    \"type\": \"org.apache.nifi.processors.aws.credentials.provider.service.AWSCredentialsProviderService\",\n                                     \"version\": \"2.0.0-M3\"\n                                 }\n                             },\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\": \"SSL Mode\",\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+                            \"Batch items for each request (between 1 and 50)\": {\n+                                \"defaultValue\": \"1\",\n+                                \"description\": \"The items to be retrieved in one batch\",\n+                                \"displayName\": \"Batch items for each request (between 1 and 50)\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"capture-change-mysql-db-name-pattern\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Batch items for each request (between 1 and 50)\",\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+                            \"Communications Timeout\": {\n+                                \"defaultValue\": \"30 secs\",\n+                                \"description\": \"\",\n+                                \"displayName\": \"Communications 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\": \"2.0.0-M3\"\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"capture-change-mysql-driver-class\",\n+                                \"name\": \"Communications Timeout\",\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+                            \"Endpoint Override URL\": {\n+                                \"description\": \"Endpoint URL to use instead of the AWS default including scheme, host, port, and path. The AWS libraries select an endpoint URL based on the AWS region, but this property overrides the selected endpoint URL, allowing use with other S3-compatible endpoints.\",\n+                                \"displayName\": \"Endpoint Override URL\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"capture-change-mysql-driver-locations\",\n+                                \"name\": \"Endpoint Override URL\",\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+                            \"Hash Key Name\": {\n+                                \"description\": \"The hash key name of the item\",\n+                                \"displayName\": \"Hash Key Name\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"capture-change-mysql-hosts\",\n+                                \"name\": \"Hash Key Name\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"capture-change-mysql-include-begin-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\": \"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+                            \"Hash Key Value\": {\n+                                \"defaultValue\": \"${dynamodb.item.hash.key.value}\",\n+                                \"description\": \"The hash key value of the item\",\n+                                \"displayName\": \"Hash Key Value\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"capture-change-mysql-include-begin-commit\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Hash Key Value\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"capture-change-mysql-include-ddl-events\": {\n+                            \"Hash Key Value Type\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"displayName\": \"string\",\n+                                        \"value\": \"string\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"displayName\": \"number\",\n+                                        \"value\": \"number\"\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+                                \"defaultValue\": \"string\",\n+                                \"description\": \"The hash key value type of the item\",\n+                                \"displayName\": \"Hash Key Value Type\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"capture-change-mysql-include-ddl-events\",\n+                                \"name\": \"Hash Key Value Type\",\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 environment properties.\",\n-                                \"displayName\": \"Initial Binlog Filename\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"capture-change-mysql-init-binlog-filename\",\n-                                \"required\": false,\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 environment properties.\",\n-                                \"displayName\": \"Initial Binlog Position\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"capture-change-mysql-init-binlog-position\",\n-                                \"required\": false,\n-                                \"sensitive\": false\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 environment properties.\",\n-                                \"displayName\": \"Initial Binlog GTID\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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+                            \"Range Key Name\": {\n+                                \"description\": \"The range key name of the item\",\n+                                \"displayName\": \"Range Key Name\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"capture-change-mysql-init-seq-id\",\n+                                \"name\": \"Range Key Name\",\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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+                            \"Range Key Value\": {\n+                                \"defaultValue\": \"${dynamodb.item.range.key.value}\",\n+                                \"description\": \"\",\n+                                \"displayName\": \"Range Key Value\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"capture-change-mysql-name-pattern\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Range Key Value\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"capture-change-mysql-password\": {\n-                                \"description\": \"Password to access the MySQL cluster\",\n-                                \"displayName\": \"Password\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"capture-change-mysql-password\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n-                            },\n-                            \"capture-change-mysql-retrieve-all-records\": {\n+                            \"Range Key Value Type\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"displayName\": \"string\",\n+                                        \"value\": \"string\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"displayName\": \"number\",\n+                                        \"value\": \"number\"\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+                                \"defaultValue\": \"string\",\n+                                \"description\": \"The range key value type of the item\",\n+                                \"displayName\": \"Range Key Value Type\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"capture-change-mysql-retrieve-all-records\",\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"capture-change-mysql-server-id\",\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"capture-change-mysql-state-update-interval\",\n+                                \"name\": \"Range Key Value Type\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"capture-change-mysql-use-gtid\": {\n+                            \"Region\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"description\": \"AWS Region Code : us-gov-east-1\",\n+                                        \"displayName\": \"AWS GovCloud (US-East)\",\n+                                        \"value\": \"us-gov-east-1\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"description\": \"AWS Region Code : us-gov-west-1\",\n+                                        \"displayName\": \"AWS GovCloud (US-West)\",\n+                                        \"value\": \"us-gov-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : af-south-1\",\n+                                        \"displayName\": \"Africa (Cape Town)\",\n+                                        \"value\": \"af-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-east-1\",\n+                                        \"displayName\": \"Asia Pacific (Hong Kong)\",\n+                                        \"value\": \"ap-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-south-2\",\n+                                        \"displayName\": \"Asia Pacific (Hyderabad)\",\n+                                        \"value\": \"ap-south-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-southeast-3\",\n+                                        \"displayName\": \"Asia Pacific (Jakarta)\",\n+                                        \"value\": \"ap-southeast-3\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-southeast-4\",\n+                                        \"displayName\": \"Asia Pacific (Melbourne)\",\n+                                        \"value\": \"ap-southeast-4\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-south-1\",\n+                                        \"displayName\": \"Asia Pacific (Mumbai)\",\n+                                        \"value\": \"ap-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-northeast-3\",\n+                                        \"displayName\": \"Asia Pacific (Osaka)\",\n+                                        \"value\": \"ap-northeast-3\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-northeast-2\",\n+                                        \"displayName\": \"Asia Pacific (Seoul)\",\n+                                        \"value\": \"ap-northeast-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-southeast-1\",\n+                                        \"displayName\": \"Asia Pacific (Singapore)\",\n+                                        \"value\": \"ap-southeast-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-southeast-2\",\n+                                        \"displayName\": \"Asia Pacific (Sydney)\",\n+                                        \"value\": \"ap-southeast-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-northeast-1\",\n+                                        \"displayName\": \"Asia Pacific (Tokyo)\",\n+                                        \"value\": \"ap-northeast-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ca-central-1\",\n+                                        \"displayName\": \"Canada (Central)\",\n+                                        \"value\": \"ca-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ca-west-1\",\n+                                        \"displayName\": \"Canada West (Calgary)\",\n+                                        \"value\": \"ca-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : cn-north-1\",\n+                                        \"displayName\": \"China (Beijing)\",\n+                                        \"value\": \"cn-north-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : cn-northwest-1\",\n+                                        \"displayName\": \"China (Ningxia)\",\n+                                        \"value\": \"cn-northwest-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-central-1\",\n+                                        \"displayName\": \"Europe (Frankfurt)\",\n+                                        \"value\": \"eu-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-west-1\",\n+                                        \"displayName\": \"Europe (Ireland)\",\n+                                        \"value\": \"eu-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-west-2\",\n+                                        \"displayName\": \"Europe (London)\",\n+                                        \"value\": \"eu-west-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-south-1\",\n+                                        \"displayName\": \"Europe (Milan)\",\n+                                        \"value\": \"eu-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-west-3\",\n+                                        \"displayName\": \"Europe (Paris)\",\n+                                        \"value\": \"eu-west-3\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-south-2\",\n+                                        \"displayName\": \"Europe (Spain)\",\n+                                        \"value\": \"eu-south-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-north-1\",\n+                                        \"displayName\": \"Europe (Stockholm)\",\n+                                        \"value\": \"eu-north-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-central-2\",\n+                                        \"displayName\": \"Europe (Zurich)\",\n+                                        \"value\": \"eu-central-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : il-central-1\",\n+                                        \"displayName\": \"Israel (Tel Aviv)\",\n+                                        \"value\": \"il-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : me-south-1\",\n+                                        \"displayName\": \"Middle East (Bahrain)\",\n+                                        \"value\": \"me-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : me-central-1\",\n+                                        \"displayName\": \"Middle East (UAE)\",\n+                                        \"value\": \"me-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : sa-east-1\",\n+                                        \"displayName\": \"South America (Sao Paulo)\",\n+                                        \"value\": \"sa-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-east-1\",\n+                                        \"displayName\": \"US East (N. Virginia)\",\n+                                        \"value\": \"us-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-east-2\",\n+                                        \"displayName\": \"US East (Ohio)\",\n+                                        \"value\": \"us-east-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-iso-east-1\",\n+                                        \"displayName\": \"US ISO East\",\n+                                        \"value\": \"us-iso-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-iso-west-1\",\n+                                        \"displayName\": \"US ISO WEST\",\n+                                        \"value\": \"us-iso-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-isob-east-1\",\n+                                        \"displayName\": \"US ISOB East (Ohio)\",\n+                                        \"value\": \"us-isob-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-west-1\",\n+                                        \"displayName\": \"US West (N. California)\",\n+                                        \"value\": \"us-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-west-2\",\n+                                        \"displayName\": \"US West (Oregon)\",\n+                                        \"value\": \"us-west-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-cn-global\",\n+                                        \"displayName\": \"aws-cn-global\",\n+                                        \"value\": \"aws-cn-global\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-global\",\n+                                        \"displayName\": \"aws-global\",\n+                                        \"value\": \"aws-global\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-iso-b-global\",\n+                                        \"displayName\": \"aws-iso-b-global\",\n+                                        \"value\": \"aws-iso-b-global\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-iso-global\",\n+                                        \"displayName\": \"aws-iso-global\",\n+                                        \"value\": \"aws-iso-global\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-us-gov-global\",\n+                                        \"displayName\": \"aws-us-gov-global\",\n+                                        \"value\": \"aws-us-gov-global\"\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\": \"us-west-2\",\n+                                \"description\": \"\",\n+                                \"displayName\": \"Region\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"capture-change-mysql-use-gtid\",\n+                                \"name\": \"Region\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"capture-change-mysql-username\": {\n-                                \"description\": \"Username to access the MySQL cluster\",\n-                                \"displayName\": \"Username\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"capture-change-mysql-username\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"events-per-flowfile-strategy\": {\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-                                    },\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+                            \"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\": \"events-per-flowfile-strategy\",\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\": \"2.0.0-M3\"\n+                                }\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+                            \"Table Name\": {\n+                                \"description\": \"The DynamoDB table name\",\n+                                \"displayName\": \"Table Name\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"number-of-events-per-flowfile\",\n+                                \"name\": \"Table Name\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n+                            },\n+                            \"proxy-configuration-service\": {\n+                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests.\",\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\": \"2.0.0-M3\"\n+                                }\n                             }\n                         },\n-                        \"restricted\": true,\n+                        \"readsAttributes\": [\n+                            {\n+                                \"description\": \"Items hash key value\",\n+                                \"name\": \"  dynamodb.item.hash.key.value\"\n+                            },\n+                            {\n+                                \"description\": \"Items range key value\",\n+                                \"name\": \"  dynamodb.item.range.key.value\"\n+                            }\n+                        ],\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.aws.dynamodb.GetDynamoDB\",\n+                            \"org.apache.nifi.processors.aws.dynamodb.PutDynamoDB\",\n+                            \"org.apache.nifi.processors.aws.dynamodb.PutDynamoDBRecord\"\n+                        ],\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+                                \"description\": \"FlowFiles are routed to unprocessed relationship when DynamoDB is not able to process all the items in the request. Typical reasons are insufficient table throughput capacity and exceeding the maximum bytes per request. Unprocessed FlowFiles can be retried with a new request.\",\n+                                \"name\": \"unprocessed\"\n+                            },\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                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": false,\n+                        \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"cdc\",\n-                            \"event\",\n-                            \"jdbc\",\n-                            \"mysql\",\n-                            \"sql\",\n-                            \"transaction\"\n+                            \"AWS\",\n+                            \"Amazon\",\n+                            \"Delete\",\n+                            \"DynamoDB\",\n+                            \"Remove\"\n                         ],\n-                        \"triggerSerially\": true,\n+                        \"triggerSerially\": false,\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+                        \"type\": \"org.apache.nifi.processors.aws.dynamodb.DeleteDynamoDB\",\n+                        \"typeDescription\": \"Deletes a document from DynamoDB based on hash and range key. The key can be string or number. The request requires all the primary keys for the operation (hash or hash and range key)\",\n                         \"useCases\": [],\n                         \"version\": \"2.0.0-M3\",\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+                                \"description\": \"DynamoDB unprocessed keys\",\n+                                \"name\": \"dynamodb.key.error.unprocessed\"\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+                                \"description\": \"DynamoDB range key error\",\n+                                \"name\": \"dynmodb.range.key.value.error\"\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+                                \"description\": \"DynamoDB key not found\",\n+                                \"name\": \"dynamodb.key.error.not.found\"\n+                            },\n+                            {\n+                                \"description\": \"DynamoDB exception message\",\n+                                \"name\": \"dynamodb.error.exception.message\"\n+                            },\n+                            {\n+                                \"description\": \"DynamoDB error code\",\n+                                \"name\": \"dynamodb.error.code\"\n+                            },\n+                            {\n+                                \"description\": \"DynamoDB error message\",\n+                                \"name\": \"dynamodb.error.message\"\n+                            },\n+                            {\n+                                \"description\": \"DynamoDB error service\",\n+                                \"name\": \"dynamodb.error.service\"\n+                            },\n+                            {\n+                                \"description\": \"DynamoDB error is retryable\",\n+                                \"name\": \"dynamodb.error.retryable\"\n+                            },\n+                            {\n+                                \"description\": \"DynamoDB error request id\",\n+                                \"name\": \"dynamodb.error.request.id\"\n+                            },\n+                            {\n+                                \"description\": \"DynamoDB status code\",\n+                                \"name\": \"dynamodb.error.status.code\"\n                             }\n                         ]\n-                    }\n-                ],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"2.0.0-M3\"\n-        },\n-        {\n-            \"artifact\": \"nifi-proxy-configuration-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [\n+                    },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-proxy-configuration-nar\",\n+                        \"artifact\": \"nifi-aws-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\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+                        \"multiProcessorUseCases\": [],\n+                        \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"proxy-server-host\": {\n-                                \"description\": \"Proxy server hostname or ip-address.\",\n-                                \"displayName\": \"Proxy Server Host\",\n+                            \"AWS Credentials Provider service\": {\n+                                \"description\": \"The Controller Service that is used to obtain AWS credentials provider\",\n+                                \"displayName\": \"AWS Credentials Provider Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"AWS Credentials Provider service\",\n+                                \"required\": true,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-aws-service-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.processors.aws.credentials.provider.service.AWSCredentialsProviderService\",\n+                                    \"version\": \"2.0.0-M3\"\n+                                }\n+                            },\n+                            \"Batch items for each request (between 1 and 50)\": {\n+                                \"defaultValue\": \"1\",\n+                                \"description\": \"The items to be retrieved in one batch\",\n+                                \"displayName\": \"Batch items for each request (between 1 and 50)\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"proxy-server-host\",\n+                                \"name\": \"Batch items for each request (between 1 and 50)\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"proxy-server-port\": {\n-                                \"description\": \"Proxy server port number.\",\n-                                \"displayName\": \"Proxy Server Port\",\n+                            \"Communications Timeout\": {\n+                                \"defaultValue\": \"30 secs\",\n+                                \"description\": \"\",\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+                            \"Endpoint Override URL\": {\n+                                \"description\": \"Endpoint URL to use instead of the AWS default including scheme, host, port, and path. The AWS libraries select an endpoint URL based on the AWS region, but this property overrides the selected endpoint URL, allowing use with other S3-compatible endpoints.\",\n+                                \"displayName\": \"Endpoint Override URL\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"proxy-server-port\",\n+                                \"name\": \"Endpoint Override URL\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"proxy-type\": {\n+                            \"Hash Key Name\": {\n+                                \"description\": \"The hash key name of the item\",\n+                                \"displayName\": \"Hash Key Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Hash Key Name\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Hash Key Value\": {\n+                                \"defaultValue\": \"${dynamodb.item.hash.key.value}\",\n+                                \"description\": \"The hash key value of the item\",\n+                                \"displayName\": \"Hash Key Value\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Hash Key Value\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Hash Key Value Type\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"DIRECT\",\n-                                        \"value\": \"DIRECT\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"HTTP\",\n-                                        \"value\": \"HTTP\"\n+                                        \"displayName\": \"string\",\n+                                        \"value\": \"string\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"SOCKS\",\n-                                        \"value\": \"SOCKS\"\n+                                        \"displayName\": \"number\",\n+                                        \"value\": \"number\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"DIRECT\",\n-                                \"description\": \"Proxy type.\",\n-                                \"displayName\": \"Proxy Type\",\n+                                \"defaultValue\": \"string\",\n+                                \"description\": \"The hash key value type of the item\",\n+                                \"displayName\": \"Hash Key Value Type\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"proxy-type\",\n+                                \"name\": \"Hash Key Value Type\",\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+                            \"Json Document attribute\": {\n+                                \"description\": \"The Json document to be retrieved from the dynamodb item ('s' type in the schema)\",\n+                                \"displayName\": \"Json Document attribute\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"proxy-user-name\",\n-                                \"required\": false,\n+                                \"name\": \"Json Document attribute\",\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+                            \"Range Key Name\": {\n+                                \"description\": \"The range key name of the item\",\n+                                \"displayName\": \"Range Key Name\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"proxy-user-password\",\n+                                \"name\": \"Range Key Name\",\n                                 \"required\": false,\n-                                \"sensitive\": true\n+                                \"sensitive\": false\n                             },\n-                            \"socks-version\": {\n+                            \"Range Key Value\": {\n+                                \"defaultValue\": \"${dynamodb.item.range.key.value}\",\n+                                \"description\": \"\",\n+                                \"displayName\": \"Range Key Value\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Range Key Value\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Range Key Value Type\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"SOCKS4\",\n-                                        \"value\": \"SOCKS4\"\n+                                        \"displayName\": \"string\",\n+                                        \"value\": \"string\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"SOCKS5\",\n-                                        \"value\": \"SOCKS5\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"SOCKS5\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"SOCKS\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Proxy Type\",\n-                                        \"propertyName\": \"proxy-type\"\n+                                        \"displayName\": \"number\",\n+                                        \"value\": \"number\"\n                                     }\n                                 ],\n-                                \"description\": \"SOCKS Protocol Version\",\n-                                \"displayName\": \"SOCKS Version\",\n+                                \"defaultValue\": \"string\",\n+                                \"description\": \"The range key value type of the item\",\n+                                \"displayName\": \"Range Key Value Type\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"socks-version\",\n+                                \"name\": \"Range Key Value 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.proxy.ProxyConfigurationService\",\n-                                \"version\": \"2.0.0-M3\"\n-                            }\n-                        ],\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"Proxy\"\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\": \"2.0.0-M3\"\n-                    }\n-                ],\n-                \"processors\": [],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"2.0.0-M3\"\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\": \"f2215c6\"\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-                        \"multiProcessorUseCases\": [],\n-                        \"primaryNodeOnly\": false,\n-                        \"propertyDescriptors\": {\n-                            \"granularity\": {\n+                            },\n+                            \"Region\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Record\",\n-                                        \"value\": \"Record\"\n+                                        \"description\": \"AWS Region Code : us-gov-east-1\",\n+                                        \"displayName\": \"AWS GovCloud (US-East)\",\n+                                        \"value\": \"us-gov-east-1\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Chunk\",\n-                                        \"value\": \"Chunk\"\n+                                        \"description\": \"AWS Region Code : us-gov-west-1\",\n+                                        \"displayName\": \"AWS GovCloud (US-West)\",\n+                                        \"value\": \"us-gov-west-1\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"File\",\n-                                        \"value\": \"File\"\n+                                        \"description\": \"AWS Region Code : af-south-1\",\n+                                        \"displayName\": \"Africa (Cape Town)\",\n+                                        \"value\": \"af-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-east-1\",\n+                                        \"displayName\": \"Asia Pacific (Hong Kong)\",\n+                                        \"value\": \"ap-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-south-2\",\n+                                        \"displayName\": \"Asia Pacific (Hyderabad)\",\n+                                        \"value\": \"ap-south-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-southeast-3\",\n+                                        \"displayName\": \"Asia Pacific (Jakarta)\",\n+                                        \"value\": \"ap-southeast-3\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-southeast-4\",\n+                                        \"displayName\": \"Asia Pacific (Melbourne)\",\n+                                        \"value\": \"ap-southeast-4\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-south-1\",\n+                                        \"displayName\": \"Asia Pacific (Mumbai)\",\n+                                        \"value\": \"ap-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-northeast-3\",\n+                                        \"displayName\": \"Asia Pacific (Osaka)\",\n+                                        \"value\": \"ap-northeast-3\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-northeast-2\",\n+                                        \"displayName\": \"Asia Pacific (Seoul)\",\n+                                        \"value\": \"ap-northeast-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-southeast-1\",\n+                                        \"displayName\": \"Asia Pacific (Singapore)\",\n+                                        \"value\": \"ap-southeast-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-southeast-2\",\n+                                        \"displayName\": \"Asia Pacific (Sydney)\",\n+                                        \"value\": \"ap-southeast-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-northeast-1\",\n+                                        \"displayName\": \"Asia Pacific (Tokyo)\",\n+                                        \"value\": \"ap-northeast-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ca-central-1\",\n+                                        \"displayName\": \"Canada (Central)\",\n+                                        \"value\": \"ca-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ca-west-1\",\n+                                        \"displayName\": \"Canada West (Calgary)\",\n+                                        \"value\": \"ca-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : cn-north-1\",\n+                                        \"displayName\": \"China (Beijing)\",\n+                                        \"value\": \"cn-north-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : cn-northwest-1\",\n+                                        \"displayName\": \"China (Ningxia)\",\n+                                        \"value\": \"cn-northwest-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-central-1\",\n+                                        \"displayName\": \"Europe (Frankfurt)\",\n+                                        \"value\": \"eu-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-west-1\",\n+                                        \"displayName\": \"Europe (Ireland)\",\n+                                        \"value\": \"eu-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-west-2\",\n+                                        \"displayName\": \"Europe (London)\",\n+                                        \"value\": \"eu-west-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-south-1\",\n+                                        \"displayName\": \"Europe (Milan)\",\n+                                        \"value\": \"eu-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-west-3\",\n+                                        \"displayName\": \"Europe (Paris)\",\n+                                        \"value\": \"eu-west-3\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-south-2\",\n+                                        \"displayName\": \"Europe (Spain)\",\n+                                        \"value\": \"eu-south-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-north-1\",\n+                                        \"displayName\": \"Europe (Stockholm)\",\n+                                        \"value\": \"eu-north-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-central-2\",\n+                                        \"displayName\": \"Europe (Zurich)\",\n+                                        \"value\": \"eu-central-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : il-central-1\",\n+                                        \"displayName\": \"Israel (Tel Aviv)\",\n+                                        \"value\": \"il-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : me-south-1\",\n+                                        \"displayName\": \"Middle East (Bahrain)\",\n+                                        \"value\": \"me-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : me-central-1\",\n+                                        \"displayName\": \"Middle East (UAE)\",\n+                                        \"value\": \"me-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : sa-east-1\",\n+                                        \"displayName\": \"South America (Sao Paulo)\",\n+                                        \"value\": \"sa-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-east-1\",\n+                                        \"displayName\": \"US East (N. Virginia)\",\n+                                        \"value\": \"us-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-east-2\",\n+                                        \"displayName\": \"US East (Ohio)\",\n+                                        \"value\": \"us-east-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-iso-east-1\",\n+                                        \"displayName\": \"US ISO East\",\n+                                        \"value\": \"us-iso-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-iso-west-1\",\n+                                        \"displayName\": \"US ISO WEST\",\n+                                        \"value\": \"us-iso-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-isob-east-1\",\n+                                        \"displayName\": \"US ISOB East (Ohio)\",\n+                                        \"value\": \"us-isob-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-west-1\",\n+                                        \"displayName\": \"US West (N. California)\",\n+                                        \"value\": \"us-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-west-2\",\n+                                        \"displayName\": \"US West (Oregon)\",\n+                                        \"value\": \"us-west-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-cn-global\",\n+                                        \"displayName\": \"aws-cn-global\",\n+                                        \"value\": \"aws-cn-global\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-global\",\n+                                        \"displayName\": \"aws-global\",\n+                                        \"value\": \"aws-global\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-iso-b-global\",\n+                                        \"displayName\": \"aws-iso-b-global\",\n+                                        \"value\": \"aws-iso-b-global\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-iso-global\",\n+                                        \"displayName\": \"aws-iso-global\",\n+                                        \"value\": \"aws-iso-global\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-us-gov-global\",\n+                                        \"displayName\": \"aws-us-gov-global\",\n+                                        \"value\": \"aws-us-gov-global\"\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+                                \"defaultValue\": \"us-west-2\",\n+                                \"description\": \"\",\n+                                \"displayName\": \"Region\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"granularity\",\n+                                \"name\": \"Region\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n-                            }\n-                        },\n-                        \"readsAttributes\": [\n-                            {\n-                                \"description\": \"The filename of the evtx file\",\n-                                \"name\": \"filename\"\n-                            }\n-                        ],\n-                        \"sideEffectFree\": true,\n-                        \"supportedRelationships\": [\n-                            {\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-                        ],\n-                        \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\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.evtx.ParseEvtx\",\n-                        \"typeDescription\": \"Parses the contents of a Windows Event Log file (evtx) and writes the resulting XML to the FlowFile\",\n-                        \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"The output filename\",\n-                                \"name\": \"filename\"\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-                            }\n-                        ]\n-                    }\n-                ],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"2.0.0-M3\"\n-        },\n-        {\n-            \"artifact\": \"nifi-dropbox-processors-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [],\n-                \"processors\": [\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-dropbox-processors-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"f2215c6\"\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-                        \"multiProcessorUseCases\": [],\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+                            \"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\": \"dropbox-credential-service\",\n-                                \"required\": true,\n+                                \"name\": \"SSL Context Service\",\n+                                \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-dropbox-services-api-nar\",\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.dropbox.credentials.service.DropboxCredentialService\",\n+                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n                                     \"version\": \"2.0.0-M3\"\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+                            \"Table Name\": {\n+                                \"description\": \"The DynamoDB table name\",\n+                                \"displayName\": \"Table Name\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"file\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Table 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: HTTP + AuthN\",\n+                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests.\",\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@@ -26421,373 +30847,662 @@\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n                                     \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n                                     \"version\": \"2.0.0-M3\"\n                                 }\n                             }\n                         },\n+                        \"readsAttributes\": [\n+                            {\n+                                \"description\": \"Items hash key value\",\n+                                \"name\": \"  dynamodb.item.hash.key.value\"\n+                            },\n+                            {\n+                                \"description\": \"Items range key value\",\n+                                \"name\": \"  dynamodb.item.range.key.value\"\n+                            }\n+                        ],\n                         \"seeAlso\": [\n-                            \"org.apache.nifi.processors.dropbox.ListDropbox\",\n-                            \"org.apache.nifi.processors.dropbox.PutDropbox\"\n+                            \"org.apache.nifi.processors.aws.dynamodb.DeleteDynamoDB\",\n+                            \"org.apache.nifi.processors.aws.dynamodb.PutDynamoDB\",\n+                            \"org.apache.nifi.processors.aws.dynamodb.PutDynamoDBRecord\"\n                         ],\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"A FlowFile will be routed here for each successfully fetched File.\",\n+                                \"description\": \"FlowFiles are routed to unprocessed relationship when DynamoDB is not able to process all the items in the request. Typical reasons are insufficient table throughput capacity and exceeding the maximum bytes per request. Unprocessed FlowFiles can be retried with a new request.\",\n+                                \"name\": \"unprocessed\"\n+                            },\n+                            {\n+                                \"description\": \"FlowFiles are routed to success relationship\",\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 are routed to failure relationship\",\n                                 \"name\": \"failure\"\n+                            },\n+                            {\n+                                \"description\": \"FlowFiles are routed to not found relationship if key not found in the table\",\n+                                \"name\": \"not found\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": false,\n+                        \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"dropbox\",\n-                            \"fetch\",\n-                            \"storage\"\n+                            \"AWS\",\n+                            \"Amazon\",\n+                            \"DynamoDB\",\n+                            \"Fetch\",\n+                            \"Get\"\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+                        \"type\": \"org.apache.nifi.processors.aws.dynamodb.GetDynamoDB\",\n+                        \"typeDescription\": \"Retrieves a document from DynamoDB based on hash and range key.  The key can be string or number.For any get request all the primary keys are required (hash or hash and range based on the table keys).A Json Document ('Map') attribute of the DynamoDB item is read into the content of the FlowFile.\",\n                         \"useCases\": [],\n                         \"version\": \"2.0.0-M3\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"The error message returned by Dropbox\",\n-                                \"name\": \"error.message\"\n+                                \"description\": \"DynamoDB unprocessed keys\",\n+                                \"name\": \"dynamodb.key.error.unprocessed\"\n                             },\n                             {\n-                                \"description\": \"The Dropbox identifier of the file\",\n-                                \"name\": \"dropbox.id\"\n+                                \"description\": \"DynamoDB range key error\",\n+                                \"name\": \"dynmodb.range.key.value.error\"\n                             },\n                             {\n-                                \"description\": \"The folder path where the file is located\",\n-                                \"name\": \"path\"\n+                                \"description\": \"DynamoDB key not found\",\n+                                \"name\": \"dynamodb.key.error.not.found\"\n                             },\n                             {\n-                                \"description\": \"The name of the file\",\n-                                \"name\": \"filename\"\n+                                \"description\": \"DynamoDB exception message\",\n+                                \"name\": \"dynamodb.error.exception.message\"\n                             },\n                             {\n-                                \"description\": \"The size of the file\",\n-                                \"name\": \"dropbox.size\"\n+                                \"description\": \"DynamoDB error code\",\n+                                \"name\": \"dynamodb.error.code\"\n                             },\n                             {\n-                                \"description\": \"The server modified time of the file\",\n-                                \"name\": \"dropbox.timestamp\"\n+                                \"description\": \"DynamoDB error message\",\n+                                \"name\": \"dynamodb.error.message\"\n                             },\n                             {\n-                                \"description\": \"Revision of the file\",\n-                                \"name\": \"dropbox.revision\"\n+                                \"description\": \"DynamoDB error service\",\n+                                \"name\": \"dynamodb.error.service\"\n+                            },\n+                            {\n+                                \"description\": \"DynamoDB error is retryable\",\n+                                \"name\": \"dynamodb.error.retryable\"\n+                            },\n+                            {\n+                                \"description\": \"DynamoDB error request id\",\n+                                \"name\": \"dynamodb.error.request.id\"\n+                            },\n+                            {\n+                                \"description\": \"DynamoDB status code\",\n+                                \"name\": \"dynamodb.error.status.code\"\n                             }\n                         ]\n                     },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-dropbox-processors-nar\",\n+                        \"artifact\": \"nifi-aws-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\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+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"multiProcessorUseCases\": [],\n-                        \"primaryNodeOnly\": true,\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+                            \"AWS Credentials Provider service\": {\n+                                \"description\": \"The Controller Service that is used to obtain AWS credentials provider\",\n+                                \"displayName\": \"AWS Credentials Provider Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"dropbox-credential-service\",\n+                                \"name\": \"AWS Credentials Provider service\",\n                                 \"required\": true,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-dropbox-services-api-nar\",\n+                                    \"artifact\": \"nifi-aws-service-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.dropbox.credentials.service.DropboxCredentialService\",\n+                                    \"type\": \"org.apache.nifi.processors.aws.credentials.provider.service.AWSCredentialsProviderService\",\n                                     \"version\": \"2.0.0-M3\"\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+                            \"Batch items for each request (between 1 and 50)\": {\n+                                \"defaultValue\": \"1\",\n+                                \"description\": \"The items to be retrieved in one batch\",\n+                                \"displayName\": \"Batch items for each request (between 1 and 50)\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"et-initial-listing-target\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Batch items for each request (between 1 and 50)\",\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+                            \"Character set of document\": {\n+                                \"defaultValue\": \"UTF-8\",\n+                                \"description\": \"Character set of data in the document\",\n+                                \"displayName\": \"Character set of document\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Character set of document\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Communications Timeout\": {\n+                                \"defaultValue\": \"30 secs\",\n+                                \"description\": \"\",\n+                                \"displayName\": \"Communications Timeout\",\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\": \"2.0.0-M3\"\n-                                }\n+                                \"name\": \"Communications Timeout\",\n+                                \"required\": true,\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+                            \"Endpoint Override URL\": {\n+                                \"description\": \"Endpoint URL to use instead of the AWS default including scheme, host, port, and path. The AWS libraries select an endpoint URL based on the AWS region, but this property overrides the selected endpoint URL, allowing use with other S3-compatible endpoints.\",\n+                                \"displayName\": \"Endpoint Override URL\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"et-time-window\",\n+                                \"name\": \"Endpoint Override URL\",\n                                 \"required\": false,\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+                            \"Hash Key Name\": {\n+                                \"description\": \"The hash key name of the item\",\n+                                \"displayName\": \"Hash Key Name\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"folder\",\n+                                \"name\": \"Hash Key Name\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"listing-strategy\": {\n+                            \"Hash Key Value\": {\n+                                \"defaultValue\": \"${dynamodb.item.hash.key.value}\",\n+                                \"description\": \"The hash key value of the item\",\n+                                \"displayName\": \"Hash Key Value\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Hash Key Value\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Hash Key Value Type\": {\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\": \"\",\n+                                        \"displayName\": \"string\",\n+                                        \"value\": \"string\"\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+                                        \"description\": \"\",\n+                                        \"displayName\": \"number\",\n+                                        \"value\": \"number\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"string\",\n+                                \"description\": \"The hash key value type of the item\",\n+                                \"displayName\": \"Hash Key Value Type\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Hash Key Value Type\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Json Document attribute\": {\n+                                \"description\": \"The Json document to be retrieved from the dynamodb item ('s' type in the schema)\",\n+                                \"displayName\": \"Json Document attribute\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Json Document attribute\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Range Key Name\": {\n+                                \"description\": \"The range key name of the item\",\n+                                \"displayName\": \"Range Key Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Range Key Name\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Range Key Value\": {\n+                                \"defaultValue\": \"${dynamodb.item.range.key.value}\",\n+                                \"description\": \"\",\n+                                \"displayName\": \"Range Key Value\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Range Key Value\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Range Key Value Type\": {\n+                                \"allowableValues\": [\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\": \"\",\n+                                        \"displayName\": \"string\",\n+                                        \"value\": \"string\"\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\": \"number\",\n+                                        \"value\": \"number\"\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\": \"string\",\n+                                \"description\": \"The range key value type of the item\",\n+                                \"displayName\": \"Range Key Value Type\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"listing-strategy\",\n+                                \"name\": \"Range Key Value Type\",\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+                            \"Region\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-gov-east-1\",\n+                                        \"displayName\": \"AWS GovCloud (US-East)\",\n+                                        \"value\": \"us-gov-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-gov-west-1\",\n+                                        \"displayName\": \"AWS GovCloud (US-West)\",\n+                                        \"value\": \"us-gov-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : af-south-1\",\n+                                        \"displayName\": \"Africa (Cape Town)\",\n+                                        \"value\": \"af-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-east-1\",\n+                                        \"displayName\": \"Asia Pacific (Hong Kong)\",\n+                                        \"value\": \"ap-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-south-2\",\n+                                        \"displayName\": \"Asia Pacific (Hyderabad)\",\n+                                        \"value\": \"ap-south-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-southeast-3\",\n+                                        \"displayName\": \"Asia Pacific (Jakarta)\",\n+                                        \"value\": \"ap-southeast-3\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-southeast-4\",\n+                                        \"displayName\": \"Asia Pacific (Melbourne)\",\n+                                        \"value\": \"ap-southeast-4\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-south-1\",\n+                                        \"displayName\": \"Asia Pacific (Mumbai)\",\n+                                        \"value\": \"ap-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-northeast-3\",\n+                                        \"displayName\": \"Asia Pacific (Osaka)\",\n+                                        \"value\": \"ap-northeast-3\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-northeast-2\",\n+                                        \"displayName\": \"Asia Pacific (Seoul)\",\n+                                        \"value\": \"ap-northeast-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-southeast-1\",\n+                                        \"displayName\": \"Asia Pacific (Singapore)\",\n+                                        \"value\": \"ap-southeast-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-southeast-2\",\n+                                        \"displayName\": \"Asia Pacific (Sydney)\",\n+                                        \"value\": \"ap-southeast-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-northeast-1\",\n+                                        \"displayName\": \"Asia Pacific (Tokyo)\",\n+                                        \"value\": \"ap-northeast-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ca-central-1\",\n+                                        \"displayName\": \"Canada (Central)\",\n+                                        \"value\": \"ca-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ca-west-1\",\n+                                        \"displayName\": \"Canada West (Calgary)\",\n+                                        \"value\": \"ca-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : cn-north-1\",\n+                                        \"displayName\": \"China (Beijing)\",\n+                                        \"value\": \"cn-north-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : cn-northwest-1\",\n+                                        \"displayName\": \"China (Ningxia)\",\n+                                        \"value\": \"cn-northwest-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-central-1\",\n+                                        \"displayName\": \"Europe (Frankfurt)\",\n+                                        \"value\": \"eu-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-west-1\",\n+                                        \"displayName\": \"Europe (Ireland)\",\n+                                        \"value\": \"eu-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-west-2\",\n+                                        \"displayName\": \"Europe (London)\",\n+                                        \"value\": \"eu-west-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-south-1\",\n+                                        \"displayName\": \"Europe (Milan)\",\n+                                        \"value\": \"eu-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-west-3\",\n+                                        \"displayName\": \"Europe (Paris)\",\n+                                        \"value\": \"eu-west-3\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-south-2\",\n+                                        \"displayName\": \"Europe (Spain)\",\n+                                        \"value\": \"eu-south-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-north-1\",\n+                                        \"displayName\": \"Europe (Stockholm)\",\n+                                        \"value\": \"eu-north-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-central-2\",\n+                                        \"displayName\": \"Europe (Zurich)\",\n+                                        \"value\": \"eu-central-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : il-central-1\",\n+                                        \"displayName\": \"Israel (Tel Aviv)\",\n+                                        \"value\": \"il-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : me-south-1\",\n+                                        \"displayName\": \"Middle East (Bahrain)\",\n+                                        \"value\": \"me-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : me-central-1\",\n+                                        \"displayName\": \"Middle East (UAE)\",\n+                                        \"value\": \"me-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : sa-east-1\",\n+                                        \"displayName\": \"South America (Sao Paulo)\",\n+                                        \"value\": \"sa-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-east-1\",\n+                                        \"displayName\": \"US East (N. Virginia)\",\n+                                        \"value\": \"us-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-east-2\",\n+                                        \"displayName\": \"US East (Ohio)\",\n+                                        \"value\": \"us-east-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-iso-east-1\",\n+                                        \"displayName\": \"US ISO East\",\n+                                        \"value\": \"us-iso-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-iso-west-1\",\n+                                        \"displayName\": \"US ISO WEST\",\n+                                        \"value\": \"us-iso-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-isob-east-1\",\n+                                        \"displayName\": \"US ISOB East (Ohio)\",\n+                                        \"value\": \"us-isob-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-west-1\",\n+                                        \"displayName\": \"US West (N. California)\",\n+                                        \"value\": \"us-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-west-2\",\n+                                        \"displayName\": \"US West (Oregon)\",\n+                                        \"value\": \"us-west-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-cn-global\",\n+                                        \"displayName\": \"aws-cn-global\",\n+                                        \"value\": \"aws-cn-global\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-global\",\n+                                        \"displayName\": \"aws-global\",\n+                                        \"value\": \"aws-global\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-iso-b-global\",\n+                                        \"displayName\": \"aws-iso-b-global\",\n+                                        \"value\": \"aws-iso-b-global\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-iso-global\",\n+                                        \"displayName\": \"aws-iso-global\",\n+                                        \"value\": \"aws-iso-global\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-us-gov-global\",\n+                                        \"displayName\": \"aws-us-gov-global\",\n+                                        \"value\": \"aws-us-gov-global\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"us-west-2\",\n+                                \"description\": \"\",\n+                                \"displayName\": \"Region\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"min-age\",\n+                                \"name\": \"Region\",\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+                            \"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\": \"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\": \"2.0.0-M3\"\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+                            \"Table Name\": {\n+                                \"description\": \"The DynamoDB table name\",\n+                                \"displayName\": \"Table Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Table Name\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"proxy-configuration-service\": {\n+                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests.\",\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\": \"2.0.0-M3\"\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\": \"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\": \"recursive-search\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n                             }\n                         },\n+                        \"readsAttributes\": [\n+                            {\n+                                \"description\": \"Items hash key value\",\n+                                \"name\": \"  dynamodb.item.hash.key.value\"\n+                            },\n+                            {\n+                                \"description\": \"Items range key value\",\n+                                \"name\": \"  dynamodb.item.range.key.value\"\n+                            }\n+                        ],\n                         \"seeAlso\": [\n-                            \"org.apache.nifi.processors.dropbox.FetchDropbox\",\n-                            \"org.apache.nifi.processors.dropbox.PutDropbox\"\n+                            \"org.apache.nifi.processors.aws.dynamodb.DeleteDynamoDB\",\n+                            \"org.apache.nifi.processors.aws.dynamodb.GetDynamoDB\",\n+                            \"org.apache.nifi.processors.aws.dynamodb.PutDynamoDBRecord\"\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\": \"FlowFiles are routed to unprocessed relationship when DynamoDB is not able to process all the items in the request. Typical reasons are insufficient table throughput capacity and exceeding the maximum bytes per request. Unprocessed FlowFiles can be retried with a new request.\",\n+                                \"name\": \"unprocessed\"\n+                            },\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                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": false,\n+                        \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": 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-                            \"dropbox\",\n-                            \"storage\"\n+                            \"AWS\",\n+                            \"Amazon\",\n+                            \"DynamoDB\",\n+                            \"Insert\",\n+                            \"Put\"\n                         ],\n-                        \"triggerSerially\": true,\n+                        \"triggerSerially\": false,\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+                        \"type\": \"org.apache.nifi.processors.aws.dynamodb.PutDynamoDB\",\n+                        \"typeDescription\": \"Puts a document from DynamoDB based on hash and range key.  The table can have either hash and range or hash key alone. Currently the keys supported are string and number and value can be json document. In case of hash and range keys both key are required for the operation. The FlowFile content must be JSON. FlowFile content is mapped to the specified Json Document attribute in the DynamoDB item.\",\n                         \"useCases\": [],\n                         \"version\": \"2.0.0-M3\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"The Dropbox identifier of the file\",\n-                                \"name\": \"dropbox.id\"\n+                                \"description\": \"DynamoDB unprocessed keys\",\n+                                \"name\": \"dynamodb.key.error.unprocessed\"\n                             },\n                             {\n-                                \"description\": \"The folder path where the file is located\",\n-                                \"name\": \"path\"\n+                                \"description\": \"DynamoDB range key error\",\n+                                \"name\": \"dynmodb.range.key.value.error\"\n                             },\n                             {\n-                                \"description\": \"The name of the file\",\n-                                \"name\": \"filename\"\n+                                \"description\": \"DynamoDB key not found\",\n+                                \"name\": \"dynamodb.key.error.not.found\"\n                             },\n                             {\n-                                \"description\": \"The size of the file\",\n-                                \"name\": \"dropbox.size\"\n+                                \"description\": \"DynamoDB exception message\",\n+                                \"name\": \"dynamodb.error.exception.message\"\n                             },\n                             {\n-                                \"description\": \"The server modified time of the file\",\n-                                \"name\": \"dropbox.timestamp\"\n+                                \"description\": \"DynamoDB error code\",\n+                                \"name\": \"dynamodb.error.code\"\n                             },\n                             {\n-                                \"description\": \"Revision of the file\",\n-                                \"name\": \"dropbox.revision\"\n+                                \"description\": \"DynamoDB error message\",\n+                                \"name\": \"dynamodb.error.message\"\n+                            },\n+                            {\n+                                \"description\": \"DynamoDB error service\",\n+                                \"name\": \"dynamodb.error.service\"\n+                            },\n+                            {\n+                                \"description\": \"DynamoDB error is retryable\",\n+                                \"name\": \"dynamodb.error.retryable\"\n+                            },\n+                            {\n+                                \"description\": \"DynamoDB error request id\",\n+                                \"name\": \"dynamodb.error.request.id\"\n+                            },\n+                            {\n+                                \"description\": \"DynamoDB error status code\",\n+                                \"name\": \"dynamodb.error.status.code\"\n+                            },\n+                            {\n+                                \"description\": \"IO exception message on creating item\",\n+                                \"name\": \"dynamodb.item.io.error\"\n                             }\n                         ]\n                     },\n                     {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-dropbox-processors-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-aws-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -26800,205 +31515,546 @@\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"multiProcessorUseCases\": [],\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+                            \"AWS Credentials Provider service\": {\n+                                \"description\": \"The Controller Service that is used to obtain AWS credentials provider\",\n+                                \"displayName\": \"AWS Credentials Provider Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"chunked-upload-size\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n+                                \"name\": \"AWS Credentials Provider service\",\n+                                \"required\": true,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-aws-service-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.processors.aws.credentials.provider.service.AWSCredentialsProviderService\",\n+                                    \"version\": \"2.0.0-M3\"\n+                                }\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+                            \"Communications Timeout\": {\n+                                \"defaultValue\": \"30 secs\",\n+                                \"description\": \"\",\n+                                \"displayName\": \"Communications Timeout\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"chunked-upload-threshold\",\n+                                \"name\": \"Communications Timeout\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Endpoint Override URL\": {\n+                                \"description\": \"Endpoint URL to use instead of the AWS default including scheme, host, port, and path. The AWS libraries select an endpoint URL based on the AWS region, but this property overrides the selected endpoint URL, allowing use with other S3-compatible endpoints.\",\n+                                \"displayName\": \"Endpoint Override URL\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Endpoint Override URL\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"conflict-resolution-strategy\": {\n+                            \"Region\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Handle file conflict as failure.\",\n-                                        \"displayName\": \"fail\",\n-                                        \"value\": \"fail\"\n+                                        \"description\": \"AWS Region Code : us-gov-east-1\",\n+                                        \"displayName\": \"AWS GovCloud (US-East)\",\n+                                        \"value\": \"us-gov-east-1\"\n                                     },\n                                     {\n-                                        \"description\": \"Ignore conflict, do not change the original file.\",\n-                                        \"displayName\": \"ignore\",\n-                                        \"value\": \"ignore\"\n+                                        \"description\": \"AWS Region Code : us-gov-west-1\",\n+                                        \"displayName\": \"AWS GovCloud (US-West)\",\n+                                        \"value\": \"us-gov-west-1\"\n                                     },\n                                     {\n-                                        \"description\": \"Replace existing file in case of conflict.\",\n-                                        \"displayName\": \"replace\",\n-                                        \"value\": \"replace\"\n+                                        \"description\": \"AWS Region Code : af-south-1\",\n+                                        \"displayName\": \"Africa (Cape Town)\",\n+                                        \"value\": \"af-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-east-1\",\n+                                        \"displayName\": \"Asia Pacific (Hong Kong)\",\n+                                        \"value\": \"ap-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-south-2\",\n+                                        \"displayName\": \"Asia Pacific (Hyderabad)\",\n+                                        \"value\": \"ap-south-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-southeast-3\",\n+                                        \"displayName\": \"Asia Pacific (Jakarta)\",\n+                                        \"value\": \"ap-southeast-3\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-southeast-4\",\n+                                        \"displayName\": \"Asia Pacific (Melbourne)\",\n+                                        \"value\": \"ap-southeast-4\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-south-1\",\n+                                        \"displayName\": \"Asia Pacific (Mumbai)\",\n+                                        \"value\": \"ap-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-northeast-3\",\n+                                        \"displayName\": \"Asia Pacific (Osaka)\",\n+                                        \"value\": \"ap-northeast-3\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-northeast-2\",\n+                                        \"displayName\": \"Asia Pacific (Seoul)\",\n+                                        \"value\": \"ap-northeast-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-southeast-1\",\n+                                        \"displayName\": \"Asia Pacific (Singapore)\",\n+                                        \"value\": \"ap-southeast-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-southeast-2\",\n+                                        \"displayName\": \"Asia Pacific (Sydney)\",\n+                                        \"value\": \"ap-southeast-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-northeast-1\",\n+                                        \"displayName\": \"Asia Pacific (Tokyo)\",\n+                                        \"value\": \"ap-northeast-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ca-central-1\",\n+                                        \"displayName\": \"Canada (Central)\",\n+                                        \"value\": \"ca-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ca-west-1\",\n+                                        \"displayName\": \"Canada West (Calgary)\",\n+                                        \"value\": \"ca-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : cn-north-1\",\n+                                        \"displayName\": \"China (Beijing)\",\n+                                        \"value\": \"cn-north-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : cn-northwest-1\",\n+                                        \"displayName\": \"China (Ningxia)\",\n+                                        \"value\": \"cn-northwest-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-central-1\",\n+                                        \"displayName\": \"Europe (Frankfurt)\",\n+                                        \"value\": \"eu-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-west-1\",\n+                                        \"displayName\": \"Europe (Ireland)\",\n+                                        \"value\": \"eu-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-west-2\",\n+                                        \"displayName\": \"Europe (London)\",\n+                                        \"value\": \"eu-west-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-south-1\",\n+                                        \"displayName\": \"Europe (Milan)\",\n+                                        \"value\": \"eu-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-west-3\",\n+                                        \"displayName\": \"Europe (Paris)\",\n+                                        \"value\": \"eu-west-3\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-south-2\",\n+                                        \"displayName\": \"Europe (Spain)\",\n+                                        \"value\": \"eu-south-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-north-1\",\n+                                        \"displayName\": \"Europe (Stockholm)\",\n+                                        \"value\": \"eu-north-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-central-2\",\n+                                        \"displayName\": \"Europe (Zurich)\",\n+                                        \"value\": \"eu-central-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : il-central-1\",\n+                                        \"displayName\": \"Israel (Tel Aviv)\",\n+                                        \"value\": \"il-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : me-south-1\",\n+                                        \"displayName\": \"Middle East (Bahrain)\",\n+                                        \"value\": \"me-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : me-central-1\",\n+                                        \"displayName\": \"Middle East (UAE)\",\n+                                        \"value\": \"me-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : sa-east-1\",\n+                                        \"displayName\": \"South America (Sao Paulo)\",\n+                                        \"value\": \"sa-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-east-1\",\n+                                        \"displayName\": \"US East (N. Virginia)\",\n+                                        \"value\": \"us-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-east-2\",\n+                                        \"displayName\": \"US East (Ohio)\",\n+                                        \"value\": \"us-east-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-iso-east-1\",\n+                                        \"displayName\": \"US ISO East\",\n+                                        \"value\": \"us-iso-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-iso-west-1\",\n+                                        \"displayName\": \"US ISO WEST\",\n+                                        \"value\": \"us-iso-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-isob-east-1\",\n+                                        \"displayName\": \"US ISOB East (Ohio)\",\n+                                        \"value\": \"us-isob-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-west-1\",\n+                                        \"displayName\": \"US West (N. California)\",\n+                                        \"value\": \"us-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-west-2\",\n+                                        \"displayName\": \"US West (Oregon)\",\n+                                        \"value\": \"us-west-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-cn-global\",\n+                                        \"displayName\": \"aws-cn-global\",\n+                                        \"value\": \"aws-cn-global\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-global\",\n+                                        \"displayName\": \"aws-global\",\n+                                        \"value\": \"aws-global\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-iso-b-global\",\n+                                        \"displayName\": \"aws-iso-b-global\",\n+                                        \"value\": \"aws-iso-b-global\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-iso-global\",\n+                                        \"displayName\": \"aws-iso-global\",\n+                                        \"value\": \"aws-iso-global\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-us-gov-global\",\n+                                        \"displayName\": \"aws-us-gov-global\",\n+                                        \"value\": \"aws-us-gov-global\"\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\": \"us-west-2\",\n+                                \"description\": \"\",\n+                                \"displayName\": \"Region\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"conflict-resolution-strategy\",\n+                                \"name\": \"Region\",\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+                            \"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\": \"dropbox-credential-service\",\n-                                \"required\": true,\n+                                \"name\": \"SSL Context Service\",\n+                                \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-dropbox-services-api-nar\",\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.dropbox.credentials.service.DropboxCredentialService\",\n+                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n                                     \"version\": \"2.0.0-M3\"\n                                 }\n                             },\n-                            \"file-name\": {\n-                                \"defaultValue\": \"${filename}\",\n-                                \"description\": \"The full name of the file to upload.\",\n-                                \"displayName\": \"Filename\",\n+                            \"Table Name\": {\n+                                \"description\": \"The DynamoDB table name\",\n+                                \"displayName\": \"Table Name\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"file-name\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Table 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+                            \"partition-key-attribute\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"ByAttribute\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Partition Key Strategy\",\n+                                        \"propertyName\": \"partition-key-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"Specifies the FlowFile attribute that will be used as the value of the partition key when using \\\"Partition by attribute\\\" partition key strategy.\",\n+                                \"displayName\": \"Partition Key Attribute\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"folder\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"partition-key-attribute\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"partition-key-field\": {\n+                                \"description\": \"Defines the name of the partition key field in the DynamoDB table. Partition key is also known as hash key. Depending on the \\\"Partition Key Strategy\\\" the field value might come from the incoming Record or a generated one.\",\n+                                \"displayName\": \"Partition Key Field\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"partition-key-field\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"partition-key-strategy\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Uses the value of the Record field identified by the \\\"Partition Key Field\\\" property as partition key value.\",\n+                                        \"displayName\": \"Partition By Field\",\n+                                        \"value\": \"ByField\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Uses an incoming FlowFile attribute identified by \\\"Partition Key Attribute\\\" as the value of the partition key. The incoming Records must not contain field with the same name defined by the \\\"Partition Key Field\\\".\",\n+                                        \"displayName\": \"Partition By Attribute\",\n+                                        \"value\": \"ByAttribute\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Uses a generated UUID as value for the partition key. The incoming Records must not contain field with the same name defined by the \\\"Partition Key Field\\\".\",\n+                                        \"displayName\": \"Generated UUID\",\n+                                        \"value\": \"Generated\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"ByField\",\n+                                \"description\": \"Defines the strategy the processor uses to assign partition key value to the inserted Items.\",\n+                                \"displayName\": \"Partition Key Strategy\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"partition-key-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: HTTP + AuthN\",\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\": \"2.0.0-M3\"\n                                 }\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\": \"2.0.0-M3\"\n+                                }\n+                            },\n+                            \"sort-key-field\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"ByField\",\n+                                            \"BySequence\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Sort Key Strategy\",\n+                                        \"propertyName\": \"sort-key-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"Defines the name of the sort key field in the DynamoDB table. Sort key is also known as range key.\",\n+                                \"displayName\": \"Sort Key Field\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"sort-key-field\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"sort-key-strategy\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"The processor will not assign sort key to the inserted Items.\",\n+                                        \"displayName\": \"None\",\n+                                        \"value\": \"None\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Uses the value of the Record field identified by the \\\"Sort Key Field\\\" property as sort key value.\",\n+                                        \"displayName\": \"Sort By Field\",\n+                                        \"value\": \"ByField\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The processor will assign a number for every item based on the original record's position in the incoming FlowFile. This will be used as sort key value.\",\n+                                        \"displayName\": \"Generate Sequence\",\n+                                        \"value\": \"BySequence\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"None\",\n+                                \"description\": \"Defines the strategy the processor uses to assign sort key to the inserted Items.\",\n+                                \"displayName\": \"Sort Key Strategy\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"sort-key-strategy\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             }\n                         },\n                         \"readsAttributes\": [\n                             {\n-                                \"description\": \"Uses the FlowFile's filename as the filename for the Dropbox object.\",\n-                                \"name\": \"filename\"\n+                                \"description\": \"Number of chunks successfully inserted into DynamoDB. If not set, it is considered as 0\",\n+                                \"name\": \"dynamodb.chunks.processed\"\n                             }\n                         ],\n                         \"seeAlso\": [\n-                            \"org.apache.nifi.processors.dropbox.FetchDropbox\",\n-                            \"org.apache.nifi.processors.dropbox.ListDropbox\"\n+                            \"org.apache.nifi.processors.aws.dynamodb.DeleteDynamoDB\",\n+                            \"org.apache.nifi.processors.aws.dynamodb.GetDynamoDB\",\n+                            \"org.apache.nifi.processors.aws.dynamodb.PutDynamoDB\"\n                         ],\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"Files that have been successfully written to Dropbox are transferred to this relationship.\",\n+                                \"description\": \"FlowFiles are routed to unprocessed relationship when DynamoDB is not able to process all the items in the request. Typical reasons are insufficient table throughput capacity and exceeding the maximum bytes per request. Unprocessed FlowFiles can be retried with a new request.\",\n+                                \"name\": \"unprocessed\"\n+                            },\n+                            {\n+                                \"description\": \"FlowFiles are routed to success relationship\",\n                                 \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"Files that could not be written to Dropbox for some reason are transferred to this relationship.\",\n+                                \"description\": \"FlowFiles are routed to 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                         \"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+                                \"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                         \"tags\": [\n-                            \"dropbox\",\n-                            \"put\",\n-                            \"storage\"\n+                            \"AWS\",\n+                            \"Amazon\",\n+                            \"DynamoDB\",\n+                            \"Insert\",\n+                            \"Put\",\n+                            \"Record\"\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+                        \"type\": \"org.apache.nifi.processors.aws.dynamodb.PutDynamoDBRecord\",\n+                        \"typeDescription\": \"Inserts items into DynamoDB based on record-oriented data. The record fields are mapped into DynamoDB item fields, including partition and sort keys if set. Depending on the number of records the processor might execute the insert in multiple chunks in order to overcome DynamoDB's limitation on batch writing. This might result partially processed FlowFiles in which case the FlowFile will be transferred to the \\\"unprocessed\\\" relationship with the necessary attribute to retry later without duplicating the already executed inserts.\",\n                         \"useCases\": [],\n                         \"version\": \"2.0.0-M3\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"The error message returned by Dropbox\",\n-                                \"name\": \"error.message\"\n+                                \"description\": \"Number of chunks successfully inserted into DynamoDB. If not set, it is considered as 0\",\n+                                \"name\": \"dynamodb.chunks.processed\"\n                             },\n                             {\n-                                \"description\": \"The Dropbox identifier of the file\",\n-                                \"name\": \"dropbox.id\"\n+                                \"description\": \"DynamoDB unprocessed keys\",\n+                                \"name\": \"dynamodb.key.error.unprocessed\"\n                             },\n                             {\n-                                \"description\": \"The folder path where the file is located\",\n-                                \"name\": \"path\"\n+                                \"description\": \"DynamoDB range key error\",\n+                                \"name\": \"dynmodb.range.key.value.error\"\n                             },\n                             {\n-                                \"description\": \"The name of the file\",\n-                                \"name\": \"filename\"\n+                                \"description\": \"DynamoDB key not found\",\n+                                \"name\": \"dynamodb.key.error.not.found\"\n                             },\n                             {\n-                                \"description\": \"The size of the file\",\n-                                \"name\": \"dropbox.size\"\n+                                \"description\": \"DynamoDB exception message\",\n+                                \"name\": \"dynamodb.error.exception.message\"\n                             },\n                             {\n-                                \"description\": \"The server modified time of the file\",\n-                                \"name\": \"dropbox.timestamp\"\n+                                \"description\": \"DynamoDB error code\",\n+                                \"name\": \"dynamodb.error.code\"\n                             },\n                             {\n-                                \"description\": \"Revision of the file\",\n-                                \"name\": \"dropbox.revision\"\n+                                \"description\": \"DynamoDB error message\",\n+                                \"name\": \"dynamodb.error.message\"\n+                            },\n+                            {\n+                                \"description\": \"DynamoDB error service\",\n+                                \"name\": \"dynamodb.error.service\"\n+                            },\n+                            {\n+                                \"description\": \"DynamoDB error is retryable\",\n+                                \"name\": \"dynamodb.error.retryable\"\n+                            },\n+                            {\n+                                \"description\": \"DynamoDB error request id\",\n+                                \"name\": \"dynamodb.error.request.id\"\n+                            },\n+                            {\n+                                \"description\": \"DynamoDB error status code\",\n+                                \"name\": \"dynamodb.error.status.code\"\n+                            },\n+                            {\n+                                \"description\": \"IO exception message on creating item\",\n+                                \"name\": \"dynamodb.item.io.error\"\n                             }\n                         ]\n-                    }\n-                ],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"2.0.0-M3\"\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+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-aws-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -27011,108 +32067,370 @@\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"multiProcessorUseCases\": [],\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+                            \"AWS Credentials Provider service\": {\n+                                \"description\": \"The Controller Service that is used to obtain AWS credentials provider\",\n+                                \"displayName\": \"AWS Credentials Provider Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"AWS Credentials Provider service\",\n+                                \"required\": true,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-aws-service-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.processors.aws.credentials.provider.service.AWSCredentialsProviderService\",\n+                                    \"version\": \"2.0.0-M3\"\n+                                }\n+                            },\n+                            \"Amazon Kinesis Firehose Delivery Stream Name\": {\n+                                \"description\": \"The name of kinesis firehose delivery stream\",\n+                                \"displayName\": \"Amazon Kinesis Firehose Delivery Stream Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Amazon Kinesis Firehose Delivery Stream Name\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Batch Size\": {\n+                                \"defaultValue\": \"250\",\n+                                \"description\": \"Batch size for messages (1-500).\",\n+                                \"displayName\": \"Batch Size\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Batch Size\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Communications Timeout\": {\n+                                \"defaultValue\": \"30 secs\",\n+                                \"description\": \"\",\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+                            \"Endpoint Override URL\": {\n+                                \"description\": \"Endpoint URL to use instead of the AWS default including scheme, host, port, and path. The AWS libraries select an endpoint URL based on the AWS region, but this property overrides the selected endpoint URL, allowing use with other S3-compatible endpoints.\",\n+                                \"displayName\": \"Endpoint Override URL\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Endpoint Override URL\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Max message buffer size\": {\n+                                \"defaultValue\": \"1 MB\",\n+                                \"description\": \"Max message buffer\",\n+                                \"displayName\": \"Max message buffer size\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Max message buffer size\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Region\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-gov-east-1\",\n+                                        \"displayName\": \"AWS GovCloud (US-East)\",\n+                                        \"value\": \"us-gov-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-gov-west-1\",\n+                                        \"displayName\": \"AWS GovCloud (US-West)\",\n+                                        \"value\": \"us-gov-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : af-south-1\",\n+                                        \"displayName\": \"Africa (Cape Town)\",\n+                                        \"value\": \"af-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-east-1\",\n+                                        \"displayName\": \"Asia Pacific (Hong Kong)\",\n+                                        \"value\": \"ap-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-south-2\",\n+                                        \"displayName\": \"Asia Pacific (Hyderabad)\",\n+                                        \"value\": \"ap-south-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-southeast-3\",\n+                                        \"displayName\": \"Asia Pacific (Jakarta)\",\n+                                        \"value\": \"ap-southeast-3\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-southeast-4\",\n+                                        \"displayName\": \"Asia Pacific (Melbourne)\",\n+                                        \"value\": \"ap-southeast-4\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-south-1\",\n+                                        \"displayName\": \"Asia Pacific (Mumbai)\",\n+                                        \"value\": \"ap-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-northeast-3\",\n+                                        \"displayName\": \"Asia Pacific (Osaka)\",\n+                                        \"value\": \"ap-northeast-3\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-northeast-2\",\n+                                        \"displayName\": \"Asia Pacific (Seoul)\",\n+                                        \"value\": \"ap-northeast-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-southeast-1\",\n+                                        \"displayName\": \"Asia Pacific (Singapore)\",\n+                                        \"value\": \"ap-southeast-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-southeast-2\",\n+                                        \"displayName\": \"Asia Pacific (Sydney)\",\n+                                        \"value\": \"ap-southeast-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-northeast-1\",\n+                                        \"displayName\": \"Asia Pacific (Tokyo)\",\n+                                        \"value\": \"ap-northeast-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ca-central-1\",\n+                                        \"displayName\": \"Canada (Central)\",\n+                                        \"value\": \"ca-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ca-west-1\",\n+                                        \"displayName\": \"Canada West (Calgary)\",\n+                                        \"value\": \"ca-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : cn-north-1\",\n+                                        \"displayName\": \"China (Beijing)\",\n+                                        \"value\": \"cn-north-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : cn-northwest-1\",\n+                                        \"displayName\": \"China (Ningxia)\",\n+                                        \"value\": \"cn-northwest-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-central-1\",\n+                                        \"displayName\": \"Europe (Frankfurt)\",\n+                                        \"value\": \"eu-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-west-1\",\n+                                        \"displayName\": \"Europe (Ireland)\",\n+                                        \"value\": \"eu-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-west-2\",\n+                                        \"displayName\": \"Europe (London)\",\n+                                        \"value\": \"eu-west-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-south-1\",\n+                                        \"displayName\": \"Europe (Milan)\",\n+                                        \"value\": \"eu-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-west-3\",\n+                                        \"displayName\": \"Europe (Paris)\",\n+                                        \"value\": \"eu-west-3\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-south-2\",\n+                                        \"displayName\": \"Europe (Spain)\",\n+                                        \"value\": \"eu-south-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-north-1\",\n+                                        \"displayName\": \"Europe (Stockholm)\",\n+                                        \"value\": \"eu-north-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-central-2\",\n+                                        \"displayName\": \"Europe (Zurich)\",\n+                                        \"value\": \"eu-central-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : il-central-1\",\n+                                        \"displayName\": \"Israel (Tel Aviv)\",\n+                                        \"value\": \"il-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : me-south-1\",\n+                                        \"displayName\": \"Middle East (Bahrain)\",\n+                                        \"value\": \"me-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : me-central-1\",\n+                                        \"displayName\": \"Middle East (UAE)\",\n+                                        \"value\": \"me-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : sa-east-1\",\n+                                        \"displayName\": \"South America (Sao Paulo)\",\n+                                        \"value\": \"sa-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-east-1\",\n+                                        \"displayName\": \"US East (N. Virginia)\",\n+                                        \"value\": \"us-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-east-2\",\n+                                        \"displayName\": \"US East (Ohio)\",\n+                                        \"value\": \"us-east-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-iso-east-1\",\n+                                        \"displayName\": \"US ISO East\",\n+                                        \"value\": \"us-iso-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-iso-west-1\",\n+                                        \"displayName\": \"US ISO WEST\",\n+                                        \"value\": \"us-iso-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-isob-east-1\",\n+                                        \"displayName\": \"US ISOB East (Ohio)\",\n+                                        \"value\": \"us-isob-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-west-1\",\n+                                        \"displayName\": \"US West (N. California)\",\n+                                        \"value\": \"us-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-west-2\",\n+                                        \"displayName\": \"US West (Oregon)\",\n+                                        \"value\": \"us-west-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-cn-global\",\n+                                        \"displayName\": \"aws-cn-global\",\n+                                        \"value\": \"aws-cn-global\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-global\",\n+                                        \"displayName\": \"aws-global\",\n+                                        \"value\": \"aws-global\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-iso-b-global\",\n+                                        \"displayName\": \"aws-iso-b-global\",\n+                                        \"value\": \"aws-iso-b-global\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-iso-global\",\n+                                        \"displayName\": \"aws-iso-global\",\n+                                        \"value\": \"aws-iso-global\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-us-gov-global\",\n+                                        \"displayName\": \"aws-us-gov-global\",\n+                                        \"value\": \"aws-us-gov-global\"\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+                                \"defaultValue\": \"us-west-2\",\n+                                \"description\": \"\",\n+                                \"displayName\": \"Region\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"FIELDS_DESTINATION\",\n+                                \"name\": \"Region\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n+                            },\n+                            \"proxy-configuration-service\": {\n+                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests.\",\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\": \"2.0.0-M3\"\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+                        \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"Any FlowFile that is successfully parsed as a netflowv5 data will be transferred to this Relationship.\",\n+                                \"description\": \"FlowFiles are routed to success 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+                                \"description\": \"FlowFiles are routed to failure relationship\",\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                         ],\n                         \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"attributes\",\n-                            \"byte\",\n-                            \"datagram\",\n-                            \"netflow\",\n-                            \"network\",\n-                            \"packet\",\n-                            \"v5\"\n+                            \"amazon\",\n+                            \"aws\",\n+                            \"firehose\",\n+                            \"kinesis\",\n+                            \"put\",\n+                            \"stream\"\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+                        \"type\": \"org.apache.nifi.processors.aws.kinesis.firehose.PutKinesisFirehose\",\n+                        \"typeDescription\": \"Sends the contents to a specified Amazon Kinesis Firehose. In order to send data to firehose, the firehose delivery stream name has to be specified.\",\n                         \"useCases\": [],\n                         \"version\": \"2.0.0-M3\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"The key and value generated by the parsing of the header fields.\",\n-                                \"name\": \"netflowv5.header.*\"\n+                                \"description\": \"Error message on posting message to AWS Kinesis Firehose\",\n+                                \"name\": \"aws.kinesis.firehose.error.message\"\n                             },\n                             {\n-                                \"description\": \"The key and value generated by the parsing of the record fields.\",\n-                                \"name\": \"netflowv5.record.*\"\n+                                \"description\": \"Error code for the message when posting to AWS Kinesis Firehose\",\n+                                \"name\": \"aws.kinesis.firehose.error.code\"\n+                            },\n+                            {\n+                                \"description\": \"Record id of the message posted to Kinesis Firehose\",\n+                                \"name\": \"aws.kinesis.firehose.record.id\"\n                             }\n                         ]\n-                    }\n-                ],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"2.0.0-M3\"\n-        },\n-        {\n-            \"artifact\": \"nifi-workday-processors-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [],\n-                \"processors\": [\n+                    },\n                     {\n                         \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-workday-processors-nar\",\n+                        \"artifact\": \"nifi-aws-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -27120,296 +32438,573 @@\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\": \"Override default KCL Configuration ConfigsBuilder properties with required values. Supports setting of values directly on the ConfigsBuilder, such as 'namespace', as well as properties on nested builders. For example, to set configsBuilder.retrievalConfig().maxListShardsRetryAttempts(value), name the property as 'retrievalConfig.maxListShardsRetryAttempts'. Only supports setting of simple property values, e.g. String, int, long and boolean. Does not allow override of KCL Configuration settings handled by non-dynamic processor properties.\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"name\": \"Kinesis Client Library (KCL) Configuration property name\",\n+                                \"value\": \"Value to set in the KCL Configuration property\"\n+                            }\n+                        ],\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_ALLOWED\",\n+                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n                         \"multiProcessorUseCases\": [],\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+                            \"AWS Credentials Provider service\": {\n+                                \"description\": \"The Controller Service that is used to obtain AWS credentials provider\",\n+                                \"displayName\": \"AWS Credentials Provider Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Web Client Service Provider\",\n+                                \"name\": \"AWS Credentials Provider service\",\n                                 \"required\": true,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"artifact\": \"nifi-aws-service-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.web.client.provider.api.WebClientServiceProvider\",\n+                                    \"type\": \"org.apache.nifi.processors.aws.credentials.provider.service.AWSCredentialsProviderService\",\n                                     \"version\": \"2.0.0-M3\"\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+                            \"Communications Timeout\": {\n+                                \"defaultValue\": \"30 secs\",\n+                                \"description\": \"\",\n+                                \"displayName\": \"Communications Timeout\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Workday Password\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Communications Timeout\",\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+                            \"Endpoint Override URL\": {\n+                                \"description\": \"Endpoint URL to use instead of the AWS default including scheme, host, port, and path. The AWS libraries select an endpoint URL based on the AWS region, but this property overrides the selected endpoint URL, allowing use with other S3-compatible endpoints.\",\n+                                \"displayName\": \"Endpoint Override URL\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Workday Report URL\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Endpoint Override URL\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Region\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-gov-east-1\",\n+                                        \"displayName\": \"AWS GovCloud (US-East)\",\n+                                        \"value\": \"us-gov-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-gov-west-1\",\n+                                        \"displayName\": \"AWS GovCloud (US-West)\",\n+                                        \"value\": \"us-gov-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : af-south-1\",\n+                                        \"displayName\": \"Africa (Cape Town)\",\n+                                        \"value\": \"af-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-east-1\",\n+                                        \"displayName\": \"Asia Pacific (Hong Kong)\",\n+                                        \"value\": \"ap-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-south-2\",\n+                                        \"displayName\": \"Asia Pacific (Hyderabad)\",\n+                                        \"value\": \"ap-south-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-southeast-3\",\n+                                        \"displayName\": \"Asia Pacific (Jakarta)\",\n+                                        \"value\": \"ap-southeast-3\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-southeast-4\",\n+                                        \"displayName\": \"Asia Pacific (Melbourne)\",\n+                                        \"value\": \"ap-southeast-4\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-south-1\",\n+                                        \"displayName\": \"Asia Pacific (Mumbai)\",\n+                                        \"value\": \"ap-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-northeast-3\",\n+                                        \"displayName\": \"Asia Pacific (Osaka)\",\n+                                        \"value\": \"ap-northeast-3\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-northeast-2\",\n+                                        \"displayName\": \"Asia Pacific (Seoul)\",\n+                                        \"value\": \"ap-northeast-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-southeast-1\",\n+                                        \"displayName\": \"Asia Pacific (Singapore)\",\n+                                        \"value\": \"ap-southeast-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-southeast-2\",\n+                                        \"displayName\": \"Asia Pacific (Sydney)\",\n+                                        \"value\": \"ap-southeast-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-northeast-1\",\n+                                        \"displayName\": \"Asia Pacific (Tokyo)\",\n+                                        \"value\": \"ap-northeast-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ca-central-1\",\n+                                        \"displayName\": \"Canada (Central)\",\n+                                        \"value\": \"ca-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ca-west-1\",\n+                                        \"displayName\": \"Canada West (Calgary)\",\n+                                        \"value\": \"ca-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : cn-north-1\",\n+                                        \"displayName\": \"China (Beijing)\",\n+                                        \"value\": \"cn-north-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : cn-northwest-1\",\n+                                        \"displayName\": \"China (Ningxia)\",\n+                                        \"value\": \"cn-northwest-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-central-1\",\n+                                        \"displayName\": \"Europe (Frankfurt)\",\n+                                        \"value\": \"eu-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-west-1\",\n+                                        \"displayName\": \"Europe (Ireland)\",\n+                                        \"value\": \"eu-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-west-2\",\n+                                        \"displayName\": \"Europe (London)\",\n+                                        \"value\": \"eu-west-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-south-1\",\n+                                        \"displayName\": \"Europe (Milan)\",\n+                                        \"value\": \"eu-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-west-3\",\n+                                        \"displayName\": \"Europe (Paris)\",\n+                                        \"value\": \"eu-west-3\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-south-2\",\n+                                        \"displayName\": \"Europe (Spain)\",\n+                                        \"value\": \"eu-south-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-north-1\",\n+                                        \"displayName\": \"Europe (Stockholm)\",\n+                                        \"value\": \"eu-north-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-central-2\",\n+                                        \"displayName\": \"Europe (Zurich)\",\n+                                        \"value\": \"eu-central-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : il-central-1\",\n+                                        \"displayName\": \"Israel (Tel Aviv)\",\n+                                        \"value\": \"il-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : me-south-1\",\n+                                        \"displayName\": \"Middle East (Bahrain)\",\n+                                        \"value\": \"me-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : me-central-1\",\n+                                        \"displayName\": \"Middle East (UAE)\",\n+                                        \"value\": \"me-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : sa-east-1\",\n+                                        \"displayName\": \"South America (Sao Paulo)\",\n+                                        \"value\": \"sa-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-east-1\",\n+                                        \"displayName\": \"US East (N. Virginia)\",\n+                                        \"value\": \"us-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-east-2\",\n+                                        \"displayName\": \"US East (Ohio)\",\n+                                        \"value\": \"us-east-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-iso-east-1\",\n+                                        \"displayName\": \"US ISO East\",\n+                                        \"value\": \"us-iso-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-iso-west-1\",\n+                                        \"displayName\": \"US ISO WEST\",\n+                                        \"value\": \"us-iso-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-isob-east-1\",\n+                                        \"displayName\": \"US ISOB East (Ohio)\",\n+                                        \"value\": \"us-isob-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-west-1\",\n+                                        \"displayName\": \"US West (N. California)\",\n+                                        \"value\": \"us-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-west-2\",\n+                                        \"displayName\": \"US West (Oregon)\",\n+                                        \"value\": \"us-west-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-cn-global\",\n+                                        \"displayName\": \"aws-cn-global\",\n+                                        \"value\": \"aws-cn-global\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-global\",\n+                                        \"displayName\": \"aws-global\",\n+                                        \"value\": \"aws-global\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-iso-b-global\",\n+                                        \"displayName\": \"aws-iso-b-global\",\n+                                        \"value\": \"aws-iso-b-global\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-iso-global\",\n+                                        \"displayName\": \"aws-iso-global\",\n+                                        \"value\": \"aws-iso-global\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-us-gov-global\",\n+                                        \"displayName\": \"aws-us-gov-global\",\n+                                        \"value\": \"aws-us-gov-global\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"us-west-2\",\n+                                \"description\": \"\",\n+                                \"displayName\": \"Region\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Region\",\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+                            \"amazon-kinesis-stream-application-name\": {\n+                                \"description\": \"The Kinesis stream reader application name.\",\n+                                \"displayName\": \"Application Name\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Workday Username\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"amazon-kinesis-stream-application-name\",\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+                            \"amazon-kinesis-stream-checkpoint-interval\": {\n+                                \"defaultValue\": \"3 secs\",\n+                                \"description\": \"Interval between Kinesis checkpoints\",\n+                                \"displayName\": \"Checkpoint Interval\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"amazon-kinesis-stream-checkpoint-interval\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"amazon-kinesis-stream-cloudwatch-flag\": {\n+                                \"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 report Kinesis usage metrics to CloudWatch.\",\n+                                \"displayName\": \"Report Metrics to CloudWatch\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"amazon-kinesis-stream-cloudwatch-flag\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"amazon-kinesis-stream-dynamodb-override\": {\n+                                \"description\": \"DynamoDB override to use non-AWS deployments\",\n+                                \"displayName\": \"DynamoDB Override\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"amazon-kinesis-stream-dynamodb-override\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"amazon-kinesis-stream-failover-timeout\": {\n+                                \"defaultValue\": \"30 secs\",\n+                                \"description\": \"Kinesis Client Library failover timeout\",\n+                                \"displayName\": \"Failover Timeout\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"amazon-kinesis-stream-failover-timeout\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"amazon-kinesis-stream-graceful-shutdown-timeout\": {\n+                                \"defaultValue\": \"20 secs\",\n+                                \"description\": \"Kinesis Client Library graceful shutdown timeout\",\n+                                \"displayName\": \"Graceful Shutdown Timeout\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"amazon-kinesis-stream-graceful-shutdown-timeout\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"amazon-kinesis-stream-initial-position\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Start reading just after the most recent record in the shard, so that you always read the most recent data in the shard.\",\n+                                        \"displayName\": \"LATEST\",\n+                                        \"value\": \"LATEST\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Start reading at the last untrimmed record in the shard in the system, which is the oldest data record in the shard.\",\n+                                        \"displayName\": \"TRIM_HORIZON\",\n+                                        \"value\": \"TRIM_HORIZON\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Start reading from the position denoted by a specific time stamp, provided in the value Timestamp.\",\n+                                        \"displayName\": \"AT_TIMESTAMP\",\n+                                        \"value\": \"AT_TIMESTAMP\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"LATEST\",\n+                                \"description\": \"Initial position to read Kinesis streams.\",\n+                                \"displayName\": \"Initial Stream Position\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"amazon-kinesis-stream-initial-position\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"amazon-kinesis-stream-position-timestamp\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"AT_TIMESTAMP\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Initial Stream Position\",\n+                                        \"propertyName\": \"amazon-kinesis-stream-initial-position\"\n+                                    }\n+                                ],\n+                                \"description\": \"Timestamp position in stream from which to start reading Kinesis Records. Required if Initial position to read Kinesis streams. is AT_TIMESTAMP. Uses the Timestamp Format to parse value into a Date.\",\n+                                \"displayName\": \"Stream Position Timestamp\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"amazon-kinesis-stream-position-timestamp\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"amazon-kinesis-stream-record-reader\": {\n+                                \"description\": \"The Record Reader to use for reading received messages. The Kinesis Stream name can be referred to by Expression Language '${kinesis.name}' to access a schema. If Record Reader/Writer are not specified, each Kinesis Record will create a FlowFile.\",\n                                 \"displayName\": \"Record Reader\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"record-reader\",\n+                                \"name\": \"amazon-kinesis-stream-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\": \"2.0.0-M3\"\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 to an output FlowFile.\",\n+                            \"amazon-kinesis-stream-record-writer\": {\n+                                \"description\": \"The Record Writer to use for serializing Records to an output FlowFile. The Kinesis Stream name can be referred to by Expression Language '${kinesis.name}' to access a schema. If Record Reader/Writer are not specified, each Kinesis Record 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+                                \"name\": \"amazon-kinesis-stream-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\": \"2.0.0-M3\"\n                                 }\n+                            },\n+                            \"amazon-kinesis-stream-retry-count\": {\n+                                \"defaultValue\": \"10\",\n+                                \"description\": \"Number of times to retry a Kinesis operation (process record, checkpoint, shutdown)\",\n+                                \"displayName\": \"Retry Count\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"amazon-kinesis-stream-retry-count\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"amazon-kinesis-stream-retry-wait\": {\n+                                \"defaultValue\": \"1 sec\",\n+                                \"description\": \"Interval between Kinesis operation retries (process record, checkpoint, shutdown)\",\n+                                \"displayName\": \"Retry Wait\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"amazon-kinesis-stream-retry-wait\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"amazon-kinesis-stream-timestamp-format\": {\n+                                \"defaultValue\": \"yyyy-MM-dd HH:mm:ss\",\n+                                \"description\": \"Format to use for parsing the Stream Position Timestamp into a Date and converting the Kinesis Record's Approximate Arrival Timestamp into a FlowFile attribute.\",\n+                                \"displayName\": \"Timestamp Format\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"amazon-kinesis-stream-timestamp-format\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"kinesis-stream-name\": {\n+                                \"description\": \"The name of Kinesis Stream\",\n+                                \"displayName\": \"Amazon Kinesis Stream Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"kinesis-stream-name\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"proxy-configuration-service\": {\n+                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests.\",\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\": \"2.0.0-M3\"\n+                                }\n                             }\n                         },\n-                        \"sideEffectFree\": true,\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.aws.kinesis.stream.PutKinesisStream\"\n+                        ],\n+                        \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"Response FlowFiles transferred when receiving HTTP responses with a status code between 200 and 299.\",\n+                                \"description\": \"FlowFiles are routed to success relationship\",\n                                 \"name\": \"success\"\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 200 and 299.\",\n-                                \"name\": \"original\"\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                         \"supportsSensitiveDynamicProperties\": false,\n+                        \"systemResourceConsiderations\": [\n+                            {\n+                                \"description\": \"Kinesis Client Library is used to create a Worker thread for consumption of Kinesis Records. The Worker is initialised and started when this Processor has been triggered. It runs continually, spawning Kinesis Record Processors as required to fetch Kinesis Records. The Worker Thread (and any child Record Processor threads) are not controlled by the normal NiFi scheduler as part of the Concurrent Thread pool and are not released until this processor is stopped.\",\n+                                \"resource\": \"CPU\"\n+                            },\n+                            {\n+                                \"description\": \"Kinesis Client Library will continually poll for new Records, requesting up to a maximum number of Records/bytes per call. This can result in sustained network usage.\",\n+                                \"resource\": \"NETWORK\"\n+                            }\n+                        ],\n                         \"tags\": [\n-                            \"Workday\",\n-                            \"report\"\n+                            \"amazon\",\n+                            \"aws\",\n+                            \"consume\",\n+                            \"kinesis\",\n+                            \"stream\"\n                         ],\n-                        \"triggerSerially\": false,\n+                        \"triggerSerially\": true,\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.aws.kinesis.stream.ConsumeKinesisStream\",\n+                        \"typeDescription\": \"Reads data from the specified AWS Kinesis stream and outputs a FlowFile for every processed Record (raw)  or a FlowFile for a batch of processed records if a Record Reader and Record Writer are configured. At-least-once delivery of all Kinesis Records within the Stream while the processor is running. AWS Kinesis Client Library can take several seconds to initialise before starting to fetch data. Uses DynamoDB for check pointing and CloudWatch (optional) for metrics. Ensure that the credentials provided have access to DynamoDB and CloudWatch (optional) along with Kinesis.\",\n                         \"useCases\": [],\n                         \"version\": \"2.0.0-M3\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"The Java exception class raised when the processor fails\",\n-                                \"name\": \"getworkdayreport.java.exception.class\"\n+                                \"description\": \"Partition key of the (last) Kinesis Record read from the Shard\",\n+                                \"name\": \"aws.kinesis.partition.key\"\n                             },\n                             {\n-                                \"description\": \"The Java exception message raised when the processor fails\",\n-                                \"name\": \"getworkdayreport.java.exception.message\"\n+                                \"description\": \"Shard ID from which the Kinesis Record was read\",\n+                                \"name\": \"aws.kinesis.shard.id\"\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 unique identifier of the (last) Kinesis Record within its Shard\",\n+                                \"name\": \"aws.kinesis.sequence.number\"\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-                            }\n-                        ]\n-                    }\n-                ],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"2.0.0-M3\"\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\": \"f2215c6\"\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+                                \"description\": \"Approximate arrival timestamp of the (last) Kinesis Record read from the stream\",\n+                                \"name\": \"aws.kinesis.approximate.arrival.timestamp\"\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+                                \"description\": \"Sets the mime.type attribute to the MIME Type specified by the Record Writer (if configured)\",\n+                                \"name\": \"mime.type\"\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-pgp-service-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"f2215c6\"\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+                                \"description\": \"Number of records written to the FlowFiles by the Record Writer (if configured)\",\n+                                \"name\": \"record.count\"\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"2.0.0-M3\"\n+                                \"description\": \"This attribute provides on failure the error message encountered by the Record Reader or Record Writer (if configured)\",\n+                                \"name\": \"record.error.message\"\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\": \"2.0.0-M3\"\n-                    }\n-                ],\n-                \"processors\": [],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"2.0.0-M3\"\n-        },\n-        {\n-            \"artifact\": \"nifi-compress-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [],\n-                \"processors\": [\n+                        ]\n+                    },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-compress-nar\",\n+                        \"artifact\": \"nifi-aws-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -27422,764 +33017,1154 @@\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"multiProcessorUseCases\": [],\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Input Compression Strategy\": {\n+                            \"AWS Credentials Provider service\": {\n+                                \"description\": \"The Controller Service that is used to obtain AWS credentials provider\",\n+                                \"displayName\": \"AWS Credentials Provider Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"AWS Credentials Provider service\",\n+                                \"required\": true,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-aws-service-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.processors.aws.credentials.provider.service.AWSCredentialsProviderService\",\n+                                    \"version\": \"2.0.0-M3\"\n+                                }\n+                            },\n+                            \"Communications Timeout\": {\n+                                \"defaultValue\": \"30 secs\",\n+                                \"description\": \"\",\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+                            \"Endpoint Override URL\": {\n+                                \"description\": \"Endpoint URL to use instead of the AWS default including scheme, host, port, and path. The AWS libraries select an endpoint URL based on the AWS region, but this property overrides the selected endpoint URL, allowing use with other S3-compatible endpoints.\",\n+                                \"displayName\": \"Endpoint Override URL\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Endpoint Override URL\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Region\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"No Compression\",\n-                                        \"displayName\": \"no compression\",\n-                                        \"value\": \"no compression\"\n+                                        \"description\": \"AWS Region Code : us-gov-east-1\",\n+                                        \"displayName\": \"AWS GovCloud (US-East)\",\n+                                        \"value\": \"us-gov-east-1\"\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+                                        \"description\": \"AWS Region Code : us-gov-west-1\",\n+                                        \"displayName\": \"AWS GovCloud (US-West)\",\n+                                        \"value\": \"us-gov-west-1\"\n                                     },\n                                     {\n-                                        \"description\": \"GZIP\",\n-                                        \"displayName\": \"gzip\",\n-                                        \"value\": \"gzip\"\n+                                        \"description\": \"AWS Region Code : af-south-1\",\n+                                        \"displayName\": \"Africa (Cape Town)\",\n+                                        \"value\": \"af-south-1\"\n                                     },\n                                     {\n-                                        \"description\": \"Deflate\",\n-                                        \"displayName\": \"deflate\",\n-                                        \"value\": \"deflate\"\n+                                        \"description\": \"AWS Region Code : ap-east-1\",\n+                                        \"displayName\": \"Asia Pacific (Hong Kong)\",\n+                                        \"value\": \"ap-east-1\"\n                                     },\n                                     {\n-                                        \"description\": \"BZIP2\",\n-                                        \"displayName\": \"bzip2\",\n-                                        \"value\": \"bzip2\"\n+                                        \"description\": \"AWS Region Code : ap-south-2\",\n+                                        \"displayName\": \"Asia Pacific (Hyderabad)\",\n+                                        \"value\": \"ap-south-2\"\n                                     },\n                                     {\n-                                        \"description\": \"XZ-LZMA2\",\n-                                        \"displayName\": \"xz-lzma2\",\n-                                        \"value\": \"xz-lzma2\"\n+                                        \"description\": \"AWS Region Code : ap-southeast-3\",\n+                                        \"displayName\": \"Asia Pacific (Jakarta)\",\n+                                        \"value\": \"ap-southeast-3\"\n                                     },\n                                     {\n-                                        \"description\": \"LZMA\",\n-                                        \"displayName\": \"lzma\",\n-                                        \"value\": \"lzma\"\n+                                        \"description\": \"AWS Region Code : ap-southeast-4\",\n+                                        \"displayName\": \"Asia Pacific (Melbourne)\",\n+                                        \"value\": \"ap-southeast-4\"\n                                     },\n                                     {\n-                                        \"description\": \"Snappy\",\n-                                        \"displayName\": \"snappy\",\n-                                        \"value\": \"snappy\"\n+                                        \"description\": \"AWS Region Code : ap-south-1\",\n+                                        \"displayName\": \"Asia Pacific (Mumbai)\",\n+                                        \"value\": \"ap-south-1\"\n                                     },\n                                     {\n-                                        \"description\": \"Snappy-Framed\",\n-                                        \"displayName\": \"snappy-framed\",\n-                                        \"value\": \"snappy-framed\"\n+                                        \"description\": \"AWS Region Code : ap-northeast-3\",\n+                                        \"displayName\": \"Asia Pacific (Osaka)\",\n+                                        \"value\": \"ap-northeast-3\"\n                                     },\n                                     {\n-                                        \"description\": \"LZ4\",\n-                                        \"displayName\": \"lz4-framed\",\n-                                        \"value\": \"lz4-framed\"\n+                                        \"description\": \"AWS Region Code : ap-northeast-2\",\n+                                        \"displayName\": \"Asia Pacific (Seoul)\",\n+                                        \"value\": \"ap-northeast-2\"\n                                     },\n                                     {\n-                                        \"description\": \"ZSTD\",\n-                                        \"displayName\": \"zstd\",\n-                                        \"value\": \"zstd\"\n+                                        \"description\": \"AWS Region Code : ap-southeast-1\",\n+                                        \"displayName\": \"Asia Pacific (Singapore)\",\n+                                        \"value\": \"ap-southeast-1\"\n                                     },\n                                     {\n-                                        \"description\": \"Brotli\",\n-                                        \"displayName\": \"brotli\",\n-                                        \"value\": \"brotli\"\n-                                    }\n-                                ],\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\": \"Input Compression Strategy\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Output Compression Level\": {\n-                                \"allowableValues\": [\n+                                        \"description\": \"AWS Region Code : ap-southeast-2\",\n+                                        \"displayName\": \"Asia Pacific (Sydney)\",\n+                                        \"value\": \"ap-southeast-2\"\n+                                    },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"0\",\n-                                        \"value\": \"0\"\n+                                        \"description\": \"AWS Region Code : ap-northeast-1\",\n+                                        \"displayName\": \"Asia Pacific (Tokyo)\",\n+                                        \"value\": \"ap-northeast-1\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"1\",\n-                                        \"value\": \"1\"\n+                                        \"description\": \"AWS Region Code : ca-central-1\",\n+                                        \"displayName\": \"Canada (Central)\",\n+                                        \"value\": \"ca-central-1\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"2\",\n-                                        \"value\": \"2\"\n+                                        \"description\": \"AWS Region Code : ca-west-1\",\n+                                        \"displayName\": \"Canada West (Calgary)\",\n+                                        \"value\": \"ca-west-1\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"3\",\n-                                        \"value\": \"3\"\n+                                        \"description\": \"AWS Region Code : cn-north-1\",\n+                                        \"displayName\": \"China (Beijing)\",\n+                                        \"value\": \"cn-north-1\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"4\",\n-                                        \"value\": \"4\"\n+                                        \"description\": \"AWS Region Code : cn-northwest-1\",\n+                                        \"displayName\": \"China (Ningxia)\",\n+                                        \"value\": \"cn-northwest-1\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"5\",\n-                                        \"value\": \"5\"\n+                                        \"description\": \"AWS Region Code : eu-central-1\",\n+                                        \"displayName\": \"Europe (Frankfurt)\",\n+                                        \"value\": \"eu-central-1\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"6\",\n-                                        \"value\": \"6\"\n+                                        \"description\": \"AWS Region Code : eu-west-1\",\n+                                        \"displayName\": \"Europe (Ireland)\",\n+                                        \"value\": \"eu-west-1\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"7\",\n-                                        \"value\": \"7\"\n+                                        \"description\": \"AWS Region Code : eu-west-2\",\n+                                        \"displayName\": \"Europe (London)\",\n+                                        \"value\": \"eu-west-2\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"8\",\n-                                        \"value\": \"8\"\n+                                        \"description\": \"AWS Region Code : eu-south-1\",\n+                                        \"displayName\": \"Europe (Milan)\",\n+                                        \"value\": \"eu-south-1\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"9\",\n-                                        \"value\": \"9\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"1\",\n-                                \"dependencies\": [\n+                                        \"description\": \"AWS Region Code : eu-west-3\",\n+                                        \"displayName\": \"Europe (Paris)\",\n+                                        \"value\": \"eu-west-3\"\n+                                    },\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-                                    }\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Output Compression Level\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Output Compression Strategy\": {\n-                                \"allowableValues\": [\n+                                        \"description\": \"AWS Region Code : eu-south-2\",\n+                                        \"displayName\": \"Europe (Spain)\",\n+                                        \"value\": \"eu-south-2\"\n+                                    },\n                                     {\n-                                        \"description\": \"No Compression\",\n-                                        \"displayName\": \"no compression\",\n-                                        \"value\": \"no compression\"\n+                                        \"description\": \"AWS Region Code : eu-north-1\",\n+                                        \"displayName\": \"Europe (Stockholm)\",\n+                                        \"value\": \"eu-north-1\"\n                                     },\n                                     {\n-                                        \"description\": \"GZIP\",\n-                                        \"displayName\": \"gzip\",\n-                                        \"value\": \"gzip\"\n+                                        \"description\": \"AWS Region Code : eu-central-2\",\n+                                        \"displayName\": \"Europe (Zurich)\",\n+                                        \"value\": \"eu-central-2\"\n                                     },\n                                     {\n-                                        \"description\": \"Deflate\",\n-                                        \"displayName\": \"deflate\",\n-                                        \"value\": \"deflate\"\n+                                        \"description\": \"AWS Region Code : il-central-1\",\n+                                        \"displayName\": \"Israel (Tel Aviv)\",\n+                                        \"value\": \"il-central-1\"\n                                     },\n                                     {\n-                                        \"description\": \"BZIP2\",\n-                                        \"displayName\": \"bzip2\",\n-                                        \"value\": \"bzip2\"\n+                                        \"description\": \"AWS Region Code : me-south-1\",\n+                                        \"displayName\": \"Middle East (Bahrain)\",\n+                                        \"value\": \"me-south-1\"\n                                     },\n                                     {\n-                                        \"description\": \"XZ-LZMA2\",\n-                                        \"displayName\": \"xz-lzma2\",\n-                                        \"value\": \"xz-lzma2\"\n+                                        \"description\": \"AWS Region Code : me-central-1\",\n+                                        \"displayName\": \"Middle East (UAE)\",\n+                                        \"value\": \"me-central-1\"\n                                     },\n                                     {\n-                                        \"description\": \"LZMA\",\n-                                        \"displayName\": \"lzma\",\n-                                        \"value\": \"lzma\"\n+                                        \"description\": \"AWS Region Code : sa-east-1\",\n+                                        \"displayName\": \"South America (Sao Paulo)\",\n+                                        \"value\": \"sa-east-1\"\n                                     },\n                                     {\n-                                        \"description\": \"Snappy\",\n-                                        \"displayName\": \"snappy\",\n-                                        \"value\": \"snappy\"\n+                                        \"description\": \"AWS Region Code : us-east-1\",\n+                                        \"displayName\": \"US East (N. Virginia)\",\n+                                        \"value\": \"us-east-1\"\n                                     },\n                                     {\n-                                        \"description\": \"Snappy-Hadoop\",\n-                                        \"displayName\": \"snappy-hadoop\",\n-                                        \"value\": \"snappy-hadoop\"\n+                                        \"description\": \"AWS Region Code : us-east-2\",\n+                                        \"displayName\": \"US East (Ohio)\",\n+                                        \"value\": \"us-east-2\"\n                                     },\n                                     {\n-                                        \"description\": \"Snappy-Framed\",\n-                                        \"displayName\": \"snappy-framed\",\n-                                        \"value\": \"snappy-framed\"\n+                                        \"description\": \"AWS Region Code : us-iso-east-1\",\n+                                        \"displayName\": \"US ISO East\",\n+                                        \"value\": \"us-iso-east-1\"\n                                     },\n                                     {\n-                                        \"description\": \"LZ4\",\n-                                        \"displayName\": \"lz4-framed\",\n-                                        \"value\": \"lz4-framed\"\n+                                        \"description\": \"AWS Region Code : us-iso-west-1\",\n+                                        \"displayName\": \"US ISO WEST\",\n+                                        \"value\": \"us-iso-west-1\"\n                                     },\n                                     {\n-                                        \"description\": \"ZSTD\",\n-                                        \"displayName\": \"zstd\",\n-                                        \"value\": \"zstd\"\n+                                        \"description\": \"AWS Region Code : us-isob-east-1\",\n+                                        \"displayName\": \"US ISOB East (Ohio)\",\n+                                        \"value\": \"us-isob-east-1\"\n                                     },\n                                     {\n-                                        \"description\": \"Brotli\",\n-                                        \"displayName\": \"brotli\",\n-                                        \"value\": \"brotli\"\n+                                        \"description\": \"AWS Region Code : us-west-1\",\n+                                        \"displayName\": \"US West (N. California)\",\n+                                        \"value\": \"us-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-west-2\",\n+                                        \"displayName\": \"US West (Oregon)\",\n+                                        \"value\": \"us-west-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-cn-global\",\n+                                        \"displayName\": \"aws-cn-global\",\n+                                        \"value\": \"aws-cn-global\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-global\",\n+                                        \"displayName\": \"aws-global\",\n+                                        \"value\": \"aws-global\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-iso-b-global\",\n+                                        \"displayName\": \"aws-iso-b-global\",\n+                                        \"value\": \"aws-iso-b-global\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-iso-global\",\n+                                        \"displayName\": \"aws-iso-global\",\n+                                        \"value\": \"aws-iso-global\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-us-gov-global\",\n+                                        \"displayName\": \"aws-us-gov-global\",\n+                                        \"value\": \"aws-us-gov-global\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"no compression\",\n-                                \"description\": \"The strategy to use for compressing output FlowFiles\",\n-                                \"displayName\": \"Output Compression Strategy\",\n+                                \"defaultValue\": \"us-west-2\",\n+                                \"description\": \"\",\n+                                \"displayName\": \"Region\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Output Compression Strategy\",\n+                                \"name\": \"Region\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Output Filename Strategy\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Retain the filename attribute value from the input FlowFile\",\n-                                        \"displayName\": \"Original\",\n-                                        \"value\": \"ORIGINAL\"\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-                                    }\n-                                ],\n-                                \"defaultValue\": \"UPDATED\",\n-                                \"description\": \"Processing strategy for filename attribute on output FlowFiles\",\n-                                \"displayName\": \"Output Filename Strategy\",\n+                            \"amazon-kinesis-stream-partition-key\": {\n+                                \"defaultValue\": \"${kinesis.partition.key}\",\n+                                \"description\": \"The partition key attribute.  If it is not set, a random value is used\",\n+                                \"displayName\": \"Amazon Kinesis Stream Partition Key\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"amazon-kinesis-stream-partition-key\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"kinesis-stream-name\": {\n+                                \"description\": \"The name of Kinesis Stream\",\n+                                \"displayName\": \"Amazon Kinesis Stream Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"kinesis-stream-name\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"max-message-buffer-size\": {\n+                                \"defaultValue\": \"1 MB\",\n+                                \"description\": \"Max message buffer size in Mega-bytes\",\n+                                \"displayName\": \"Max message buffer size (MB)\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Output Filename Strategy\",\n-                                \"required\": true,\n+                                \"name\": \"max-message-buffer-size\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n+                            },\n+                            \"message-batch-size\": {\n+                                \"defaultValue\": \"250\",\n+                                \"description\": \"Batch size for messages (1-500).\",\n+                                \"displayName\": \"Message Batch Size\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"message-batch-size\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"proxy-configuration-service\": {\n+                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests.\",\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\": \"2.0.0-M3\"\n+                                }\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+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.aws.kinesis.stream.ConsumeKinesisStream\"\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 are routed to success relationship\",\n                                 \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"FlowFiles will be transferred to the failure relationship on compression modification errors\",\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                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": 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+                            \"amazon\",\n+                            \"aws\",\n+                            \"kinesis\",\n+                            \"put\",\n+                            \"stream\"\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.aws.kinesis.stream.PutKinesisStream\",\n+                        \"typeDescription\": \"Sends the contents to a specified Amazon Kinesis. In order to send data to Kinesis, the stream name has to be specified.\",\n                         \"useCases\": [],\n                         \"version\": \"2.0.0-M3\",\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\": \"Error message on posting message to AWS Kinesis\",\n+                                \"name\": \"aws.kinesis.error.message\"\n+                            },\n+                            {\n+                                \"description\": \"Error code for the message when posting to AWS Kinesis\",\n+                                \"name\": \"aws.kinesis.error.code\"\n+                            },\n+                            {\n+                                \"description\": \"Sequence number for the message when posting to AWS Kinesis\",\n+                                \"name\": \"aws.kinesis.sequence.number\"\n+                            },\n+                            {\n+                                \"description\": \"Shard id of the message posted to AWS Kinesis\",\n+                                \"name\": \"aws.kinesis.shard.id\"\n                             }\n                         ]\n-                    }\n-                ],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"2.0.0-M3\"\n-        },\n-        {\n-            \"artifact\": \"nifi-record-sink-service-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [\n+                    },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-record-sink-service-nar\",\n+                        \"artifact\": \"nifi-aws-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\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+                        \"multiProcessorUseCases\": [],\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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+                            \"AWS Credentials Provider service\": {\n+                                \"description\": \"The Controller Service that is used to obtain AWS credentials provider\",\n+                                \"displayName\": \"AWS Credentials Provider Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"record-sink-record-writer\",\n+                                \"name\": \"AWS Credentials Provider service\",\n                                 \"required\": true,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"artifact\": \"nifi-aws-service-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n+                                    \"type\": \"org.apache.nifi.processors.aws.credentials.provider.service.AWSCredentialsProviderService\",\n                                     \"version\": \"2.0.0-M3\"\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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+                            \"Amazon Lambda Name\": {\n+                                \"description\": \"The Lambda Function Name\",\n+                                \"displayName\": \"Amazon Lambda Name\",\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-                                        \"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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"smtp-port\",\n+                                \"name\": \"Amazon Lambda Name\",\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+                            \"Amazon Lambda Qualifier (version)\": {\n+                                \"defaultValue\": \"$LATEST\",\n+                                \"description\": \"The Lambda Function Version\",\n+                                \"displayName\": \"Amazon Lambda Qualifier (version)\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"smtp-ssl\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Amazon Lambda Qualifier (version)\",\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+                            \"Communications Timeout\": {\n+                                \"defaultValue\": \"30 secs\",\n+                                \"description\": \"\",\n+                                \"displayName\": \"Communications Timeout\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"smtp-starttls\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Communications Timeout\",\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+                            \"Endpoint Override URL\": {\n+                                \"description\": \"Endpoint URL to use instead of the AWS default including scheme, host, port, and path. The AWS libraries select an endpoint URL based on the AWS region, but this property overrides the selected endpoint URL, allowing use with other S3-compatible endpoints.\",\n+                                \"displayName\": \"Endpoint Override URL\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"smtp-username\",\n+                                \"name\": \"Endpoint Override URL\",\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"subject\",\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-record-sink-service-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"f2215c6\"\n-                        },\n-                        \"group\": \"org.apache.nifi\",\n-                        \"propertyDescriptors\": {\n-                            \"logsink-log-level\": {\n+                            \"Region\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"TRACE\",\n-                                        \"value\": \"TRACE\"\n+                                        \"description\": \"AWS Region Code : us-gov-east-1\",\n+                                        \"displayName\": \"AWS GovCloud (US-East)\",\n+                                        \"value\": \"us-gov-east-1\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"DEBUG\",\n-                                        \"value\": \"DEBUG\"\n+                                        \"description\": \"AWS Region Code : us-gov-west-1\",\n+                                        \"displayName\": \"AWS GovCloud (US-West)\",\n+                                        \"value\": \"us-gov-west-1\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"INFO\",\n-                                        \"value\": \"INFO\"\n+                                        \"description\": \"AWS Region Code : af-south-1\",\n+                                        \"displayName\": \"Africa (Cape Town)\",\n+                                        \"value\": \"af-south-1\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"WARN\",\n-                                        \"value\": \"WARN\"\n+                                        \"description\": \"AWS Region Code : ap-east-1\",\n+                                        \"displayName\": \"Asia Pacific (Hong Kong)\",\n+                                        \"value\": \"ap-east-1\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"ERROR\",\n-                                        \"value\": \"ERROR\"\n+                                        \"description\": \"AWS Region Code : ap-south-2\",\n+                                        \"displayName\": \"Asia Pacific (Hyderabad)\",\n+                                        \"value\": \"ap-south-2\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"FATAL\",\n-                                        \"value\": \"FATAL\"\n+                                        \"description\": \"AWS Region Code : ap-southeast-3\",\n+                                        \"displayName\": \"Asia Pacific (Jakarta)\",\n+                                        \"value\": \"ap-southeast-3\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"NONE\",\n-                                        \"value\": \"NONE\"\n+                                        \"description\": \"AWS Region Code : ap-southeast-4\",\n+                                        \"displayName\": \"Asia Pacific (Melbourne)\",\n+                                        \"value\": \"ap-southeast-4\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-south-1\",\n+                                        \"displayName\": \"Asia Pacific (Mumbai)\",\n+                                        \"value\": \"ap-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-northeast-3\",\n+                                        \"displayName\": \"Asia Pacific (Osaka)\",\n+                                        \"value\": \"ap-northeast-3\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-northeast-2\",\n+                                        \"displayName\": \"Asia Pacific (Seoul)\",\n+                                        \"value\": \"ap-northeast-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-southeast-1\",\n+                                        \"displayName\": \"Asia Pacific (Singapore)\",\n+                                        \"value\": \"ap-southeast-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-southeast-2\",\n+                                        \"displayName\": \"Asia Pacific (Sydney)\",\n+                                        \"value\": \"ap-southeast-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-northeast-1\",\n+                                        \"displayName\": \"Asia Pacific (Tokyo)\",\n+                                        \"value\": \"ap-northeast-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ca-central-1\",\n+                                        \"displayName\": \"Canada (Central)\",\n+                                        \"value\": \"ca-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ca-west-1\",\n+                                        \"displayName\": \"Canada West (Calgary)\",\n+                                        \"value\": \"ca-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : cn-north-1\",\n+                                        \"displayName\": \"China (Beijing)\",\n+                                        \"value\": \"cn-north-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : cn-northwest-1\",\n+                                        \"displayName\": \"China (Ningxia)\",\n+                                        \"value\": \"cn-northwest-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-central-1\",\n+                                        \"displayName\": \"Europe (Frankfurt)\",\n+                                        \"value\": \"eu-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-west-1\",\n+                                        \"displayName\": \"Europe (Ireland)\",\n+                                        \"value\": \"eu-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-west-2\",\n+                                        \"displayName\": \"Europe (London)\",\n+                                        \"value\": \"eu-west-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-south-1\",\n+                                        \"displayName\": \"Europe (Milan)\",\n+                                        \"value\": \"eu-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-west-3\",\n+                                        \"displayName\": \"Europe (Paris)\",\n+                                        \"value\": \"eu-west-3\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-south-2\",\n+                                        \"displayName\": \"Europe (Spain)\",\n+                                        \"value\": \"eu-south-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-north-1\",\n+                                        \"displayName\": \"Europe (Stockholm)\",\n+                                        \"value\": \"eu-north-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-central-2\",\n+                                        \"displayName\": \"Europe (Zurich)\",\n+                                        \"value\": \"eu-central-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : il-central-1\",\n+                                        \"displayName\": \"Israel (Tel Aviv)\",\n+                                        \"value\": \"il-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : me-south-1\",\n+                                        \"displayName\": \"Middle East (Bahrain)\",\n+                                        \"value\": \"me-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : me-central-1\",\n+                                        \"displayName\": \"Middle East (UAE)\",\n+                                        \"value\": \"me-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : sa-east-1\",\n+                                        \"displayName\": \"South America (Sao Paulo)\",\n+                                        \"value\": \"sa-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-east-1\",\n+                                        \"displayName\": \"US East (N. Virginia)\",\n+                                        \"value\": \"us-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-east-2\",\n+                                        \"displayName\": \"US East (Ohio)\",\n+                                        \"value\": \"us-east-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-iso-east-1\",\n+                                        \"displayName\": \"US ISO East\",\n+                                        \"value\": \"us-iso-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-iso-west-1\",\n+                                        \"displayName\": \"US ISO WEST\",\n+                                        \"value\": \"us-iso-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-isob-east-1\",\n+                                        \"displayName\": \"US ISOB East (Ohio)\",\n+                                        \"value\": \"us-isob-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-west-1\",\n+                                        \"displayName\": \"US West (N. California)\",\n+                                        \"value\": \"us-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-west-2\",\n+                                        \"displayName\": \"US West (Oregon)\",\n+                                        \"value\": \"us-west-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-cn-global\",\n+                                        \"displayName\": \"aws-cn-global\",\n+                                        \"value\": \"aws-cn-global\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-global\",\n+                                        \"displayName\": \"aws-global\",\n+                                        \"value\": \"aws-global\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-iso-b-global\",\n+                                        \"displayName\": \"aws-iso-b-global\",\n+                                        \"value\": \"aws-iso-b-global\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-iso-global\",\n+                                        \"displayName\": \"aws-iso-global\",\n+                                        \"value\": \"aws-iso-global\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-us-gov-global\",\n+                                        \"displayName\": \"aws-us-gov-global\",\n+                                        \"value\": \"aws-us-gov-global\"\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\": \"us-west-2\",\n+                                \"description\": \"\",\n+                                \"displayName\": \"Region\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"logsink-log-level\",\n+                                \"name\": \"Region\",\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+                            \"proxy-configuration-service\": {\n+                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests.\",\n+                                \"displayName\": \"Proxy Configuration Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"record-sink-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\": \"2.0.0-M3\"\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.record.sink.RecordSinkService\",\n-                                \"version\": \"2.0.0-M3\"\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+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"log\",\n-                            \"record\",\n-                            \"sink\"\n+                            \"amazon\",\n+                            \"aws\",\n+                            \"lambda\",\n+                            \"put\"\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\": \"2.0.0-M3\"\n+                        \"triggerSerially\": false,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.aws.lambda.PutLambda\",\n+                        \"typeDescription\": \"Sends the contents to a specified Amazon Lambda Function. The AWS credentials used for authentication must have permissions execute the Lambda function (lambda:InvokeFunction).The FlowFile content must be JSON.\",\n+                        \"useCases\": [],\n+                        \"version\": \"2.0.0-M3\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"Function error message in result on posting message to AWS Lambda\",\n+                                \"name\": \"aws.lambda.result.function.error\"\n+                            },\n+                            {\n+                                \"description\": \"Status code in the result for the message when posting to AWS Lambda\",\n+                                \"name\": \"aws.lambda.result.status.code\"\n+                            },\n+                            {\n+                                \"description\": \"Payload in the result from AWS Lambda\",\n+                                \"name\": \"aws.lambda.result.payload\"\n+                            },\n+                            {\n+                                \"description\": \"Log in the result of the message posted to Lambda\",\n+                                \"name\": \"aws.lambda.result.log\"\n+                            },\n+                            {\n+                                \"description\": \"Exception message on invoking from AWS Lambda\",\n+                                \"name\": \"aws.lambda.exception.message\"\n+                            },\n+                            {\n+                                \"description\": \"Exception cause on invoking from AWS Lambda\",\n+                                \"name\": \"aws.lambda.exception.cause\"\n+                            },\n+                            {\n+                                \"description\": \"Exception error code on invoking from AWS Lambda\",\n+                                \"name\": \"aws.lambda.exception.error.code\"\n+                            },\n+                            {\n+                                \"description\": \"Exception request id on invoking from AWS Lambda\",\n+                                \"name\": \"aws.lambda.exception.request.id\"\n+                            },\n+                            {\n+                                \"description\": \"Exception status code on invoking from AWS Lambda\",\n+                                \"name\": \"aws.lambda.exception.status.code\"\n+                            }\n+                        ]\n                     },\n                     {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-record-sink-service-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-aws-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\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+                        \"multiProcessorUseCases\": [],\n+                        \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"hostname\": {\n-                                \"description\": \"Destination hostname or IP address\",\n-                                \"displayName\": \"Hostname\",\n+                            \"AWS Credentials Provider service\": {\n+                                \"description\": \"The Controller Service that is used to obtain AWS credentials provider\",\n+                                \"displayName\": \"AWS Credentials Provider Service\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"hostname\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"AWS Credentials Provider service\",\n+                                \"required\": true,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-aws-service-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.processors.aws.credentials.provider.service.AWSCredentialsProviderService\",\n+                                    \"version\": \"2.0.0-M3\"\n+                                }\n+                            },\n+                            \"Communications Timeout\": {\n+                                \"defaultValue\": \"30 secs\",\n+                                \"description\": \"\",\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-                            \"port\": {\n-                                \"description\": \"Destination port number\",\n-                                \"displayName\": \"Port\",\n+                            \"Endpoint Override URL\": {\n+                                \"description\": \"Endpoint URL to use instead of the AWS default including scheme, host, port, and path. The AWS libraries select an endpoint URL based on the AWS region, but this property overrides the selected endpoint URL, allowing use with other S3-compatible endpoints.\",\n+                                \"displayName\": \"Endpoint Override URL\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"port\",\n-                                \"required\": true,\n+                                \"name\": \"Endpoint Override URL\",\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+                            \"Region\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-gov-east-1\",\n+                                        \"displayName\": \"AWS GovCloud (US-East)\",\n+                                        \"value\": \"us-gov-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-gov-west-1\",\n+                                        \"displayName\": \"AWS GovCloud (US-West)\",\n+                                        \"value\": \"us-gov-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : af-south-1\",\n+                                        \"displayName\": \"Africa (Cape Town)\",\n+                                        \"value\": \"af-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-east-1\",\n+                                        \"displayName\": \"Asia Pacific (Hong Kong)\",\n+                                        \"value\": \"ap-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-south-2\",\n+                                        \"displayName\": \"Asia Pacific (Hyderabad)\",\n+                                        \"value\": \"ap-south-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-southeast-3\",\n+                                        \"displayName\": \"Asia Pacific (Jakarta)\",\n+                                        \"value\": \"ap-southeast-3\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-southeast-4\",\n+                                        \"displayName\": \"Asia Pacific (Melbourne)\",\n+                                        \"value\": \"ap-southeast-4\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-south-1\",\n+                                        \"displayName\": \"Asia Pacific (Mumbai)\",\n+                                        \"value\": \"ap-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-northeast-3\",\n+                                        \"displayName\": \"Asia Pacific (Osaka)\",\n+                                        \"value\": \"ap-northeast-3\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-northeast-2\",\n+                                        \"displayName\": \"Asia Pacific (Seoul)\",\n+                                        \"value\": \"ap-northeast-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-southeast-1\",\n+                                        \"displayName\": \"Asia Pacific (Singapore)\",\n+                                        \"value\": \"ap-southeast-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-southeast-2\",\n+                                        \"displayName\": \"Asia Pacific (Sydney)\",\n+                                        \"value\": \"ap-southeast-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-northeast-1\",\n+                                        \"displayName\": \"Asia Pacific (Tokyo)\",\n+                                        \"value\": \"ap-northeast-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ca-central-1\",\n+                                        \"displayName\": \"Canada (Central)\",\n+                                        \"value\": \"ca-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ca-west-1\",\n+                                        \"displayName\": \"Canada West (Calgary)\",\n+                                        \"value\": \"ca-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : cn-north-1\",\n+                                        \"displayName\": \"China (Beijing)\",\n+                                        \"value\": \"cn-north-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : cn-northwest-1\",\n+                                        \"displayName\": \"China (Ningxia)\",\n+                                        \"value\": \"cn-northwest-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-central-1\",\n+                                        \"displayName\": \"Europe (Frankfurt)\",\n+                                        \"value\": \"eu-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-west-1\",\n+                                        \"displayName\": \"Europe (Ireland)\",\n+                                        \"value\": \"eu-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-west-2\",\n+                                        \"displayName\": \"Europe (London)\",\n+                                        \"value\": \"eu-west-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-south-1\",\n+                                        \"displayName\": \"Europe (Milan)\",\n+                                        \"value\": \"eu-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-west-3\",\n+                                        \"displayName\": \"Europe (Paris)\",\n+                                        \"value\": \"eu-west-3\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-south-2\",\n+                                        \"displayName\": \"Europe (Spain)\",\n+                                        \"value\": \"eu-south-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-north-1\",\n+                                        \"displayName\": \"Europe (Stockholm)\",\n+                                        \"value\": \"eu-north-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-central-2\",\n+                                        \"displayName\": \"Europe (Zurich)\",\n+                                        \"value\": \"eu-central-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : il-central-1\",\n+                                        \"displayName\": \"Israel (Tel Aviv)\",\n+                                        \"value\": \"il-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : me-south-1\",\n+                                        \"displayName\": \"Middle East (Bahrain)\",\n+                                        \"value\": \"me-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : me-central-1\",\n+                                        \"displayName\": \"Middle East (UAE)\",\n+                                        \"value\": \"me-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : sa-east-1\",\n+                                        \"displayName\": \"South America (Sao Paulo)\",\n+                                        \"value\": \"sa-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-east-1\",\n+                                        \"displayName\": \"US East (N. Virginia)\",\n+                                        \"value\": \"us-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-east-2\",\n+                                        \"displayName\": \"US East (Ohio)\",\n+                                        \"value\": \"us-east-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-iso-east-1\",\n+                                        \"displayName\": \"US ISO East\",\n+                                        \"value\": \"us-iso-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-iso-west-1\",\n+                                        \"displayName\": \"US ISO WEST\",\n+                                        \"value\": \"us-iso-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-isob-east-1\",\n+                                        \"displayName\": \"US ISOB East (Ohio)\",\n+                                        \"value\": \"us-isob-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-west-1\",\n+                                        \"displayName\": \"US West (N. California)\",\n+                                        \"value\": \"us-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-west-2\",\n+                                        \"displayName\": \"US West (Oregon)\",\n+                                        \"value\": \"us-west-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-cn-global\",\n+                                        \"displayName\": \"aws-cn-global\",\n+                                        \"value\": \"aws-cn-global\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-global\",\n+                                        \"displayName\": \"aws-global\",\n+                                        \"value\": \"aws-global\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-iso-b-global\",\n+                                        \"displayName\": \"aws-iso-b-global\",\n+                                        \"value\": \"aws-iso-b-global\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-iso-global\",\n+                                        \"displayName\": \"aws-iso-global\",\n+                                        \"value\": \"aws-iso-global\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-us-gov-global\",\n+                                        \"displayName\": \"aws-us-gov-global\",\n+                                        \"value\": \"aws-us-gov-global\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"us-west-2\",\n+                                \"description\": \"\",\n+                                \"displayName\": \"Region\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"record-sink-record-writer\",\n+                                \"name\": \"Region\",\n                                 \"required\": true,\n+                                \"sensitive\": false\n+                            },\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\": \"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\": \"2.0.0-M3\"\n                                 }\n                             },\n-                            \"sender-threads\": {\n-                                \"defaultValue\": \"2\",\n-                                \"description\": \"Number of worker threads allocated for handling socket communication\",\n-                                \"displayName\": \"Sender Threads\",\n+                            \"awsTaskId\": {\n+                                \"defaultValue\": \"${awsTaskId}\",\n+                                \"description\": \"\",\n+                                \"displayName\": \"AWS Task ID\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"sender-threads\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"awsTaskId\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n+                            },\n+                            \"proxy-configuration-service\": {\n+                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests.\",\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\": \"2.0.0-M3\"\n+                                }\n                             }\n                         },\n-                        \"providedApiImplementations\": [\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.aws.ml.polly.StartAwsPollyJob\"\n+                        ],\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\": \"2.0.0-M3\"\n+                                \"description\": \"Job successfully finished. FlowFile will be routed to this relation.\",\n+                                \"name\": \"success\"\n+                            },\n+                            {\n+                                \"description\": \"The job failed, the original FlowFile will be routed to this 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+                                \"description\": \"The job is currently still being processed\",\n+                                \"name\": \"running\"\n                             }\n                         ],\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"UDP\",\n-                            \"event\",\n-                            \"record\",\n-                            \"sink\"\n+                            \"AWS\",\n+                            \"Amazon\",\n+                            \"ML\",\n+                            \"Machine Learning\",\n+                            \"Polly\"\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\": \"2.0.0-M3\"\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-record-sink-service-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"f2215c6\"\n-                        },\n-                        \"dynamicProperties\": [\n+                        \"triggerSerially\": false,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.aws.ml.polly.GetAwsPollyJobStatus\",\n+                        \"typeDescription\": \"Retrieves the current status of an AWS Polly job.\",\n+                        \"useCases\": [],\n+                        \"version\": \"2.0.0-M3\",\n+                        \"writesAttributes\": [\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\": \"The bucket name where polly output will be located.\",\n+                                \"name\": \"PollyS3OutputBucket\"\n+                            },\n                             {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.record.sink.RecordSinkService\",\n-                                \"version\": \"2.0.0-M3\"\n+                                \"description\": \"Object key of polly output.\",\n+                                \"name\": \"filename\"\n+                            },\n+                            {\n+                                \"description\": \"S3 path-style output location of the result.\",\n+                                \"name\": \"outputLocation\"\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\": \"2.0.0-M3\"\n-                    }\n-                ],\n-                \"processors\": [],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\n-        },\n-        {\n-            \"artifact\": \"nifi-asana-processors-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [],\n-                \"processors\": [\n+                        ]\n+                    },\n                     {\n                         \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-asana-processors-nar\",\n+                        \"artifact\": \"nifi-aws-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -28188,303 +34173,349 @@\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                         \"multiProcessorUseCases\": [],\n-                        \"primaryNodeOnly\": true,\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+                            \"AWS Credentials Provider service\": {\n+                                \"description\": \"The Controller Service that is used to obtain AWS credentials provider\",\n+                                \"displayName\": \"AWS Credentials Provider Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"asana-controller-service\",\n+                                \"name\": \"AWS Credentials Provider service\",\n                                 \"required\": true,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-asana-services-api-nar\",\n+                                    \"artifact\": \"nifi-aws-service-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.controller.asana.AsanaClientProviderService\",\n+                                    \"type\": \"org.apache.nifi.processors.aws.credentials.provider.service.AWSCredentialsProviderService\",\n                                     \"version\": \"2.0.0-M3\"\n                                 }\n                             },\n-                            \"asana-object-type\": {\n+                            \"Communications Timeout\": {\n+                                \"defaultValue\": \"30 secs\",\n+                                \"description\": \"\",\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+                            \"Endpoint Override URL\": {\n+                                \"description\": \"Endpoint URL to use instead of the AWS default including scheme, host, port, and path. The AWS libraries select an endpoint URL based on the AWS region, but this property overrides the selected endpoint URL, allowing use with other S3-compatible endpoints.\",\n+                                \"displayName\": \"Endpoint Override URL\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Endpoint Override URL\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Region\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Collect tasks matching to the specified conditions.\",\n-                                        \"displayName\": \"Tasks\",\n-                                        \"value\": \"asana-collect-tasks\"\n+                                        \"description\": \"AWS Region Code : us-gov-east-1\",\n+                                        \"displayName\": \"AWS GovCloud (US-East)\",\n+                                        \"value\": \"us-gov-east-1\"\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+                                        \"description\": \"AWS Region Code : us-gov-west-1\",\n+                                        \"displayName\": \"AWS GovCloud (US-West)\",\n+                                        \"value\": \"us-gov-west-1\"\n                                     },\n                                     {\n-                                        \"description\": \"Collect projects of the workspace.\",\n-                                        \"displayName\": \"Projects\",\n-                                        \"value\": \"asana-collect-projects\"\n+                                        \"description\": \"AWS Region Code : af-south-1\",\n+                                        \"displayName\": \"Africa (Cape Town)\",\n+                                        \"value\": \"af-south-1\"\n                                     },\n                                     {\n-                                        \"description\": \"Collect tags of the workspace.\",\n-                                        \"displayName\": \"Tags\",\n-                                        \"value\": \"asana-collect-tags\"\n+                                        \"description\": \"AWS Region Code : ap-east-1\",\n+                                        \"displayName\": \"Asia Pacific (Hong Kong)\",\n+                                        \"value\": \"ap-east-1\"\n                                     },\n                                     {\n-                                        \"description\": \"Collect users assigned to the workspace.\",\n-                                        \"displayName\": \"Users\",\n-                                        \"value\": \"asana-collect-users\"\n+                                        \"description\": \"AWS Region Code : ap-south-2\",\n+                                        \"displayName\": \"Asia Pacific (Hyderabad)\",\n+                                        \"value\": \"ap-south-2\"\n                                     },\n                                     {\n-                                        \"description\": \"Collect users assigned to the specified project.\",\n-                                        \"displayName\": \"Members of a Project\",\n-                                        \"value\": \"asana-collect-project-members\"\n+                                        \"description\": \"AWS Region Code : ap-southeast-3\",\n+                                        \"displayName\": \"Asia Pacific (Jakarta)\",\n+                                        \"value\": \"ap-southeast-3\"\n                                     },\n                                     {\n-                                        \"description\": \"Collect teams of the workspace.\",\n-                                        \"displayName\": \"Teams\",\n-                                        \"value\": \"asana-collect-teams\"\n+                                        \"description\": \"AWS Region Code : ap-southeast-4\",\n+                                        \"displayName\": \"Asia Pacific (Melbourne)\",\n+                                        \"value\": \"ap-southeast-4\"\n                                     },\n                                     {\n-                                        \"description\": \"Collect users assigned to the specified team.\",\n-                                        \"displayName\": \"Team Members\",\n-                                        \"value\": \"asana-collect-team-members\"\n+                                        \"description\": \"AWS Region Code : ap-south-1\",\n+                                        \"displayName\": \"Asia Pacific (Mumbai)\",\n+                                        \"value\": \"ap-south-1\"\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+                                        \"description\": \"AWS Region Code : ap-northeast-3\",\n+                                        \"displayName\": \"Asia Pacific (Osaka)\",\n+                                        \"value\": \"ap-northeast-3\"\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+                                        \"description\": \"AWS Region Code : ap-northeast-2\",\n+                                        \"displayName\": \"Asia Pacific (Seoul)\",\n+                                        \"value\": \"ap-northeast-2\"\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\": \"AWS Region Code : ap-southeast-1\",\n+                                        \"displayName\": \"Asia Pacific (Singapore)\",\n+                                        \"value\": \"ap-southeast-1\"\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\": \"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\": \"asana-object-type\",\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"asana-output-batch-size\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"asana-project-name\": {\n-                                \"dependencies\": [\n+                                        \"description\": \"AWS Region Code : ap-southeast-2\",\n+                                        \"displayName\": \"Asia Pacific (Sydney)\",\n+                                        \"value\": \"ap-southeast-2\"\n+                                    },\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+                                        \"description\": \"AWS Region Code : ap-northeast-1\",\n+                                        \"displayName\": \"Asia Pacific (Tokyo)\",\n+                                        \"value\": \"ap-northeast-1\"\n+                                    },\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+                                        \"description\": \"AWS Region Code : ca-central-1\",\n+                                        \"displayName\": \"Canada (Central)\",\n+                                        \"value\": \"ca-central-1\"\n+                                    },\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+                                        \"description\": \"AWS Region Code : ca-west-1\",\n+                                        \"displayName\": \"Canada West (Calgary)\",\n+                                        \"value\": \"ca-west-1\"\n+                                    },\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"asana-collect-team-members\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Object Type\",\n-                                        \"propertyName\": \"asana-object-type\"\n+                                        \"description\": \"AWS Region Code : cn-north-1\",\n+                                        \"displayName\": \"China (Beijing)\",\n+                                        \"value\": \"cn-north-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : cn-northwest-1\",\n+                                        \"displayName\": \"China (Ningxia)\",\n+                                        \"value\": \"cn-northwest-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-central-1\",\n+                                        \"displayName\": \"Europe (Frankfurt)\",\n+                                        \"value\": \"eu-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-west-1\",\n+                                        \"displayName\": \"Europe (Ireland)\",\n+                                        \"value\": \"eu-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-west-2\",\n+                                        \"displayName\": \"Europe (London)\",\n+                                        \"value\": \"eu-west-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-south-1\",\n+                                        \"displayName\": \"Europe (Milan)\",\n+                                        \"value\": \"eu-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-west-3\",\n+                                        \"displayName\": \"Europe (Paris)\",\n+                                        \"value\": \"eu-west-3\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-south-2\",\n+                                        \"displayName\": \"Europe (Spain)\",\n+                                        \"value\": \"eu-south-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-north-1\",\n+                                        \"displayName\": \"Europe (Stockholm)\",\n+                                        \"value\": \"eu-north-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-central-2\",\n+                                        \"displayName\": \"Europe (Zurich)\",\n+                                        \"value\": \"eu-central-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : il-central-1\",\n+                                        \"displayName\": \"Israel (Tel Aviv)\",\n+                                        \"value\": \"il-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : me-south-1\",\n+                                        \"displayName\": \"Middle East (Bahrain)\",\n+                                        \"value\": \"me-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : me-central-1\",\n+                                        \"displayName\": \"Middle East (UAE)\",\n+                                        \"value\": \"me-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : sa-east-1\",\n+                                        \"displayName\": \"South America (Sao Paulo)\",\n+                                        \"value\": \"sa-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-east-1\",\n+                                        \"displayName\": \"US East (N. Virginia)\",\n+                                        \"value\": \"us-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-east-2\",\n+                                        \"displayName\": \"US East (Ohio)\",\n+                                        \"value\": \"us-east-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-iso-east-1\",\n+                                        \"displayName\": \"US ISO East\",\n+                                        \"value\": \"us-iso-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-iso-west-1\",\n+                                        \"displayName\": \"US ISO WEST\",\n+                                        \"value\": \"us-iso-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-isob-east-1\",\n+                                        \"displayName\": \"US ISOB East (Ohio)\",\n+                                        \"value\": \"us-isob-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-west-1\",\n+                                        \"displayName\": \"US West (N. California)\",\n+                                        \"value\": \"us-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-west-2\",\n+                                        \"displayName\": \"US West (Oregon)\",\n+                                        \"value\": \"us-west-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-cn-global\",\n+                                        \"displayName\": \"aws-cn-global\",\n+                                        \"value\": \"aws-cn-global\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-global\",\n+                                        \"displayName\": \"aws-global\",\n+                                        \"value\": \"aws-global\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-iso-b-global\",\n+                                        \"displayName\": \"aws-iso-b-global\",\n+                                        \"value\": \"aws-iso-b-global\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-iso-global\",\n+                                        \"displayName\": \"aws-iso-global\",\n+                                        \"value\": \"aws-iso-global\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-us-gov-global\",\n+                                        \"displayName\": \"aws-us-gov-global\",\n+                                        \"value\": \"aws-us-gov-global\"\n                                     }\n                                 ],\n-                                \"description\": \"Team name. Case sensitive.\",\n-                                \"displayName\": \"Team\",\n+                                \"defaultValue\": \"us-west-2\",\n+                                \"description\": \"\",\n+                                \"displayName\": \"Region\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"asana-team-name\",\n-                                \"required\": false,\n+                                \"name\": \"Region\",\n+                                \"required\": true,\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+                            \"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\": \"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.DistributedMapCacheClient\",\n+                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n                                     \"version\": \"2.0.0-M3\"\n                                 }\n+                            },\n+                            \"json-payload\": {\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\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"json-payload\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n                             }\n                         },\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.aws.ml.polly.GetAwsPollyJobStatus\"\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+                                \"description\": \"FlowFiles are routed to failure relationship\",\n+                                \"name\": \"failure\"\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\": \"FlowFiles are routed to success relationship\",\n+                                \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"Newly collected objects are routed to this relationship.\",\n-                                \"name\": \"new\"\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                         \"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+                            \"AWS\",\n+                            \"Amazon\",\n+                            \"ML\",\n+                            \"Machine Learning\",\n+                            \"Polly\"\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.aws.ml.polly.StartAwsPollyJob\",\n+                        \"typeDescription\": \"Trigger a AWS Polly job. It should be followed by GetAwsPollyJobStatus processor in order to monitor job status.\",\n                         \"useCases\": [],\n                         \"version\": \"2.0.0-M3\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"Global ID of the object in Asana.\",\n-                                \"name\": \"asana.gid\"\n+                                \"description\": \"The task ID that can be used to poll for Job completion in GetAwsPollyJobStatus\",\n+                                \"name\": \"awsTaskId\"\n                             }\n                         ]\n-                    }\n-                ],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\n-        },\n-        {\n-            \"artifact\": \"nifi-pgp-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [],\n-                \"processors\": [\n+                    },\n                     {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-pgp-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-aws-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -28493,128 +34524,379 @@\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                         \"multiProcessorUseCases\": [],\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"decryption-strategy\": {\n+                            \"AWS Credentials Provider service\": {\n+                                \"description\": \"The Controller Service that is used to obtain AWS credentials provider\",\n+                                \"displayName\": \"AWS Credentials Provider Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"AWS Credentials Provider service\",\n+                                \"required\": true,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-aws-service-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.processors.aws.credentials.provider.service.AWSCredentialsProviderService\",\n+                                    \"version\": \"2.0.0-M3\"\n+                                }\n+                            },\n+                            \"Communications Timeout\": {\n+                                \"defaultValue\": \"30 secs\",\n+                                \"description\": \"\",\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+                            \"Endpoint Override URL\": {\n+                                \"description\": \"Endpoint URL to use instead of the AWS default including scheme, host, port, and path. The AWS libraries select an endpoint URL based on the AWS region, but this property overrides the selected endpoint URL, allowing use with other S3-compatible endpoints.\",\n+                                \"displayName\": \"Endpoint Override URL\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Endpoint Override URL\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Region\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Produce decrypted content read from literal data ignoring signatures\",\n-                                        \"displayName\": \"DECRYPTED\",\n-                                        \"value\": \"DECRYPTED\"\n+                                        \"description\": \"AWS Region Code : us-gov-east-1\",\n+                                        \"displayName\": \"AWS GovCloud (US-East)\",\n+                                        \"value\": \"us-gov-east-1\"\n                                     },\n                                     {\n-                                        \"description\": \"Produce decrypted content packaged as an OpenPGP message for additional processing\",\n-                                        \"displayName\": \"PACKAGED\",\n-                                        \"value\": \"PACKAGED\"\n+                                        \"description\": \"AWS Region Code : us-gov-west-1\",\n+                                        \"displayName\": \"AWS GovCloud (US-West)\",\n+                                        \"value\": \"us-gov-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : af-south-1\",\n+                                        \"displayName\": \"Africa (Cape Town)\",\n+                                        \"value\": \"af-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-east-1\",\n+                                        \"displayName\": \"Asia Pacific (Hong Kong)\",\n+                                        \"value\": \"ap-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-south-2\",\n+                                        \"displayName\": \"Asia Pacific (Hyderabad)\",\n+                                        \"value\": \"ap-south-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-southeast-3\",\n+                                        \"displayName\": \"Asia Pacific (Jakarta)\",\n+                                        \"value\": \"ap-southeast-3\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-southeast-4\",\n+                                        \"displayName\": \"Asia Pacific (Melbourne)\",\n+                                        \"value\": \"ap-southeast-4\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-south-1\",\n+                                        \"displayName\": \"Asia Pacific (Mumbai)\",\n+                                        \"value\": \"ap-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-northeast-3\",\n+                                        \"displayName\": \"Asia Pacific (Osaka)\",\n+                                        \"value\": \"ap-northeast-3\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-northeast-2\",\n+                                        \"displayName\": \"Asia Pacific (Seoul)\",\n+                                        \"value\": \"ap-northeast-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-southeast-1\",\n+                                        \"displayName\": \"Asia Pacific (Singapore)\",\n+                                        \"value\": \"ap-southeast-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-southeast-2\",\n+                                        \"displayName\": \"Asia Pacific (Sydney)\",\n+                                        \"value\": \"ap-southeast-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-northeast-1\",\n+                                        \"displayName\": \"Asia Pacific (Tokyo)\",\n+                                        \"value\": \"ap-northeast-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ca-central-1\",\n+                                        \"displayName\": \"Canada (Central)\",\n+                                        \"value\": \"ca-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ca-west-1\",\n+                                        \"displayName\": \"Canada West (Calgary)\",\n+                                        \"value\": \"ca-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : cn-north-1\",\n+                                        \"displayName\": \"China (Beijing)\",\n+                                        \"value\": \"cn-north-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : cn-northwest-1\",\n+                                        \"displayName\": \"China (Ningxia)\",\n+                                        \"value\": \"cn-northwest-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-central-1\",\n+                                        \"displayName\": \"Europe (Frankfurt)\",\n+                                        \"value\": \"eu-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-west-1\",\n+                                        \"displayName\": \"Europe (Ireland)\",\n+                                        \"value\": \"eu-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-west-2\",\n+                                        \"displayName\": \"Europe (London)\",\n+                                        \"value\": \"eu-west-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-south-1\",\n+                                        \"displayName\": \"Europe (Milan)\",\n+                                        \"value\": \"eu-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-west-3\",\n+                                        \"displayName\": \"Europe (Paris)\",\n+                                        \"value\": \"eu-west-3\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-south-2\",\n+                                        \"displayName\": \"Europe (Spain)\",\n+                                        \"value\": \"eu-south-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-north-1\",\n+                                        \"displayName\": \"Europe (Stockholm)\",\n+                                        \"value\": \"eu-north-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-central-2\",\n+                                        \"displayName\": \"Europe (Zurich)\",\n+                                        \"value\": \"eu-central-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : il-central-1\",\n+                                        \"displayName\": \"Israel (Tel Aviv)\",\n+                                        \"value\": \"il-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : me-south-1\",\n+                                        \"displayName\": \"Middle East (Bahrain)\",\n+                                        \"value\": \"me-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : me-central-1\",\n+                                        \"displayName\": \"Middle East (UAE)\",\n+                                        \"value\": \"me-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : sa-east-1\",\n+                                        \"displayName\": \"South America (Sao Paulo)\",\n+                                        \"value\": \"sa-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-east-1\",\n+                                        \"displayName\": \"US East (N. Virginia)\",\n+                                        \"value\": \"us-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-east-2\",\n+                                        \"displayName\": \"US East (Ohio)\",\n+                                        \"value\": \"us-east-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-iso-east-1\",\n+                                        \"displayName\": \"US ISO East\",\n+                                        \"value\": \"us-iso-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-iso-west-1\",\n+                                        \"displayName\": \"US ISO WEST\",\n+                                        \"value\": \"us-iso-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-isob-east-1\",\n+                                        \"displayName\": \"US ISOB East (Ohio)\",\n+                                        \"value\": \"us-isob-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-west-1\",\n+                                        \"displayName\": \"US West (N. California)\",\n+                                        \"value\": \"us-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-west-2\",\n+                                        \"displayName\": \"US West (Oregon)\",\n+                                        \"value\": \"us-west-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-cn-global\",\n+                                        \"displayName\": \"aws-cn-global\",\n+                                        \"value\": \"aws-cn-global\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-global\",\n+                                        \"displayName\": \"aws-global\",\n+                                        \"value\": \"aws-global\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-iso-b-global\",\n+                                        \"displayName\": \"aws-iso-b-global\",\n+                                        \"value\": \"aws-iso-b-global\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-iso-global\",\n+                                        \"displayName\": \"aws-iso-global\",\n+                                        \"value\": \"aws-iso-global\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-us-gov-global\",\n+                                        \"displayName\": \"aws-us-gov-global\",\n+                                        \"value\": \"aws-us-gov-global\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"DECRYPTED\",\n-                                \"description\": \"Strategy for writing files to success after decryption\",\n-                                \"displayName\": \"Decryption Strategy\",\n+                                \"defaultValue\": \"us-west-2\",\n+                                \"description\": \"\",\n+                                \"displayName\": \"Region\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"decryption-strategy\",\n+                                \"name\": \"Region\",\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+                            \"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\": \"passphrase\",\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\": \"2.0.0-M3\"\n+                                }\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+                            \"awsTaskId\": {\n+                                \"defaultValue\": \"${awsTaskId}\",\n+                                \"description\": \"\",\n+                                \"displayName\": \"AWS Task ID\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"awsTaskId\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"proxy-configuration-service\": {\n+                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests.\",\n+                                \"displayName\": \"Proxy Configuration Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"private-key-service\",\n+                                \"name\": \"proxy-configuration-service\",\n                                 \"required\": false,\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.proxy.ProxyConfigurationService\",\n                                     \"version\": \"2.0.0-M3\"\n                                 }\n+                            },\n+                            \"textract-type\": {\n+                                \"defaultValue\": \"${awsTextractType}\",\n+                                \"description\": \"Supported values: \\\"Document Analysis\\\", \\\"Document Text Detection\\\", \\\"Expense Analysis\\\"\",\n+                                \"displayName\": \"Textract Type\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"textract-type\",\n+                                \"required\": true,\n+                                \"sensitive\": false\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+                            \"org.apache.nifi.processors.aws.ml.textract.StartAwsTextractJob\"\n                         ],\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"Decryption Succeeded\",\n-                                \"name\": \"success\"\n+                                \"description\": \"Retrieving results failed for some reason, but the issue is likely to resolve on its own, such as Provisioned Throughput Exceeded or a Throttling failure. It is generally expected to retry this relationship.\",\n+                                \"name\": \"throttled\"\n                             },\n                             {\n-                                \"description\": \"Decryption Failed\",\n+                                \"description\": \"The job is currently still being processed\",\n+                                \"name\": \"running\"\n+                            },\n+                            {\n+                                \"description\": \"Upon successful completion, the original FlowFile will be routed to this relationship.\",\n+                                \"name\": \"original\"\n+                            },\n+                            {\n+                                \"description\": \"The job failed, the original FlowFile will be routed to this relationship.\",\n                                 \"name\": \"failure\"\n+                            },\n+                            {\n+                                \"description\": \"Job successfully finished. FlowFile will be routed to this relation.\",\n+                                \"name\": \"success\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"Encryption\",\n-                            \"GPG\",\n-                            \"OpenPGP\",\n-                            \"PGP\",\n-                            \"RFC 4880\"\n+                            \"AWS\",\n+                            \"Amazon\",\n+                            \"ML\",\n+                            \"Machine Learning\",\n+                            \"Textract\"\n                         ],\n                         \"triggerSerially\": false,\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+                        \"type\": \"org.apache.nifi.processors.aws.ml.textract.GetAwsTextractJobStatus\",\n+                        \"typeDescription\": \"Retrieves the current status of an AWS Textract job.\",\n                         \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"Filename from decrypted Literal Data\",\n-                                \"name\": \"pgp.literal.data.filename\"\n-                            },\n-                            {\n-                                \"description\": \"Modified Date from decrypted Literal Data\",\n-                                \"name\": \"pgp.literal.data.modified\"\n-                            },\n-                            {\n-                                \"description\": \"Symmetric-Key Algorithm Block Cipher\",\n-                                \"name\": \"pgp.symmetric.key.algorithm.block.cipher\"\n-                            },\n-                            {\n-                                \"description\": \"Symmetric-Key Algorithm Identifier\",\n-                                \"name\": \"pgp.symmetric.key.algorithm.id\"\n-                            }\n-                        ]\n+                        \"version\": \"2.0.0-M3\"\n                     },\n                     {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-pgp-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-aws-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -28623,184 +34905,381 @@\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                         \"multiProcessorUseCases\": [],\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\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 encryption\",\n-                                \"displayName\": \"File Encoding\",\n+                            \"AWS Credentials Provider service\": {\n+                                \"description\": \"The Controller Service that is used to obtain AWS credentials provider\",\n+                                \"displayName\": \"AWS Credentials Provider Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"file-encoding\",\n+                                \"name\": \"AWS Credentials Provider service\",\n                                 \"required\": true,\n-                                \"sensitive\": false\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-aws-service-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.processors.aws.credentials.provider.service.AWSCredentialsProviderService\",\n+                                    \"version\": \"2.0.0-M3\"\n+                                }\n                             },\n-                            \"passphrase\": {\n-                                \"description\": \"Passphrase used for encrypting data with Password-Based Encryption\",\n-                                \"displayName\": \"Passphrase\",\n+                            \"Communications Timeout\": {\n+                                \"defaultValue\": \"30 secs\",\n+                                \"description\": \"\",\n+                                \"displayName\": \"Communications Timeout\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"passphrase\",\n+                                \"name\": \"Communications Timeout\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Endpoint Override URL\": {\n+                                \"description\": \"Endpoint URL to use instead of the AWS default including scheme, host, port, and path. The AWS libraries select an endpoint URL based on the AWS region, but this property overrides the selected endpoint URL, allowing use with other S3-compatible endpoints.\",\n+                                \"displayName\": \"Endpoint Override URL\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Endpoint Override URL\",\n                                 \"required\": false,\n-                                \"sensitive\": true\n+                                \"sensitive\": false\n                             },\n-                            \"public-key-search\": {\n-                                \"dependencies\": [\n+                            \"Region\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"propertyDisplayName\": \"Public Key Service\",\n-                                        \"propertyName\": \"public-key-service\"\n+                                        \"description\": \"AWS Region Code : us-gov-east-1\",\n+                                        \"displayName\": \"AWS GovCloud (US-East)\",\n+                                        \"value\": \"us-gov-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-gov-west-1\",\n+                                        \"displayName\": \"AWS GovCloud (US-West)\",\n+                                        \"value\": \"us-gov-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : af-south-1\",\n+                                        \"displayName\": \"Africa (Cape Town)\",\n+                                        \"value\": \"af-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-east-1\",\n+                                        \"displayName\": \"Asia Pacific (Hong Kong)\",\n+                                        \"value\": \"ap-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-south-2\",\n+                                        \"displayName\": \"Asia Pacific (Hyderabad)\",\n+                                        \"value\": \"ap-south-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-southeast-3\",\n+                                        \"displayName\": \"Asia Pacific (Jakarta)\",\n+                                        \"value\": \"ap-southeast-3\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-southeast-4\",\n+                                        \"displayName\": \"Asia Pacific (Melbourne)\",\n+                                        \"value\": \"ap-southeast-4\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-south-1\",\n+                                        \"displayName\": \"Asia Pacific (Mumbai)\",\n+                                        \"value\": \"ap-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-northeast-3\",\n+                                        \"displayName\": \"Asia Pacific (Osaka)\",\n+                                        \"value\": \"ap-northeast-3\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-northeast-2\",\n+                                        \"displayName\": \"Asia Pacific (Seoul)\",\n+                                        \"value\": \"ap-northeast-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-southeast-1\",\n+                                        \"displayName\": \"Asia Pacific (Singapore)\",\n+                                        \"value\": \"ap-southeast-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-southeast-2\",\n+                                        \"displayName\": \"Asia Pacific (Sydney)\",\n+                                        \"value\": \"ap-southeast-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-northeast-1\",\n+                                        \"displayName\": \"Asia Pacific (Tokyo)\",\n+                                        \"value\": \"ap-northeast-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ca-central-1\",\n+                                        \"displayName\": \"Canada (Central)\",\n+                                        \"value\": \"ca-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ca-west-1\",\n+                                        \"displayName\": \"Canada West (Calgary)\",\n+                                        \"value\": \"ca-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : cn-north-1\",\n+                                        \"displayName\": \"China (Beijing)\",\n+                                        \"value\": \"cn-north-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : cn-northwest-1\",\n+                                        \"displayName\": \"China (Ningxia)\",\n+                                        \"value\": \"cn-northwest-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-central-1\",\n+                                        \"displayName\": \"Europe (Frankfurt)\",\n+                                        \"value\": \"eu-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-west-1\",\n+                                        \"displayName\": \"Europe (Ireland)\",\n+                                        \"value\": \"eu-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-west-2\",\n+                                        \"displayName\": \"Europe (London)\",\n+                                        \"value\": \"eu-west-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-south-1\",\n+                                        \"displayName\": \"Europe (Milan)\",\n+                                        \"value\": \"eu-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-west-3\",\n+                                        \"displayName\": \"Europe (Paris)\",\n+                                        \"value\": \"eu-west-3\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-south-2\",\n+                                        \"displayName\": \"Europe (Spain)\",\n+                                        \"value\": \"eu-south-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-north-1\",\n+                                        \"displayName\": \"Europe (Stockholm)\",\n+                                        \"value\": \"eu-north-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-central-2\",\n+                                        \"displayName\": \"Europe (Zurich)\",\n+                                        \"value\": \"eu-central-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : il-central-1\",\n+                                        \"displayName\": \"Israel (Tel Aviv)\",\n+                                        \"value\": \"il-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : me-south-1\",\n+                                        \"displayName\": \"Middle East (Bahrain)\",\n+                                        \"value\": \"me-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : me-central-1\",\n+                                        \"displayName\": \"Middle East (UAE)\",\n+                                        \"value\": \"me-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : sa-east-1\",\n+                                        \"displayName\": \"South America (Sao Paulo)\",\n+                                        \"value\": \"sa-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-east-1\",\n+                                        \"displayName\": \"US East (N. Virginia)\",\n+                                        \"value\": \"us-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-east-2\",\n+                                        \"displayName\": \"US East (Ohio)\",\n+                                        \"value\": \"us-east-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-iso-east-1\",\n+                                        \"displayName\": \"US ISO East\",\n+                                        \"value\": \"us-iso-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-iso-west-1\",\n+                                        \"displayName\": \"US ISO WEST\",\n+                                        \"value\": \"us-iso-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-isob-east-1\",\n+                                        \"displayName\": \"US ISOB East (Ohio)\",\n+                                        \"value\": \"us-isob-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-west-1\",\n+                                        \"displayName\": \"US West (N. California)\",\n+                                        \"value\": \"us-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-west-2\",\n+                                        \"displayName\": \"US West (Oregon)\",\n+                                        \"value\": \"us-west-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-cn-global\",\n+                                        \"displayName\": \"aws-cn-global\",\n+                                        \"value\": \"aws-cn-global\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-global\",\n+                                        \"displayName\": \"aws-global\",\n+                                        \"value\": \"aws-global\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-iso-b-global\",\n+                                        \"displayName\": \"aws-iso-b-global\",\n+                                        \"value\": \"aws-iso-b-global\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-iso-global\",\n+                                        \"displayName\": \"aws-iso-global\",\n+                                        \"value\": \"aws-iso-global\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-us-gov-global\",\n+                                        \"displayName\": \"aws-us-gov-global\",\n+                                        \"value\": \"aws-us-gov-global\"\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\": \"us-west-2\",\n+                                \"description\": \"\",\n+                                \"displayName\": \"Region\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"public-key-search\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Region\",\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+                            \"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\": \"public-key-service\",\n+                                \"name\": \"SSL Context Service\",\n                                 \"required\": false,\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.PGPPublicKeyService\",\n+                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n                                     \"version\": \"2.0.0-M3\"\n                                 }\n                             },\n-                            \"symmetric-key-algorithm\": {\n+                            \"json-payload\": {\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\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"json-payload\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"textract-type\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"AES_128\",\n-                                        \"value\": \"AES_128\"\n+                                        \"displayName\": \"Expense Analysis\",\n+                                        \"value\": \"Expense Analysis\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"AES_192\",\n-                                        \"value\": \"AES_192\"\n+                                        \"displayName\": \"Document Analysis\",\n+                                        \"value\": \"Document Analysis\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"AES_256\",\n-                                        \"value\": \"AES_256\"\n+                                        \"displayName\": \"Document Text Detection\",\n+                                        \"value\": \"Document Text Detection\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"AES_256\",\n-                                \"description\": \"Symmetric-Key Algorithm for encryption\",\n-                                \"displayName\": \"Symmetric-Key Algorithm\",\n+                                \"defaultValue\": \"Document Analysis\",\n+                                \"description\": \"Supported values: \\\"Document Analysis\\\", \\\"Document Text Detection\\\", \\\"Expense Analysis\\\"\",\n+                                \"displayName\": \"Textract Type\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"symmetric-key-algorithm\",\n+                                \"name\": \"textract-type\",\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.aws.ml.textract.GetAwsTextractJobStatus\"\n                         ],\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"Encryption Succeeded\",\n+                                \"description\": \"FlowFiles are routed to failure relationship\",\n+                                \"name\": \"failure\"\n+                            },\n+                            {\n+                                \"description\": \"FlowFiles are routed to success relationship\",\n                                 \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"Encryption Failed\",\n-                                \"name\": \"failure\"\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                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"Encryption\",\n-                            \"GPG\",\n-                            \"OpenPGP\",\n-                            \"PGP\",\n-                            \"RFC 4880\"\n+                            \"AWS\",\n+                            \"Amazon\",\n+                            \"ML\",\n+                            \"Machine Learning\",\n+                            \"Textract\"\n                         ],\n                         \"triggerSerially\": false,\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.aws.ml.textract.StartAwsTextractJob\",\n+                        \"typeDescription\": \"Trigger a AWS Textract job. It should be followed by GetAwsTextractJobStatus processor in order to monitor job status.\",\n                         \"useCases\": [],\n                         \"version\": \"2.0.0-M3\",\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-                            },\n-                            {\n-                                \"description\": \"File Encoding\",\n-                                \"name\": \"pgp.file.encoding\"\n-                            },\n-                            {\n-                                \"description\": \"Compression Algorithm\",\n-                                \"name\": \"pgp.compression.algorithm\"\n+                                \"description\": \"The task ID that can be used to poll for Job completion in GetAwsTextractJobStatus\",\n+                                \"name\": \"awsTaskId\"\n                             },\n                             {\n-                                \"description\": \"Compression Algorithm Identifier\",\n-                                \"name\": \"pgp.compression.algorithm.id\"\n+                                \"description\": \"The selected Textract type, which can be used in GetAwsTextractJobStatus\",\n+                                \"name\": \"awsTextractType\"\n                             }\n                         ]\n                     },\n                     {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-pgp-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-aws-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -28809,200 +35288,374 @@\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                         \"multiProcessorUseCases\": [],\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\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+                            \"AWS Credentials Provider service\": {\n+                                \"description\": \"The Controller Service that is used to obtain AWS credentials provider\",\n+                                \"displayName\": \"AWS Credentials Provider Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"file-encoding\",\n+                                \"name\": \"AWS Credentials Provider service\",\n+                                \"required\": true,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-aws-service-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.processors.aws.credentials.provider.service.AWSCredentialsProviderService\",\n+                                    \"version\": \"2.0.0-M3\"\n+                                }\n+                            },\n+                            \"Communications Timeout\": {\n+                                \"defaultValue\": \"30 secs\",\n+                                \"description\": \"\",\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-                            \"hash-algorithm\": {\n+                            \"Endpoint Override URL\": {\n+                                \"description\": \"Endpoint URL to use instead of the AWS default including scheme, host, port, and path. The AWS libraries select an endpoint URL based on the AWS region, but this property overrides the selected endpoint URL, allowing use with other S3-compatible endpoints.\",\n+                                \"displayName\": \"Endpoint Override URL\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Endpoint Override URL\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Region\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SHA256\",\n-                                        \"value\": \"SHA256\"\n+                                        \"description\": \"AWS Region Code : us-gov-east-1\",\n+                                        \"displayName\": \"AWS GovCloud (US-East)\",\n+                                        \"value\": \"us-gov-east-1\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SHA384\",\n-                                        \"value\": \"SHA384\"\n+                                        \"description\": \"AWS Region Code : us-gov-west-1\",\n+                                        \"displayName\": \"AWS GovCloud (US-West)\",\n+                                        \"value\": \"us-gov-west-1\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SHA512\",\n-                                        \"value\": \"SHA512\"\n+                                        \"description\": \"AWS Region Code : af-south-1\",\n+                                        \"displayName\": \"Africa (Cape Town)\",\n+                                        \"value\": \"af-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-east-1\",\n+                                        \"displayName\": \"Asia Pacific (Hong Kong)\",\n+                                        \"value\": \"ap-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-south-2\",\n+                                        \"displayName\": \"Asia Pacific (Hyderabad)\",\n+                                        \"value\": \"ap-south-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-southeast-3\",\n+                                        \"displayName\": \"Asia Pacific (Jakarta)\",\n+                                        \"value\": \"ap-southeast-3\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-southeast-4\",\n+                                        \"displayName\": \"Asia Pacific (Melbourne)\",\n+                                        \"value\": \"ap-southeast-4\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-south-1\",\n+                                        \"displayName\": \"Asia Pacific (Mumbai)\",\n+                                        \"value\": \"ap-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-northeast-3\",\n+                                        \"displayName\": \"Asia Pacific (Osaka)\",\n+                                        \"value\": \"ap-northeast-3\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-northeast-2\",\n+                                        \"displayName\": \"Asia Pacific (Seoul)\",\n+                                        \"value\": \"ap-northeast-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-southeast-1\",\n+                                        \"displayName\": \"Asia Pacific (Singapore)\",\n+                                        \"value\": \"ap-southeast-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-southeast-2\",\n+                                        \"displayName\": \"Asia Pacific (Sydney)\",\n+                                        \"value\": \"ap-southeast-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-northeast-1\",\n+                                        \"displayName\": \"Asia Pacific (Tokyo)\",\n+                                        \"value\": \"ap-northeast-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ca-central-1\",\n+                                        \"displayName\": \"Canada (Central)\",\n+                                        \"value\": \"ca-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ca-west-1\",\n+                                        \"displayName\": \"Canada West (Calgary)\",\n+                                        \"value\": \"ca-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : cn-north-1\",\n+                                        \"displayName\": \"China (Beijing)\",\n+                                        \"value\": \"cn-north-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : cn-northwest-1\",\n+                                        \"displayName\": \"China (Ningxia)\",\n+                                        \"value\": \"cn-northwest-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-central-1\",\n+                                        \"displayName\": \"Europe (Frankfurt)\",\n+                                        \"value\": \"eu-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-west-1\",\n+                                        \"displayName\": \"Europe (Ireland)\",\n+                                        \"value\": \"eu-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-west-2\",\n+                                        \"displayName\": \"Europe (London)\",\n+                                        \"value\": \"eu-west-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-south-1\",\n+                                        \"displayName\": \"Europe (Milan)\",\n+                                        \"value\": \"eu-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-west-3\",\n+                                        \"displayName\": \"Europe (Paris)\",\n+                                        \"value\": \"eu-west-3\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-south-2\",\n+                                        \"displayName\": \"Europe (Spain)\",\n+                                        \"value\": \"eu-south-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-north-1\",\n+                                        \"displayName\": \"Europe (Stockholm)\",\n+                                        \"value\": \"eu-north-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-central-2\",\n+                                        \"displayName\": \"Europe (Zurich)\",\n+                                        \"value\": \"eu-central-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : il-central-1\",\n+                                        \"displayName\": \"Israel (Tel Aviv)\",\n+                                        \"value\": \"il-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : me-south-1\",\n+                                        \"displayName\": \"Middle East (Bahrain)\",\n+                                        \"value\": \"me-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : me-central-1\",\n+                                        \"displayName\": \"Middle East (UAE)\",\n+                                        \"value\": \"me-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : sa-east-1\",\n+                                        \"displayName\": \"South America (Sao Paulo)\",\n+                                        \"value\": \"sa-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-east-1\",\n+                                        \"displayName\": \"US East (N. Virginia)\",\n+                                        \"value\": \"us-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-east-2\",\n+                                        \"displayName\": \"US East (Ohio)\",\n+                                        \"value\": \"us-east-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-iso-east-1\",\n+                                        \"displayName\": \"US ISO East\",\n+                                        \"value\": \"us-iso-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-iso-west-1\",\n+                                        \"displayName\": \"US ISO WEST\",\n+                                        \"value\": \"us-iso-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-isob-east-1\",\n+                                        \"displayName\": \"US ISOB East (Ohio)\",\n+                                        \"value\": \"us-isob-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-west-1\",\n+                                        \"displayName\": \"US West (N. California)\",\n+                                        \"value\": \"us-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-west-2\",\n+                                        \"displayName\": \"US West (Oregon)\",\n+                                        \"value\": \"us-west-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-cn-global\",\n+                                        \"displayName\": \"aws-cn-global\",\n+                                        \"value\": \"aws-cn-global\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-global\",\n+                                        \"displayName\": \"aws-global\",\n+                                        \"value\": \"aws-global\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-iso-b-global\",\n+                                        \"displayName\": \"aws-iso-b-global\",\n+                                        \"value\": \"aws-iso-b-global\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-iso-global\",\n+                                        \"displayName\": \"aws-iso-global\",\n+                                        \"value\": \"aws-iso-global\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-us-gov-global\",\n+                                        \"displayName\": \"aws-us-gov-global\",\n+                                        \"value\": \"aws-us-gov-global\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"SHA512\",\n-                                \"description\": \"Hash Algorithm for signing\",\n-                                \"displayName\": \"Hash Algorithm\",\n+                                \"defaultValue\": \"us-west-2\",\n+                                \"description\": \"\",\n+                                \"displayName\": \"Region\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"hash-algorithm\",\n+                                \"name\": \"Region\",\n                                 \"required\": true,\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+                            \"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\": \"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\": \"2.0.0-M3\"\n+                                }\n+                            },\n+                            \"awsTaskId\": {\n+                                \"defaultValue\": \"${awsTaskId}\",\n+                                \"description\": \"\",\n+                                \"displayName\": \"AWS Task ID\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"private-key-id\",\n+                                \"name\": \"awsTaskId\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"private-key-service\": {\n-                                \"description\": \"PGP Private Key Service for generating content signatures\",\n-                                \"displayName\": \"Private Key Service\",\n+                            \"proxy-configuration-service\": {\n+                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests.\",\n+                                \"displayName\": \"Proxy Configuration Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"private-key-service\",\n-                                \"required\": true,\n+                                \"name\": \"proxy-configuration-service\",\n+                                \"required\": false,\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.proxy.ProxyConfigurationService\",\n                                     \"version\": \"2.0.0-M3\"\n                                 }\n-                            },\n-                            \"signing-strategy\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Produce signed content packaged as an OpenPGP message\",\n-                                        \"displayName\": \"SIGNED\",\n-                                        \"value\": \"SIGNED\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Produce detached signature based on associated content packaged according to OpenPGP encoding\",\n-                                        \"displayName\": \"DETACHED\",\n-                                        \"value\": \"DETACHED\"\n-                                    }\n-                                ],\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\": \"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+                            \"org.apache.nifi.processors.aws.ml.transcribe.StartAwsTranscribeJob\"\n                         ],\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"Content signing succeeded\",\n-                                \"name\": \"success\"\n+                                \"description\": \"Retrieving results failed for some reason, but the issue is likely to resolve on its own, such as Provisioned Throughput Exceeded or a Throttling failure. It is generally expected to retry this relationship.\",\n+                                \"name\": \"throttled\"\n                             },\n                             {\n-                                \"description\": \"Content signing failed\",\n+                                \"description\": \"The job is currently still being processed\",\n+                                \"name\": \"running\"\n+                            },\n+                            {\n+                                \"description\": \"Upon successful completion, the original FlowFile will be routed to this relationship.\",\n+                                \"name\": \"original\"\n+                            },\n+                            {\n+                                \"description\": \"The job failed, the original FlowFile will be routed to this relationship.\",\n                                 \"name\": \"failure\"\n+                            },\n+                            {\n+                                \"description\": \"Job successfully finished. FlowFile will be routed to this relation.\",\n+                                \"name\": \"success\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"Encryption\",\n-                            \"GPG\",\n-                            \"OpenPGP\",\n-                            \"PGP\",\n-                            \"RFC 4880\",\n-                            \"Signing\"\n+                            \"AWS\",\n+                            \"Amazon\",\n+                            \"ML\",\n+                            \"Machine Learning\",\n+                            \"Transcribe\"\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.aws.ml.transcribe.GetAwsTranscribeJobStatus\",\n+                        \"typeDescription\": \"Retrieves the current status of an AWS Transcribe job.\",\n                         \"useCases\": [],\n                         \"version\": \"2.0.0-M3\",\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-                            },\n-                            {\n-                                \"description\": \"Signature Version Number\",\n-                                \"name\": \"pgp.signature.version\"\n+                                \"description\": \"S3 path-style output location of the result.\",\n+                                \"name\": \"outputLocation\"\n                             }\n                         ]\n                     },\n                     {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-pgp-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-aws-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -29011,347 +35664,1076 @@\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                         \"multiProcessorUseCases\": [],\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+                            \"AWS Credentials Provider service\": {\n+                                \"description\": \"The Controller Service that is used to obtain AWS credentials provider\",\n+                                \"displayName\": \"AWS Credentials Provider Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"public-key-service\",\n+                                \"name\": \"AWS Credentials Provider service\",\n                                 \"required\": true,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-pgp-service-api-nar\",\n+                                    \"artifact\": \"nifi-aws-service-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.pgp.service.api.PGPPublicKeyService\",\n+                                    \"type\": \"org.apache.nifi.processors.aws.credentials.provider.service.AWSCredentialsProviderService\",\n                                     \"version\": \"2.0.0-M3\"\n                                 }\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\": \"Signature Verification Succeeded\",\n-                                \"name\": \"success\"\n                             },\n-                            {\n-                                \"description\": \"Signature Verification Failed\",\n-                                \"name\": \"failure\"\n-                            }\n-                        ],\n-                        \"supportedSchedulingStrategies\": [\n+                            \"Communications Timeout\": {\n+                                \"defaultValue\": \"30 secs\",\n+                                \"description\": \"\",\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+                            \"Endpoint Override URL\": {\n+                                \"description\": \"Endpoint URL to use instead of the AWS default including scheme, host, port, and path. The AWS libraries select an endpoint URL based on the AWS region, but this property overrides the selected endpoint URL, allowing use with other S3-compatible endpoints.\",\n+                                \"displayName\": \"Endpoint Override URL\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Endpoint Override URL\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Region\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-gov-east-1\",\n+                                        \"displayName\": \"AWS GovCloud (US-East)\",\n+                                        \"value\": \"us-gov-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-gov-west-1\",\n+                                        \"displayName\": \"AWS GovCloud (US-West)\",\n+                                        \"value\": \"us-gov-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : af-south-1\",\n+                                        \"displayName\": \"Africa (Cape Town)\",\n+                                        \"value\": \"af-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-east-1\",\n+                                        \"displayName\": \"Asia Pacific (Hong Kong)\",\n+                                        \"value\": \"ap-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-south-2\",\n+                                        \"displayName\": \"Asia Pacific (Hyderabad)\",\n+                                        \"value\": \"ap-south-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-southeast-3\",\n+                                        \"displayName\": \"Asia Pacific (Jakarta)\",\n+                                        \"value\": \"ap-southeast-3\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-southeast-4\",\n+                                        \"displayName\": \"Asia Pacific (Melbourne)\",\n+                                        \"value\": \"ap-southeast-4\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-south-1\",\n+                                        \"displayName\": \"Asia Pacific (Mumbai)\",\n+                                        \"value\": \"ap-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-northeast-3\",\n+                                        \"displayName\": \"Asia Pacific (Osaka)\",\n+                                        \"value\": \"ap-northeast-3\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-northeast-2\",\n+                                        \"displayName\": \"Asia Pacific (Seoul)\",\n+                                        \"value\": \"ap-northeast-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-southeast-1\",\n+                                        \"displayName\": \"Asia Pacific (Singapore)\",\n+                                        \"value\": \"ap-southeast-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-southeast-2\",\n+                                        \"displayName\": \"Asia Pacific (Sydney)\",\n+                                        \"value\": \"ap-southeast-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-northeast-1\",\n+                                        \"displayName\": \"Asia Pacific (Tokyo)\",\n+                                        \"value\": \"ap-northeast-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ca-central-1\",\n+                                        \"displayName\": \"Canada (Central)\",\n+                                        \"value\": \"ca-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ca-west-1\",\n+                                        \"displayName\": \"Canada West (Calgary)\",\n+                                        \"value\": \"ca-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : cn-north-1\",\n+                                        \"displayName\": \"China (Beijing)\",\n+                                        \"value\": \"cn-north-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : cn-northwest-1\",\n+                                        \"displayName\": \"China (Ningxia)\",\n+                                        \"value\": \"cn-northwest-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-central-1\",\n+                                        \"displayName\": \"Europe (Frankfurt)\",\n+                                        \"value\": \"eu-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-west-1\",\n+                                        \"displayName\": \"Europe (Ireland)\",\n+                                        \"value\": \"eu-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-west-2\",\n+                                        \"displayName\": \"Europe (London)\",\n+                                        \"value\": \"eu-west-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-south-1\",\n+                                        \"displayName\": \"Europe (Milan)\",\n+                                        \"value\": \"eu-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-west-3\",\n+                                        \"displayName\": \"Europe (Paris)\",\n+                                        \"value\": \"eu-west-3\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-south-2\",\n+                                        \"displayName\": \"Europe (Spain)\",\n+                                        \"value\": \"eu-south-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-north-1\",\n+                                        \"displayName\": \"Europe (Stockholm)\",\n+                                        \"value\": \"eu-north-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-central-2\",\n+                                        \"displayName\": \"Europe (Zurich)\",\n+                                        \"value\": \"eu-central-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : il-central-1\",\n+                                        \"displayName\": \"Israel (Tel Aviv)\",\n+                                        \"value\": \"il-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : me-south-1\",\n+                                        \"displayName\": \"Middle East (Bahrain)\",\n+                                        \"value\": \"me-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : me-central-1\",\n+                                        \"displayName\": \"Middle East (UAE)\",\n+                                        \"value\": \"me-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : sa-east-1\",\n+                                        \"displayName\": \"South America (Sao Paulo)\",\n+                                        \"value\": \"sa-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-east-1\",\n+                                        \"displayName\": \"US East (N. Virginia)\",\n+                                        \"value\": \"us-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-east-2\",\n+                                        \"displayName\": \"US East (Ohio)\",\n+                                        \"value\": \"us-east-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-iso-east-1\",\n+                                        \"displayName\": \"US ISO East\",\n+                                        \"value\": \"us-iso-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-iso-west-1\",\n+                                        \"displayName\": \"US ISO WEST\",\n+                                        \"value\": \"us-iso-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-isob-east-1\",\n+                                        \"displayName\": \"US ISOB East (Ohio)\",\n+                                        \"value\": \"us-isob-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-west-1\",\n+                                        \"displayName\": \"US West (N. California)\",\n+                                        \"value\": \"us-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-west-2\",\n+                                        \"displayName\": \"US West (Oregon)\",\n+                                        \"value\": \"us-west-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-cn-global\",\n+                                        \"displayName\": \"aws-cn-global\",\n+                                        \"value\": \"aws-cn-global\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-global\",\n+                                        \"displayName\": \"aws-global\",\n+                                        \"value\": \"aws-global\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-iso-b-global\",\n+                                        \"displayName\": \"aws-iso-b-global\",\n+                                        \"value\": \"aws-iso-b-global\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-iso-global\",\n+                                        \"displayName\": \"aws-iso-global\",\n+                                        \"value\": \"aws-iso-global\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-us-gov-global\",\n+                                        \"displayName\": \"aws-us-gov-global\",\n+                                        \"value\": \"aws-us-gov-global\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"us-west-2\",\n+                                \"description\": \"\",\n+                                \"displayName\": \"Region\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Region\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\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\": \"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\": \"2.0.0-M3\"\n+                                }\n+                            },\n+                            \"json-payload\": {\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\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"json-payload\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            }\n+                        },\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.aws.ml.transcribe.GetAwsTranscribeJobStatus\"\n+                        ],\n+                        \"sideEffectFree\": false,\n+                        \"supportedRelationships\": [\n+                            {\n+                                \"description\": \"FlowFiles are routed to failure relationship\",\n+                                \"name\": \"failure\"\n+                            },\n+                            {\n+                                \"description\": \"FlowFiles are routed to success relationship\",\n+                                \"name\": \"success\"\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                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"Encryption\",\n-                            \"GPG\",\n-                            \"OpenPGP\",\n-                            \"PGP\",\n-                            \"RFC 4880\",\n-                            \"Signing\"\n+                            \"AWS\",\n+                            \"Amazon\",\n+                            \"ML\",\n+                            \"Machine Learning\",\n+                            \"Transcribe\"\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.aws.ml.transcribe.StartAwsTranscribeJob\",\n+                        \"typeDescription\": \"Trigger a AWS Transcribe job. It should be followed by GetAwsTranscribeStatus processor in order to monitor job status.\",\n                         \"useCases\": [],\n                         \"version\": \"2.0.0-M3\",\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-                            },\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+                                \"description\": \"The task ID that can be used to poll for Job completion in GetAwsTranscribeJobStatus\",\n+                                \"name\": \"awsTaskId\"\n                             }\n                         ]\n-                    }\n-                ],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"2.0.0-M3\"\n-        },\n-        {\n-            \"artifact\": \"nifi-jms-processors-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [\n+                    },\n                     {\n                         \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-jms-processors-nar\",\n+                        \"artifact\": \"nifi-aws-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\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\": \"ENVIRONMENT\",\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+                            \"TIMER_DRIVEN\": 1\n+                        },\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+                        \"multiProcessorUseCases\": [],\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+                            \"AWS Credentials Provider service\": {\n+                                \"description\": \"The Controller Service that is used to obtain AWS credentials provider\",\n+                                \"displayName\": \"AWS Credentials Provider Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"SSL Context Service\",\n-                                \"required\": false,\n+                                \"name\": \"AWS Credentials Provider service\",\n+                                \"required\": true,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"artifact\": \"nifi-aws-service-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n+                                    \"type\": \"org.apache.nifi.processors.aws.credentials.provider.service.AWSCredentialsProviderService\",\n                                     \"version\": \"2.0.0-M3\"\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+                            \"Communications Timeout\": {\n+                                \"defaultValue\": \"30 secs\",\n+                                \"description\": \"\",\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+                            \"Endpoint Override URL\": {\n+                                \"description\": \"Endpoint URL to use instead of the AWS default including scheme, host, port, and path. The AWS libraries select an endpoint URL based on the AWS region, but this property overrides the selected endpoint URL, allowing use with other S3-compatible endpoints.\",\n+                                \"displayName\": \"Endpoint Override URL\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"broker\",\n+                                \"name\": \"Endpoint Override URL\",\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+                            \"Region\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-gov-east-1\",\n+                                        \"displayName\": \"AWS GovCloud (US-East)\",\n+                                        \"value\": \"us-gov-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-gov-west-1\",\n+                                        \"displayName\": \"AWS GovCloud (US-West)\",\n+                                        \"value\": \"us-gov-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : af-south-1\",\n+                                        \"displayName\": \"Africa (Cape Town)\",\n+                                        \"value\": \"af-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-east-1\",\n+                                        \"displayName\": \"Asia Pacific (Hong Kong)\",\n+                                        \"value\": \"ap-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-south-2\",\n+                                        \"displayName\": \"Asia Pacific (Hyderabad)\",\n+                                        \"value\": \"ap-south-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-southeast-3\",\n+                                        \"displayName\": \"Asia Pacific (Jakarta)\",\n+                                        \"value\": \"ap-southeast-3\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-southeast-4\",\n+                                        \"displayName\": \"Asia Pacific (Melbourne)\",\n+                                        \"value\": \"ap-southeast-4\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-south-1\",\n+                                        \"displayName\": \"Asia Pacific (Mumbai)\",\n+                                        \"value\": \"ap-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-northeast-3\",\n+                                        \"displayName\": \"Asia Pacific (Osaka)\",\n+                                        \"value\": \"ap-northeast-3\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-northeast-2\",\n+                                        \"displayName\": \"Asia Pacific (Seoul)\",\n+                                        \"value\": \"ap-northeast-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-southeast-1\",\n+                                        \"displayName\": \"Asia Pacific (Singapore)\",\n+                                        \"value\": \"ap-southeast-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-southeast-2\",\n+                                        \"displayName\": \"Asia Pacific (Sydney)\",\n+                                        \"value\": \"ap-southeast-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-northeast-1\",\n+                                        \"displayName\": \"Asia Pacific (Tokyo)\",\n+                                        \"value\": \"ap-northeast-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ca-central-1\",\n+                                        \"displayName\": \"Canada (Central)\",\n+                                        \"value\": \"ca-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ca-west-1\",\n+                                        \"displayName\": \"Canada West (Calgary)\",\n+                                        \"value\": \"ca-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : cn-north-1\",\n+                                        \"displayName\": \"China (Beijing)\",\n+                                        \"value\": \"cn-north-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : cn-northwest-1\",\n+                                        \"displayName\": \"China (Ningxia)\",\n+                                        \"value\": \"cn-northwest-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-central-1\",\n+                                        \"displayName\": \"Europe (Frankfurt)\",\n+                                        \"value\": \"eu-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-west-1\",\n+                                        \"displayName\": \"Europe (Ireland)\",\n+                                        \"value\": \"eu-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-west-2\",\n+                                        \"displayName\": \"Europe (London)\",\n+                                        \"value\": \"eu-west-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-south-1\",\n+                                        \"displayName\": \"Europe (Milan)\",\n+                                        \"value\": \"eu-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-west-3\",\n+                                        \"displayName\": \"Europe (Paris)\",\n+                                        \"value\": \"eu-west-3\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-south-2\",\n+                                        \"displayName\": \"Europe (Spain)\",\n+                                        \"value\": \"eu-south-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-north-1\",\n+                                        \"displayName\": \"Europe (Stockholm)\",\n+                                        \"value\": \"eu-north-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-central-2\",\n+                                        \"displayName\": \"Europe (Zurich)\",\n+                                        \"value\": \"eu-central-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : il-central-1\",\n+                                        \"displayName\": \"Israel (Tel Aviv)\",\n+                                        \"value\": \"il-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : me-south-1\",\n+                                        \"displayName\": \"Middle East (Bahrain)\",\n+                                        \"value\": \"me-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : me-central-1\",\n+                                        \"displayName\": \"Middle East (UAE)\",\n+                                        \"value\": \"me-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : sa-east-1\",\n+                                        \"displayName\": \"South America (Sao Paulo)\",\n+                                        \"value\": \"sa-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-east-1\",\n+                                        \"displayName\": \"US East (N. Virginia)\",\n+                                        \"value\": \"us-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-east-2\",\n+                                        \"displayName\": \"US East (Ohio)\",\n+                                        \"value\": \"us-east-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-iso-east-1\",\n+                                        \"displayName\": \"US ISO East\",\n+                                        \"value\": \"us-iso-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-iso-west-1\",\n+                                        \"displayName\": \"US ISO WEST\",\n+                                        \"value\": \"us-iso-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-isob-east-1\",\n+                                        \"displayName\": \"US ISOB East (Ohio)\",\n+                                        \"value\": \"us-isob-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-west-1\",\n+                                        \"displayName\": \"US West (N. California)\",\n+                                        \"value\": \"us-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-west-2\",\n+                                        \"displayName\": \"US West (Oregon)\",\n+                                        \"value\": \"us-west-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-cn-global\",\n+                                        \"displayName\": \"aws-cn-global\",\n+                                        \"value\": \"aws-cn-global\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-global\",\n+                                        \"displayName\": \"aws-global\",\n+                                        \"value\": \"aws-global\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-iso-b-global\",\n+                                        \"displayName\": \"aws-iso-b-global\",\n+                                        \"value\": \"aws-iso-b-global\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-iso-global\",\n+                                        \"displayName\": \"aws-iso-global\",\n+                                        \"value\": \"aws-iso-global\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-us-gov-global\",\n+                                        \"displayName\": \"aws-us-gov-global\",\n+                                        \"value\": \"aws-us-gov-global\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"us-west-2\",\n+                                \"description\": \"\",\n+                                \"displayName\": \"Region\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"cf\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Region\",\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+                            \"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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"cflib\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"SSL Context Service\",\n                                 \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"MULTIPLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\",\n-                                        \"DIRECTORY\",\n-                                        \"URL\"\n-                                    ]\n-                                },\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\": \"2.0.0-M3\"\n+                                }\n+                            },\n+                            \"awsTaskId\": {\n+                                \"defaultValue\": \"${awsTaskId}\",\n+                                \"description\": \"\",\n+                                \"displayName\": \"AWS Task ID\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"awsTaskId\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n+                            },\n+                            \"proxy-configuration-service\": {\n+                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests.\",\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\": \"2.0.0-M3\"\n+                                }\n                             }\n                         },\n-                        \"providedApiImplementations\": [\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.aws.ml.translate.StartAwsTranslateJob\"\n+                        ],\n+                        \"sideEffectFree\": false,\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\": \"2.0.0-M3\"\n+                                \"description\": \"Retrieving results failed for some reason, but the issue is likely to resolve on its own, such as Provisioned Throughput Exceeded or a Throttling failure. It is generally expected to retry this relationship.\",\n+                                \"name\": \"throttled\"\n+                            },\n+                            {\n+                                \"description\": \"The job is currently still being processed\",\n+                                \"name\": \"running\"\n+                            },\n+                            {\n+                                \"description\": \"Upon successful completion, the original FlowFile will be routed to this relationship.\",\n+                                \"name\": \"original\"\n+                            },\n+                            {\n+                                \"description\": \"The job failed, the original FlowFile will be routed to this relationship.\",\n+                                \"name\": \"failure\"\n+                            },\n+                            {\n+                                \"description\": \"Job successfully finished. FlowFile will be routed to this relation.\",\n+                                \"name\": \"success\"\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                         ],\n-                        \"supportsDynamicProperties\": true,\n+                        \"supportsBatching\": false,\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"integration\",\n-                            \"jms\",\n-                            \"messaging\",\n-                            \"publish\",\n-                            \"queue\",\n-                            \"subscribe\",\n-                            \"topic\"\n+                            \"AWS\",\n+                            \"Amazon\",\n+                            \"ML\",\n+                            \"Machine Learning\",\n+                            \"Translate\"\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\": \"2.0.0-M3\"\n+                        \"triggerSerially\": false,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.aws.ml.translate.GetAwsTranslateJobStatus\",\n+                        \"typeDescription\": \"Retrieves the current status of an AWS Translate job.\",\n+                        \"useCases\": [],\n+                        \"version\": \"2.0.0-M3\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"S3 path-style output location of the result.\",\n+                                \"name\": \"outputLocation\"\n+                            }\n+                        ]\n                     },\n                     {\n                         \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-jms-processors-nar\",\n+                        \"artifact\": \"nifi-aws-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\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\": \"ENVIRONMENT\",\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+                        \"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+                        \"multiProcessorUseCases\": [],\n+                        \"primaryNodeOnly\": false,\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+                            \"AWS Credentials Provider service\": {\n+                                \"description\": \"The Controller Service that is used to obtain AWS credentials provider\",\n+                                \"displayName\": \"AWS Credentials Provider Service\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"connection.factory.name\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"AWS Credentials Provider service\",\n                                 \"required\": true,\n-                                \"sensitive\": false\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-aws-service-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.processors.aws.credentials.provider.service.AWSCredentialsProviderService\",\n+                                    \"version\": \"2.0.0-M3\"\n+                                }\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+                            \"Communications Timeout\": {\n+                                \"defaultValue\": \"30 secs\",\n+                                \"description\": \"\",\n+                                \"displayName\": \"Communications Timeout\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"java.naming.factory.initial\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Communications Timeout\",\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+                            \"Endpoint Override URL\": {\n+                                \"description\": \"Endpoint URL to use instead of the AWS default including scheme, host, port, and path. The AWS libraries select an endpoint URL based on the AWS region, but this property overrides the selected endpoint URL, allowing use with other S3-compatible endpoints.\",\n+                                \"displayName\": \"Endpoint Override URL\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"java.naming.provider.url\",\n-                                \"required\": true,\n+                                \"name\": \"Endpoint Override URL\",\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+                            \"Region\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-gov-east-1\",\n+                                        \"displayName\": \"AWS GovCloud (US-East)\",\n+                                        \"value\": \"us-gov-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-gov-west-1\",\n+                                        \"displayName\": \"AWS GovCloud (US-West)\",\n+                                        \"value\": \"us-gov-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : af-south-1\",\n+                                        \"displayName\": \"Africa (Cape Town)\",\n+                                        \"value\": \"af-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-east-1\",\n+                                        \"displayName\": \"Asia Pacific (Hong Kong)\",\n+                                        \"value\": \"ap-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-south-2\",\n+                                        \"displayName\": \"Asia Pacific (Hyderabad)\",\n+                                        \"value\": \"ap-south-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-southeast-3\",\n+                                        \"displayName\": \"Asia Pacific (Jakarta)\",\n+                                        \"value\": \"ap-southeast-3\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-southeast-4\",\n+                                        \"displayName\": \"Asia Pacific (Melbourne)\",\n+                                        \"value\": \"ap-southeast-4\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-south-1\",\n+                                        \"displayName\": \"Asia Pacific (Mumbai)\",\n+                                        \"value\": \"ap-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-northeast-3\",\n+                                        \"displayName\": \"Asia Pacific (Osaka)\",\n+                                        \"value\": \"ap-northeast-3\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-northeast-2\",\n+                                        \"displayName\": \"Asia Pacific (Seoul)\",\n+                                        \"value\": \"ap-northeast-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-southeast-1\",\n+                                        \"displayName\": \"Asia Pacific (Singapore)\",\n+                                        \"value\": \"ap-southeast-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-southeast-2\",\n+                                        \"displayName\": \"Asia Pacific (Sydney)\",\n+                                        \"value\": \"ap-southeast-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-northeast-1\",\n+                                        \"displayName\": \"Asia Pacific (Tokyo)\",\n+                                        \"value\": \"ap-northeast-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ca-central-1\",\n+                                        \"displayName\": \"Canada (Central)\",\n+                                        \"value\": \"ca-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ca-west-1\",\n+                                        \"displayName\": \"Canada West (Calgary)\",\n+                                        \"value\": \"ca-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : cn-north-1\",\n+                                        \"displayName\": \"China (Beijing)\",\n+                                        \"value\": \"cn-north-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : cn-northwest-1\",\n+                                        \"displayName\": \"China (Ningxia)\",\n+                                        \"value\": \"cn-northwest-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-central-1\",\n+                                        \"displayName\": \"Europe (Frankfurt)\",\n+                                        \"value\": \"eu-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-west-1\",\n+                                        \"displayName\": \"Europe (Ireland)\",\n+                                        \"value\": \"eu-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-west-2\",\n+                                        \"displayName\": \"Europe (London)\",\n+                                        \"value\": \"eu-west-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-south-1\",\n+                                        \"displayName\": \"Europe (Milan)\",\n+                                        \"value\": \"eu-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-west-3\",\n+                                        \"displayName\": \"Europe (Paris)\",\n+                                        \"value\": \"eu-west-3\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-south-2\",\n+                                        \"displayName\": \"Europe (Spain)\",\n+                                        \"value\": \"eu-south-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-north-1\",\n+                                        \"displayName\": \"Europe (Stockholm)\",\n+                                        \"value\": \"eu-north-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-central-2\",\n+                                        \"displayName\": \"Europe (Zurich)\",\n+                                        \"value\": \"eu-central-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : il-central-1\",\n+                                        \"displayName\": \"Israel (Tel Aviv)\",\n+                                        \"value\": \"il-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : me-south-1\",\n+                                        \"displayName\": \"Middle East (Bahrain)\",\n+                                        \"value\": \"me-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : me-central-1\",\n+                                        \"displayName\": \"Middle East (UAE)\",\n+                                        \"value\": \"me-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : sa-east-1\",\n+                                        \"displayName\": \"South America (Sao Paulo)\",\n+                                        \"value\": \"sa-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-east-1\",\n+                                        \"displayName\": \"US East (N. Virginia)\",\n+                                        \"value\": \"us-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-east-2\",\n+                                        \"displayName\": \"US East (Ohio)\",\n+                                        \"value\": \"us-east-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-iso-east-1\",\n+                                        \"displayName\": \"US ISO East\",\n+                                        \"value\": \"us-iso-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-iso-west-1\",\n+                                        \"displayName\": \"US ISO WEST\",\n+                                        \"value\": \"us-iso-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-isob-east-1\",\n+                                        \"displayName\": \"US ISOB East (Ohio)\",\n+                                        \"value\": \"us-isob-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-west-1\",\n+                                        \"displayName\": \"US West (N. California)\",\n+                                        \"value\": \"us-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-west-2\",\n+                                        \"displayName\": \"US West (Oregon)\",\n+                                        \"value\": \"us-west-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-cn-global\",\n+                                        \"displayName\": \"aws-cn-global\",\n+                                        \"value\": \"aws-cn-global\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-global\",\n+                                        \"displayName\": \"aws-global\",\n+                                        \"value\": \"aws-global\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-iso-b-global\",\n+                                        \"displayName\": \"aws-iso-b-global\",\n+                                        \"value\": \"aws-iso-b-global\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-iso-global\",\n+                                        \"displayName\": \"aws-iso-global\",\n+                                        \"value\": \"aws-iso-global\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-us-gov-global\",\n+                                        \"displayName\": \"aws-us-gov-global\",\n+                                        \"value\": \"aws-us-gov-global\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"us-west-2\",\n+                                \"description\": \"\",\n+                                \"displayName\": \"Region\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"java.naming.security.credentials\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n+                                \"name\": \"Region\",\n+                                \"required\": 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+                            \"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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"java.naming.security.principal\",\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\": \"2.0.0-M3\"\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+                            \"json-payload\": {\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"naming.factory.libraries\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"json-payload\",\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+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.aws.ml.translate.GetAwsTranslateJobStatus\"\n+                        ],\n+                        \"sideEffectFree\": false,\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\": \"2.0.0-M3\"\n+                                \"description\": \"FlowFiles are routed to failure relationship\",\n+                                \"name\": \"failure\"\n+                            },\n+                            {\n+                                \"description\": \"FlowFiles are routed to success relationship\",\n+                                \"name\": \"success\"\n+                            },\n+                            {\n+                                \"description\": \"Upon successful completion, the original FlowFile will be routed to this relationship.\",\n+                                \"name\": \"original\"\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+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\n                         ],\n-                        \"supportsDynamicProperties\": true,\n+                        \"supportsBatching\": false,\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"integration\",\n-                            \"jms\",\n-                            \"jndi\",\n-                            \"messaging\",\n-                            \"publish\",\n-                            \"queue\",\n-                            \"subscribe\",\n-                            \"topic\"\n+                            \"AWS\",\n+                            \"Amazon\",\n+                            \"ML\",\n+                            \"Machine Learning\",\n+                            \"Translate\"\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\": \"2.0.0-M3\"\n-                    }\n-                ],\n-                \"processors\": [\n+                        \"triggerSerially\": false,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.aws.ml.translate.StartAwsTranslateJob\",\n+                        \"typeDescription\": \"Trigger a AWS Translate job. It should be followed by GetAwsTranslateJobStatus processor in order to monitor job status.\",\n+                        \"useCases\": [],\n+                        \"version\": \"2.0.0-M3\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"The task ID that can be used to poll for Job completion in GetAwsTranslateJobStatus\",\n+                                \"name\": \"awsTaskId\"\n+                            }\n+                        ]\n+                    },\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-jms-processors-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-aws-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -29359,525 +36741,527 @@\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\": \"ENVIRONMENT\",\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+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"multiProcessorUseCases\": [],\n                         \"primaryNodeOnly\": false,\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+                            \"AWS Credentials Provider service\": {\n+                                \"description\": \"The Controller Service that is used to obtain AWS credentials provider\",\n+                                \"displayName\": \"AWS Credentials Provider Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Acknowledgement Mode\",\n+                                \"name\": \"AWS Credentials Provider service\",\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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+                                    \"artifact\": \"nifi-aws-service-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.jms.cf.JMSConnectionFactoryProviderDefinition\",\n+                                    \"type\": \"org.apache.nifi.processors.aws.credentials.provider.service.AWSCredentialsProviderService\",\n                                     \"version\": \"2.0.0-M3\"\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+                            \"Bucket\": {\n+                                \"defaultValue\": \"${s3.bucket}\",\n+                                \"description\": \"The S3 Bucket to interact with\",\n+                                \"displayName\": \"Bucket\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Destination Name\",\n+                                \"name\": \"Bucket\",\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+                            \"Communications Timeout\": {\n+                                \"defaultValue\": \"30 secs\",\n+                                \"description\": \"The amount of time to wait in order to establish a connection to AWS or receive data from AWS before timing out.\",\n+                                \"displayName\": \"Communications Timeout\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Destination Type\",\n+                                \"name\": \"Communications Timeout\",\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://jakarta.ee/specifications/platform/9/apidocs/jakarta/jms/session#createDurableConsumer-jakarta.jms.Topic-java.lang.String-\",\n-                                \"displayName\": \"Durable Subscription\",\n+                            \"Endpoint Override URL\": {\n+                                \"description\": \"Endpoint URL to use instead of the AWS default including scheme, host, port, and path. The AWS libraries select an endpoint URL based on the AWS region, but this property overrides the selected endpoint URL, allowing use with other S3-compatible endpoints.\",\n+                                \"displayName\": \"Endpoint Override URL\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Durable subscription\",\n+                                \"name\": \"Endpoint Override URL\",\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+                            \"FullControl User List\": {\n+                                \"defaultValue\": \"${s3.permissions.full.users}\",\n+                                \"description\": \"A comma-separated list of Amazon User ID's or E-mail addresses that specifies who should have Full Control for an object\",\n+                                \"displayName\": \"FullControl User List\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Error Queue Name\",\n+                                \"name\": \"FullControl User List\",\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+                            \"Object Key\": {\n+                                \"defaultValue\": \"${filename}\",\n+                                \"description\": \"The S3 Object Key to use. This is analogous to a filename for traditional file systems.\",\n+                                \"displayName\": \"Object Key\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Message Selector\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Object Key\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Owner\": {\n+                                \"defaultValue\": \"${s3.owner}\",\n+                                \"description\": \"The Amazon ID to use for the object's owner\",\n+                                \"displayName\": \"Owner\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Owner\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Password\": {\n-                                \"description\": \"Password used for authentication and authorization.\",\n-                                \"displayName\": \"Password\",\n+                            \"Read ACL User List\": {\n+                                \"defaultValue\": \"${s3.permissions.readacl.users}\",\n+                                \"description\": \"A comma-separated list of Amazon User ID's or E-mail addresses that specifies who should have permissions to read the Access Control List for an object\",\n+                                \"displayName\": \"Read ACL User List\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Read ACL User List\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Read Permission User List\": {\n+                                \"defaultValue\": \"${s3.permissions.read.users}\",\n+                                \"description\": \"A comma-separated list of Amazon User ID's or E-mail addresses that specifies who should have Read Access for an object\",\n+                                \"displayName\": \"Read Permission User List\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Read Permission User List\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Region\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-gov-west-1\",\n+                                        \"displayName\": \"AWS GovCloud (US)\",\n+                                        \"value\": \"us-gov-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-gov-east-1\",\n+                                        \"displayName\": \"AWS GovCloud (US-East)\",\n+                                        \"value\": \"us-gov-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-east-1\",\n+                                        \"displayName\": \"US East (N. Virginia)\",\n+                                        \"value\": \"us-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-east-2\",\n+                                        \"displayName\": \"US East (Ohio)\",\n+                                        \"value\": \"us-east-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-west-1\",\n+                                        \"displayName\": \"US West (N. California)\",\n+                                        \"value\": \"us-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-west-2\",\n+                                        \"displayName\": \"US West (Oregon)\",\n+                                        \"value\": \"us-west-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-west-1\",\n+                                        \"displayName\": \"EU (Ireland)\",\n+                                        \"value\": \"eu-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-west-2\",\n+                                        \"displayName\": \"EU (London)\",\n+                                        \"value\": \"eu-west-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-west-3\",\n+                                        \"displayName\": \"EU (Paris)\",\n+                                        \"value\": \"eu-west-3\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-central-1\",\n+                                        \"displayName\": \"EU (Frankfurt)\",\n+                                        \"value\": \"eu-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-central-2\",\n+                                        \"displayName\": \"EU (Zurich)\",\n+                                        \"value\": \"eu-central-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-north-1\",\n+                                        \"displayName\": \"EU (Stockholm)\",\n+                                        \"value\": \"eu-north-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-south-1\",\n+                                        \"displayName\": \"EU (Milan)\",\n+                                        \"value\": \"eu-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-south-2\",\n+                                        \"displayName\": \"EU (Spain)\",\n+                                        \"value\": \"eu-south-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-east-1\",\n+                                        \"displayName\": \"Asia Pacific (Hong Kong)\",\n+                                        \"value\": \"ap-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-south-1\",\n+                                        \"displayName\": \"Asia Pacific (Mumbai)\",\n+                                        \"value\": \"ap-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-south-2\",\n+                                        \"displayName\": \"Asia Pacific (Hyderabad)\",\n+                                        \"value\": \"ap-south-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-southeast-1\",\n+                                        \"displayName\": \"Asia Pacific (Singapore)\",\n+                                        \"value\": \"ap-southeast-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-southeast-2\",\n+                                        \"displayName\": \"Asia Pacific (Sydney)\",\n+                                        \"value\": \"ap-southeast-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-southeast-3\",\n+                                        \"displayName\": \"Asia Pacific (Jakarta)\",\n+                                        \"value\": \"ap-southeast-3\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-southeast-4\",\n+                                        \"displayName\": \"Asia Pacific (Melbourne)\",\n+                                        \"value\": \"ap-southeast-4\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-northeast-1\",\n+                                        \"displayName\": \"Asia Pacific (Tokyo)\",\n+                                        \"value\": \"ap-northeast-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-northeast-2\",\n+                                        \"displayName\": \"Asia Pacific (Seoul)\",\n+                                        \"value\": \"ap-northeast-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-northeast-3\",\n+                                        \"displayName\": \"Asia Pacific (Osaka)\",\n+                                        \"value\": \"ap-northeast-3\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : sa-east-1\",\n+                                        \"displayName\": \"South America (Sao Paulo)\",\n+                                        \"value\": \"sa-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : cn-north-1\",\n+                                        \"displayName\": \"China (Beijing)\",\n+                                        \"value\": \"cn-north-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : cn-northwest-1\",\n+                                        \"displayName\": \"China (Ningxia)\",\n+                                        \"value\": \"cn-northwest-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ca-central-1\",\n+                                        \"displayName\": \"Canada (Central)\",\n+                                        \"value\": \"ca-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ca-west-1\",\n+                                        \"displayName\": \"Canada West (Calgary)\",\n+                                        \"value\": \"ca-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : me-central-1\",\n+                                        \"displayName\": \"Middle East (UAE)\",\n+                                        \"value\": \"me-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : me-south-1\",\n+                                        \"displayName\": \"Middle East (Bahrain)\",\n+                                        \"value\": \"me-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : af-south-1\",\n+                                        \"displayName\": \"Africa (Cape Town)\",\n+                                        \"value\": \"af-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-iso-east-1\",\n+                                        \"displayName\": \"US ISO East\",\n+                                        \"value\": \"us-iso-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-isob-east-1\",\n+                                        \"displayName\": \"US ISOB East (Ohio)\",\n+                                        \"value\": \"us-isob-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-iso-west-1\",\n+                                        \"displayName\": \"US ISO West\",\n+                                        \"value\": \"us-iso-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : il-central-1\",\n+                                        \"displayName\": \"Israel (Tel Aviv)\",\n+                                        \"value\": \"il-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Uses 's3.region' FlowFile attribute as region.\",\n+                                        \"displayName\": \"Use 's3.region' Attribute\",\n+                                        \"value\": \"attribute-defined-region\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"us-west-2\",\n+                                \"description\": \"The AWS Region to connect to.\",\n+                                \"displayName\": \"Region\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Password\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n+                                \"name\": \"Region\",\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+                                \"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\": \"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\": \"2.0.0-M3\"\n                                 }\n                             },\n-                            \"Shared subscription\": {\n+                            \"Signer Override\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"displayName\": \"Default Signature\",\n+                                        \"value\": \"Default Signature\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"displayName\": \"Signature Version 4\",\n+                                        \"value\": \"AWSS3V4SignerType\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Signature Version 2\",\n+                                        \"value\": \"S3SignerType\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Custom Signature\",\n+                                        \"value\": \"CustomSignerType\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"If destination is Topic if present then make it the consumer shared. @see https://jakarta.ee/specifications/platform/9/apidocs/jakarta/jms/session#createSharedConsumer-jakarta.jms.Topic-java.lang.String-\",\n-                                \"displayName\": \"Shared Subscription\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Timeout\",\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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+                                \"defaultValue\": \"Default Signature\",\n+                                \"description\": \"The AWS S3 library uses Signature Version 4 by default but this property allows you to specify the Version 2 signer to support older S3-compatible services or even to plug in your own custom signer implementation.\",\n+                                \"displayName\": \"Signer Override\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"cflib\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Signer Override\",\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+                            \"Version\": {\n+                                \"description\": \"The Version of the Object to delete\",\n+                                \"displayName\": \"Version\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables 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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"connection.factory.name\",\n+                                \"name\": \"Version\",\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+                            \"Write ACL User List\": {\n+                                \"defaultValue\": \"${s3.permissions.writeacl.users}\",\n+                                \"description\": \"A comma-separated list of Amazon User ID's or E-mail addresses that specifies who should have permissions to change the Access Control List for an object\",\n+                                \"displayName\": \"Write ACL User List\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"java.naming.factory.initial\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Write ACL User List\",\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+                            \"Write Permission User List\": {\n+                                \"defaultValue\": \"${s3.permissions.write.users}\",\n+                                \"description\": \"A comma-separated list of Amazon User ID's or E-mail addresses that specifies who should have Write Access for an object\",\n+                                \"displayName\": \"Write Permission User List\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"java.naming.provider.url\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Write Permission User List\",\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-                                \"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+                            \"custom-signer-class-name\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"CustomSignerType\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Signer Override\",\n+                                        \"propertyName\": \"Signer Override\"\n+                                    }\n+                                ],\n+                                \"description\": \"Fully qualified class name of the custom signer class. The signer must implement com.amazonaws.auth.Signer interface.\",\n+                                \"displayName\": \"Custom Signer Class Name\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"java.naming.security.principal\",\n-                                \"required\": false,\n+                                \"name\": \"custom-signer-class-name\",\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+                            \"custom-signer-module-location\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"CustomSignerType\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Signer Override\",\n+                                        \"propertyName\": \"Signer Override\"\n+                                    }\n+                                ],\n+                                \"description\": \"Comma-separated list of paths to files and/or directories which contain the custom signer's JAR file and its dependencies (if any).\",\n+                                \"displayName\": \"Custom Signer Module Location\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"naming.factory.libraries\",\n+                                \"name\": \"custom-signer-module-location\",\n                                 \"required\": false,\n                                 \"resourceDefinition\": {\n                                     \"cardinality\": \"MULTIPLE\",\n                                     \"resourceTypes\": [\n                                         \"FILE\",\n-                                        \"DIRECTORY\",\n-                                        \"URL\"\n+                                        \"DIRECTORY\"\n                                     ]\n                                 },\n                                 \"sensitive\": false\n                             },\n-                            \"output-strategy\": {\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-                                    },\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-                                    }\n-                                ],\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\": \"output-strategy\",\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+                            \"proxy-configuration-service\": {\n+                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests.\",\n+                                \"displayName\": \"Proxy Configuration Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"record-reader\",\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-                                    \"version\": \"2.0.0-M3\"\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 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\": 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.proxy.ProxyConfigurationService\",\n                                     \"version\": \"2.0.0-M3\"\n                                 }\n                             }\n                         },\n-                        \"restricted\": true,\n                         \"seeAlso\": [\n-                            \"org.apache.nifi.jms.cf.JMSConnectionFactoryProvider\",\n-                            \"org.apache.nifi.jms.processors.PublishJMS\"\n+                            \"org.apache.nifi.processors.aws.s3.FetchS3Object\",\n+                            \"org.apache.nifi.processors.aws.s3.ListS3\",\n+                            \"org.apache.nifi.processors.aws.s3.PutS3Object\"\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 are routed to this Relationship after they have been successfully processed.\",\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+                                \"description\": \"If the Processor is unable to process a given FlowFile, it 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+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"consume\",\n-                            \"get\",\n-                            \"jms\",\n-                            \"message\",\n-                            \"receive\"\n+                            \"AWS\",\n+                            \"Amazon\",\n+                            \"Archive\",\n+                            \"Delete\",\n+                            \"S3\"\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.aws.s3.DeleteS3Object\",\n+                        \"typeDescription\": \"Deletes a file from an Amazon S3 Bucket. If attempting to delete a file that does not exist, FlowFile is routed to success.\",\n                         \"useCases\": [],\n                         \"version\": \"2.0.0-M3\",\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+                                \"description\": \"The class name of the exception thrown during processor execution\",\n+                                \"name\": \"s3.exception\"\n                             },\n                             {\n-                                \"description\": \"The JMSReplyTo from the message header.\",\n-                                \"name\": \"jms_replyTo\"\n+                                \"description\": \"The S3 supplied detail from the failed operation\",\n+                                \"name\": \"s3.additionalDetails\"\n                             },\n                             {\n-                                \"description\": \"The JMSDestination from the message header.\",\n-                                \"name\": \"jms_destination\"\n+                                \"description\": \"The HTTP error code (if available) from the failed operation\",\n+                                \"name\": \"s3.statusCode\"\n                             },\n                             {\n-                                \"description\": \"The JMS message type, can be TextMessage, BytesMessage, ObjectMessage, MapMessage or StreamMessage).\",\n-                                \"name\": \"jms.messagetype\"\n+                                \"description\": \"The S3 moniker of the failed operation\",\n+                                \"name\": \"s3.errorCode\"\n                             },\n                             {\n-                                \"description\": \"Each message property is written to an attribute.\",\n-                                \"name\": \"other attributes\"\n+                                \"description\": \"The S3 exception message from the failed operation\",\n+                                \"name\": \"s3.errorMessage\"\n                             }\n                         ]\n                     },\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-jms-processors-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-aws-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -29885,2280 +37269,2328 @@\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+                        \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"multiProcessorUseCases\": [\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\": \"ENVIRONMENT\",\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+                                \"configurations\": [\n+                                    {\n+                                        \"configuration\": \"The \\\"Bucket\\\" property should be set to the name of the S3 bucket that files reside in. If the flow being built is to be reused elsewhere, it's a good idea to parameterize     this property by setting it to something like `#{S3_SOURCE_BUCKET}`.\\nThe \\\"Region\\\" property must be set to denote the S3 region that the Bucket resides in. If the flow being built is to be reused elsewhere, it's a good idea to parameterize     this property by setting it to something like `#{S3_SOURCE_REGION}`.\\n\\nThe \\\"AWS Credentials Provider service\\\" property should specify an instance of the AWSCredentialsProviderControllerService in order to provide credentials for accessing the bucket.\\n\\nThe 'success' Relationship of this Processor is then connected to FetchS3Object.\\n\",\n+                                        \"processorClassName\": \"org.apache.nifi.processors.aws.s3.ListS3\"\n+                                    },\n+                                    {\n+                                        \"configuration\": \"\\\"Bucket\\\" = \\\"${s3.bucket}\\\"\\n\\\"Object Key\\\" = \\\"${filename}\\\"\\n\\nThe \\\"AWS Credentials Provider service\\\" property should specify an instance of the AWSCredentialsProviderControllerService in order to provide credentials for accessing the bucket.\\n\\nThe \\\"Region\\\" property must be set to the same value as the \\\"Region\\\" property of the ListS3 Processor.\\n\",\n+                                        \"processorClassName\": \"org.apache.nifi.processors.aws.s3.FetchS3Object\"\n+                                    }\n+                                ],\n+                                \"description\": \"Retrieve all files in an S3 bucket\",\n+                                \"keywords\": [\n+                                    \"s3\",\n+                                    \"state\",\n+                                    \"retrieve\",\n+                                    \"fetch\",\n+                                    \"all\",\n+                                    \"stream\"\n+                                ],\n+                                \"notes\": \"\"\n+                            },\n                             {\n-                                \"explanation\": \"Client Library Location can reference resources over HTTP\",\n-                                \"requiredPermission\": \"reference remote resources\"\n+                                \"configurations\": [\n+                                    {\n+                                        \"configuration\": \"The \\\"Bucket\\\" property should be set to the name of the S3 bucket that files reside in. If the flow being built is to be reused elsewhere, it's a good idea to parameterize     this property by setting it to something like `#{S3_SOURCE_BUCKET}`.\\nThe \\\"Region\\\" property must be set to denote the S3 region that the Bucket resides in. If the flow being built is to be reused elsewhere, it's a good idea to parameterize     this property by setting it to something like `#{S3_SOURCE_REGION}`.\\n\\nThe \\\"AWS Credentials Provider service\\\" property should specify an instance of the AWSCredentialsProviderControllerService in order to provide credentials for accessing the bucket.\\n\\nThe 'success' Relationship of this Processor is then connected to RouteOnAttribute.\\n\",\n+                                        \"processorClassName\": \"org.apache.nifi.processors.aws.s3.ListS3\"\n+                                    },\n+                                    {\n+                                        \"configuration\": \"If you would like to \\\"OR\\\" together all of the conditions (i.e., the file should be retrieved if any of the conditions are met), set \\\"Routing Strategy\\\" to \\\"Route to 'matched' if any matches\\\".\\nIf you would like to \\\"AND\\\" together all of the conditions (i.e., the file should only be retrieved if all of the conditions are met), set \\\"Routing Strategy\\\" to \\\"Route to 'matched' if all match\\\".\\n\\nFor each condition that you would like to filter on, add a new property. The name of the property should describe the condition. The value of the property should be an Expression Language expression that returns `true` if the file meets the condition or `false` if the file does not meet the condition.\\n\\nSome attributes that you may consider filtering on are:\\n- `filename` (the name of the file)\\n- `s3.length` (the number of bytes in the file)\\n- `s3.tag.<tag name>` (the value of the s3 tag with the name `tag name`)\\n- `s3.user.metadata.<key name>` (the value of the user metadata with the key named `key name`)\\n\\nFor example, to fetch only files that are at least 1 MB and have a filename ending in `.zip` we would set the following properties:\\n- \\\"Routing Strategy\\\" = \\\"Route to 'matched' if all match\\\"\\n- \\\"At least 1 MB\\\" = \\\"${s3.length:ge(1000000)}\\\"\\n- \\\"Ends in .zip\\\" = \\\"${filename:endsWith('.zip')}\\\"\\n\\nAuto-terminate the `unmatched` Relationship.\\nConnect the `matched` Relationship to the FetchS3Object processor.\\n\",\n+                                        \"processorClassName\": \"org.apache.nifi.processors.standard.RouteOnAttribute\"\n+                                    },\n+                                    {\n+                                        \"configuration\": \"\\\"Bucket\\\" = \\\"${s3.bucket}\\\"\\n\\\"Object Key\\\" = \\\"${filename}\\\"\\n\\nThe \\\"AWS Credentials Provider service\\\" property should specify an instance of the AWSCredentialsProviderControllerService in order to provide credentials for accessing the bucket.\\n\\nThe \\\"Region\\\" property must be set to the same value as the \\\"Region\\\" property of the ListS3 Processor.\\n\",\n+                                        \"processorClassName\": \"org.apache.nifi.processors.aws.s3.FetchS3Object\"\n+                                    }\n+                                ],\n+                                \"description\": \"Retrieve only files from S3 that meet some specified criteria\",\n+                                \"keywords\": [\n+                                    \"s3\",\n+                                    \"state\",\n+                                    \"retrieve\",\n+                                    \"filter\",\n+                                    \"select\",\n+                                    \"fetch\",\n+                                    \"criteria\"\n+                                ],\n+                                \"notes\": \"\"\n+                            },\n+                            {\n+                                \"configurations\": [\n+                                    {\n+                                        \"configuration\": \"The \\\"Queue URL\\\" must be set to the appropriate URL for the SQS queue. It is recommended that this property be parameterized, using a value such as `#{SQS_QUEUE_URL}`.\\nThe \\\"Region\\\" property must be set to denote the SQS region that the queue resides in. It's a good idea to parameterize this property by setting it to something like `#{SQS_REGION}`.\\n\\nThe \\\"AWS Credentials Provider service\\\" property should specify an instance of the AWSCredentialsProviderControllerService in order to provide credentials for accessing the bucket.\\n\\nThe 'success' relationship is connected to EvaluateJsonPath.\\n\",\n+                                        \"processorClassName\": \"org.apache.nifi.processors.aws.sqs.GetSQS\"\n+                                    },\n+                                    {\n+                                        \"configuration\": \"\\\"Destination\\\" = \\\"flowfile-attribute\\\"\\n\\\"s3.bucket\\\" = \\\"$.Records[0].s3.bucket.name\\\"\\n\\\"filename\\\" = \\\"$.Records[0].s3.object.key\\\"\\n\\nThe 'success' relationship is connected to FetchS3Object.\\n\",\n+                                        \"processorClassName\": \"org.apache.nifi.processors.standard.EvaluateJsonPath\"\n+                                    },\n+                                    {\n+                                        \"configuration\": \"\\\"Bucket\\\" = \\\"${s3.bucket}\\\"\\n\\\"Object Key\\\" = \\\"${filename}\\\"\\n\\nThe \\\"Region\\\" property must be set to the same value as the \\\"Region\\\" property of the GetSQS Processor.\\nThe \\\"AWS Credentials Provider service\\\" property should specify an instance of the AWSCredentialsProviderControllerService in order to provide credentials for accessing the bucket.\\n\",\n+                                        \"processorClassName\": \"org.apache.nifi.processors.aws.s3.FetchS3Object\"\n+                                    }\n+                                ],\n+                                \"description\": \"Retrieve new files as they arrive in an S3 bucket\",\n+                                \"keywords\": [],\n+                                \"notes\": \"This method of retrieving files from S3 is more efficient than using ListS3 and more cost effective. It is the pattern recommended by AWS. However, it does require that the S3 bucket be configured to place notifications on an SQS queue when new files arrive. For more information, see https://docs.aws.amazon.com/AmazonS3/latest/userguide/ways-to-add-notification-config-to-bucket.html\"\n                             }\n                         ],\n-                        \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n-                        \"multiProcessorUseCases\": [],\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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+                            \"AWS Credentials Provider service\": {\n+                                \"description\": \"The Controller Service that is used to obtain AWS credentials provider\",\n+                                \"displayName\": \"AWS Credentials Provider Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Connection Factory Service\",\n-                                \"required\": false,\n+                                \"name\": \"AWS Credentials Provider service\",\n+                                \"required\": true,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-jms-cf-service-nar\",\n+                                    \"artifact\": \"nifi-aws-service-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.jms.cf.JMSConnectionFactoryProviderDefinition\",\n+                                    \"type\": \"org.apache.nifi.processors.aws.credentials.provider.service.AWSCredentialsProviderService\",\n                                     \"version\": \"2.0.0-M3\"\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+                            \"Bucket\": {\n+                                \"defaultValue\": \"${s3.bucket}\",\n+                                \"description\": \"The S3 Bucket to interact with\",\n+                                \"displayName\": \"Bucket\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Destination Name\",\n+                                \"name\": \"Bucket\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Destination Type\": {\n+                            \"Communications Timeout\": {\n+                                \"defaultValue\": \"30 secs\",\n+                                \"description\": \"The amount of time to wait in order to establish a connection to AWS or receive data from AWS before timing out.\",\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+                            \"Endpoint Override URL\": {\n+                                \"description\": \"Endpoint URL to use instead of the AWS default including scheme, host, port, and path. The AWS libraries select an endpoint URL based on the AWS region, but this property overrides the selected endpoint URL, allowing use with other S3-compatible endpoints.\",\n+                                \"displayName\": \"Endpoint Override URL\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Endpoint Override URL\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Object Key\": {\n+                                \"defaultValue\": \"${filename}\",\n+                                \"description\": \"The S3 Object Key to use. This is analogous to a filename for traditional file systems.\",\n+                                \"displayName\": \"Object Key\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Object Key\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Region\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"QUEUE\",\n-                                        \"value\": \"QUEUE\"\n+                                        \"description\": \"AWS Region Code : us-gov-west-1\",\n+                                        \"displayName\": \"AWS GovCloud (US)\",\n+                                        \"value\": \"us-gov-west-1\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"TOPIC\",\n-                                        \"value\": \"TOPIC\"\n+                                        \"description\": \"AWS Region Code : us-gov-east-1\",\n+                                        \"displayName\": \"AWS GovCloud (US-East)\",\n+                                        \"value\": \"us-gov-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-east-1\",\n+                                        \"displayName\": \"US East (N. Virginia)\",\n+                                        \"value\": \"us-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-east-2\",\n+                                        \"displayName\": \"US East (Ohio)\",\n+                                        \"value\": \"us-east-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-west-1\",\n+                                        \"displayName\": \"US West (N. California)\",\n+                                        \"value\": \"us-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-west-2\",\n+                                        \"displayName\": \"US West (Oregon)\",\n+                                        \"value\": \"us-west-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-west-1\",\n+                                        \"displayName\": \"EU (Ireland)\",\n+                                        \"value\": \"eu-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-west-2\",\n+                                        \"displayName\": \"EU (London)\",\n+                                        \"value\": \"eu-west-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-west-3\",\n+                                        \"displayName\": \"EU (Paris)\",\n+                                        \"value\": \"eu-west-3\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-central-1\",\n+                                        \"displayName\": \"EU (Frankfurt)\",\n+                                        \"value\": \"eu-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-central-2\",\n+                                        \"displayName\": \"EU (Zurich)\",\n+                                        \"value\": \"eu-central-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-north-1\",\n+                                        \"displayName\": \"EU (Stockholm)\",\n+                                        \"value\": \"eu-north-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-south-1\",\n+                                        \"displayName\": \"EU (Milan)\",\n+                                        \"value\": \"eu-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-south-2\",\n+                                        \"displayName\": \"EU (Spain)\",\n+                                        \"value\": \"eu-south-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-east-1\",\n+                                        \"displayName\": \"Asia Pacific (Hong Kong)\",\n+                                        \"value\": \"ap-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-south-1\",\n+                                        \"displayName\": \"Asia Pacific (Mumbai)\",\n+                                        \"value\": \"ap-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-south-2\",\n+                                        \"displayName\": \"Asia Pacific (Hyderabad)\",\n+                                        \"value\": \"ap-south-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-southeast-1\",\n+                                        \"displayName\": \"Asia Pacific (Singapore)\",\n+                                        \"value\": \"ap-southeast-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-southeast-2\",\n+                                        \"displayName\": \"Asia Pacific (Sydney)\",\n+                                        \"value\": \"ap-southeast-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-southeast-3\",\n+                                        \"displayName\": \"Asia Pacific (Jakarta)\",\n+                                        \"value\": \"ap-southeast-3\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-southeast-4\",\n+                                        \"displayName\": \"Asia Pacific (Melbourne)\",\n+                                        \"value\": \"ap-southeast-4\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-northeast-1\",\n+                                        \"displayName\": \"Asia Pacific (Tokyo)\",\n+                                        \"value\": \"ap-northeast-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-northeast-2\",\n+                                        \"displayName\": \"Asia Pacific (Seoul)\",\n+                                        \"value\": \"ap-northeast-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-northeast-3\",\n+                                        \"displayName\": \"Asia Pacific (Osaka)\",\n+                                        \"value\": \"ap-northeast-3\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : sa-east-1\",\n+                                        \"displayName\": \"South America (Sao Paulo)\",\n+                                        \"value\": \"sa-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : cn-north-1\",\n+                                        \"displayName\": \"China (Beijing)\",\n+                                        \"value\": \"cn-north-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : cn-northwest-1\",\n+                                        \"displayName\": \"China (Ningxia)\",\n+                                        \"value\": \"cn-northwest-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ca-central-1\",\n+                                        \"displayName\": \"Canada (Central)\",\n+                                        \"value\": \"ca-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ca-west-1\",\n+                                        \"displayName\": \"Canada West (Calgary)\",\n+                                        \"value\": \"ca-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : me-central-1\",\n+                                        \"displayName\": \"Middle East (UAE)\",\n+                                        \"value\": \"me-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : me-south-1\",\n+                                        \"displayName\": \"Middle East (Bahrain)\",\n+                                        \"value\": \"me-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : af-south-1\",\n+                                        \"displayName\": \"Africa (Cape Town)\",\n+                                        \"value\": \"af-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-iso-east-1\",\n+                                        \"displayName\": \"US ISO East\",\n+                                        \"value\": \"us-iso-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-isob-east-1\",\n+                                        \"displayName\": \"US ISOB East (Ohio)\",\n+                                        \"value\": \"us-isob-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-iso-west-1\",\n+                                        \"displayName\": \"US ISO West\",\n+                                        \"value\": \"us-iso-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : il-central-1\",\n+                                        \"displayName\": \"Israel (Tel Aviv)\",\n+                                        \"value\": \"il-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Uses 's3.region' FlowFile attribute as region.\",\n+                                        \"displayName\": \"Use 's3.region' Attribute\",\n+                                        \"value\": \"attribute-defined-region\"\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+                                \"defaultValue\": \"us-west-2\",\n+                                \"description\": \"The AWS Region to connect to.\",\n+                                \"displayName\": \"Region\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Destination Type\",\n+                                \"name\": \"Region\",\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                             \"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+                                \"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\": \"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\": \"2.0.0-M3\"\n                                 }\n                             },\n-                            \"User Name\": {\n-                                \"description\": \"User Name used for authentication and authorization.\",\n-                                \"displayName\": \"User Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"User Name\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"allow-illegal-chars-in-jms-header-names\": {\n+                            \"Signer Override\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"displayName\": \"Default Signature\",\n+                                        \"value\": \"Default Signature\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"displayName\": \"Signature Version 4\",\n+                                        \"value\": \"AWSS3V4SignerType\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Signature Version 2\",\n+                                        \"value\": \"S3SignerType\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Custom Signature\",\n+                                        \"value\": \"CustomSignerType\"\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"allow-illegal-chars-in-jms-header-names\",\n-                                \"required\": true,\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+                                \"defaultValue\": \"Default Signature\",\n+                                \"description\": \"The AWS S3 library uses Signature Version 4 by default but this property allows you to specify the Version 2 signer to support older S3-compatible services or even to plug in your own custom signer implementation.\",\n+                                \"displayName\": \"Signer Override\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"attributes-to-send-as-jms-headers-regex\",\n-                                \"required\": true,\n+                                \"name\": \"Signer Override\",\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+                            \"Version\": {\n+                                \"description\": \"The Version of the Object to download\",\n+                                \"displayName\": \"Version\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"broker\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Version\",\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+                            \"custom-signer-class-name\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"CustomSignerType\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Signer Override\",\n+                                        \"propertyName\": \"Signer Override\"\n+                                    }\n+                                ],\n+                                \"description\": \"Fully qualified class name of the custom signer class. The signer must implement com.amazonaws.auth.Signer interface.\",\n+                                \"displayName\": \"Custom Signer Class Name\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"cf\",\n-                                \"required\": false,\n+                                \"name\": \"custom-signer-class-name\",\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+                            \"custom-signer-module-location\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"CustomSignerType\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Signer Override\",\n+                                        \"propertyName\": \"Signer Override\"\n+                                    }\n+                                ],\n+                                \"description\": \"Comma-separated list of paths to files and/or directories which contain the custom signer's JAR file and its dependencies (if any).\",\n+                                \"displayName\": \"Custom Signer Module Location\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"cflib\",\n+                                \"name\": \"custom-signer-module-location\",\n                                 \"required\": false,\n                                 \"resourceDefinition\": {\n                                     \"cardinality\": \"MULTIPLE\",\n                                     \"resourceTypes\": [\n                                         \"FILE\",\n-                                        \"DIRECTORY\",\n-                                        \"URL\"\n+                                        \"DIRECTORY\"\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\": \"Environment variables 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+                            \"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                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"connection.factory.name\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"encryption-service\",\n                                 \"required\": false,\n-                                \"sensitive\": false\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-aws-service-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.processors.aws.s3.AmazonS3EncryptionService\",\n+                                    \"version\": \"2.0.0-M3\"\n+                                }\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+                            \"proxy-configuration-service\": {\n+                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests.\",\n+                                \"displayName\": \"Proxy Configuration Service\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"java.naming.factory.initial\",\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\": \"2.0.0-M3\"\n+                                }\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+                            \"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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"java.naming.provider.url\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"range-length\",\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-                                \"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+                            \"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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"java.naming.security.principal\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"range-start\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"message-body-type\": {\n+                            \"requester-pays\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"bytes\",\n-                                        \"value\": \"bytes\"\n+                                        \"description\": \"Indicates that the requester consents to pay any charges associated with retrieving objects from the S3 bucket.\",\n+                                        \"displayName\": \"True\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"text\",\n-                                        \"value\": \"text\"\n+                                        \"description\": \"Does not consent to pay requester charges for retrieving objects from the S3 bucket.\",\n+                                        \"displayName\": \"False\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"bytes\",\n-                                \"description\": \"The type of JMS message body to construct.\",\n-                                \"displayName\": \"Message Body Type\",\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"If true, indicates that the requester consents to pay any charges associated with retrieving objects from the S3 bucket.  This sets the 'x-amz-request-payer' header to 'requester'.\",\n+                                \"displayName\": \"Requester Pays\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"message-body-type\",\n+                                \"name\": \"requester-pays\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n+                            }\n+                        },\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.aws.s3.DeleteS3Object\",\n+                            \"org.apache.nifi.processors.aws.s3.ListS3\",\n+                            \"org.apache.nifi.processors.aws.s3.PutS3Object\"\n+                        ],\n+                        \"sideEffectFree\": false,\n+                        \"supportedRelationships\": [\n+                            {\n+                                \"description\": \"FlowFiles are routed to this Relationship after they have been successfully processed.\",\n+                                \"name\": \"success\"\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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+                                \"description\": \"If the Processor is unable to process a given FlowFile, it 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+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"AWS\",\n+                            \"Amazon\",\n+                            \"Fetch\",\n+                            \"Get\",\n+                            \"S3\"\n+                        ],\n+                        \"triggerSerially\": false,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.aws.s3.FetchS3Object\",\n+                        \"typeDescription\": \"Retrieves the contents of an S3 Object and writes it to the content of a FlowFile\",\n+                        \"useCases\": [\n+                            {\n+                                \"configuration\": \"The \\\"Bucket\\\" property should be set to the name of the S3 bucket that contains the file. Typically this is defined as an attribute on an incoming FlowFile, so this property is set to `${s3.bucket}`.\\nThe \\\"Object Key\\\" property denotes the fully qualified filename of the file to fetch. Typically, the FlowFile's `filename` attribute is used, so this property is set to `${filename}`.\\nThe \\\"Region\\\" property must be set to denote the S3 region that the Bucket resides in. If the flow being built is to be reused elsewhere, it's a good idea to parameterize this property by setting it to something like `#{S3_REGION}`.\\n\\nThe \\\"AWS Credentials Provider service\\\" property should specify an instance of the AWSCredentialsProviderControllerService in order to provide credentials for accessing the file.\\n\",\n+                                \"description\": \"Fetch a specific file from S3\",\n+                                \"keywords\": [],\n+                                \"notes\": \"\"\n+                            }\n+                        ],\n+                        \"version\": \"2.0.0-M3\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"The URL that can be used to access the S3 object\",\n+                                \"name\": \"s3.url\"\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\": \"2.0.0-M3\"\n-                                }\n+                            {\n+                                \"description\": \"The name of the S3 bucket\",\n+                                \"name\": \"s3.bucket\"\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-                                \"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\": \"2.0.0-M3\"\n-                                }\n-                            }\n-                        },\n-                        \"readsAttributes\": [\n                             {\n-                                \"description\": \"This attribute becomes the JMSDeliveryMode message header. Must be an integer.\",\n-                                \"name\": \"jms_deliveryMode\"\n+                                \"description\": \"The path of the file\",\n+                                \"name\": \"path\"\n                             },\n                             {\n-                                \"description\": \"This attribute becomes the JMSExpiration message header. Must be a long.\",\n-                                \"name\": \"jms_expiration\"\n+                                \"description\": \"The path of the file\",\n+                                \"name\": \"absolute.path\"\n                             },\n                             {\n-                                \"description\": \"This attribute becomes the JMSPriority message header. Must be an integer.\",\n-                                \"name\": \"jms_priority\"\n+                                \"description\": \"The name of the file\",\n+                                \"name\": \"filename\"\n                             },\n                             {\n-                                \"description\": \"This attribute becomes the JMSRedelivered message header.\",\n-                                \"name\": \"jms_redelivered\"\n+                                \"description\": \"The MD5 sum of the file\",\n+                                \"name\": \"hash.value\"\n                             },\n                             {\n-                                \"description\": \"This attribute becomes the JMSTimestamp message header. Must be a long.\",\n-                                \"name\": \"jms_timestamp\"\n+                                \"description\": \"MD5\",\n+                                \"name\": \"hash.algorithm\"\n                             },\n                             {\n-                                \"description\": \"This attribute becomes the JMSCorrelationID message header.\",\n-                                \"name\": \"jms_correlationId\"\n+                                \"description\": \"If S3 provides the content type/MIME type, this attribute will hold that file\",\n+                                \"name\": \"mime.type\"\n                             },\n                             {\n-                                \"description\": \"This attribute becomes the JMSType message header. Must be an integer.\",\n-                                \"name\": \"jms_type\"\n+                                \"description\": \"The ETag that can be used to see if the file has changed\",\n+                                \"name\": \"s3.etag\"\n                             },\n                             {\n-                                \"description\": \"This attribute becomes the JMSReplyTo message header. Must be an integer.\",\n-                                \"name\": \"jms_replyTo\"\n+                                \"description\": \"The class name of the exception thrown during processor execution\",\n+                                \"name\": \"s3.exception\"\n                             },\n                             {\n-                                \"description\": \"This attribute becomes the JMSDestination message header. Must be an integer.\",\n-                                \"name\": \"jms_destination\"\n+                                \"description\": \"The S3 supplied detail from the failed operation\",\n+                                \"name\": \"s3.additionalDetails\"\n                             },\n                             {\n-                                \"description\": \"All other attributes that do not start with jms_ are added as message properties.\",\n-                                \"name\": \"other attributes\"\n+                                \"description\": \"The HTTP error code (if available) from the failed operation\",\n+                                \"name\": \"s3.statusCode\"\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+                                \"description\": \"The S3 moniker of the failed operation\",\n+                                \"name\": \"s3.errorCode\"\n+                            },\n                             {\n-                                \"description\": \"All FlowFiles that are sent to the JMS destination are routed to this relationship\",\n-                                \"name\": \"success\"\n+                                \"description\": \"The S3 exception message from the failed operation\",\n+                                \"name\": \"s3.errorMessage\"\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\": true,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"systemResourceConsiderations\": [\n+                                \"description\": \"If the file has an expiration date, this attribute will be set, containing the milliseconds since epoch in UTC time\",\n+                                \"name\": \"s3.expirationTime\"\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+                                \"description\": \"The ID of the rule that dictates this object's expiration time\",\n+                                \"name\": \"s3.expirationTimeRuleId\"\n+                            },\n+                            {\n+                                \"description\": \"The server side encryption algorithm of the object\",\n+                                \"name\": \"s3.sseAlgorithm\"\n+                            },\n+                            {\n+                                \"description\": \"The version of the S3 object\",\n+                                \"name\": \"s3.version\"\n+                            },\n+                            {\n+                                \"description\": \"The name of the encryption strategy that was used to store the S3 object (if it is encrypted)\",\n+                                \"name\": \"s3.encryptionStrategy\"\n                             }\n-                        ],\n-                        \"tags\": [\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.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-                        \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\"\n-                    }\n-                ],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"2.0.0-M3\"\n-        },\n-        {\n-            \"artifact\": \"nifi-redis-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [\n+                        ]\n+                    },\n                     {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-redis-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-aws-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\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+                        \"multiProcessorUseCases\": [],\n+                        \"primaryNodeOnly\": true,\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+                            \"AWS Credentials Provider service\": {\n+                                \"description\": \"The Controller Service that is used to obtain AWS credentials provider\",\n+                                \"displayName\": \"AWS Credentials Provider Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Cluster Max Redirects\",\n+                                \"name\": \"AWS Credentials Provider service\",\n                                 \"required\": true,\n-                                \"sensitive\": false\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-aws-service-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.processors.aws.credentials.provider.service.AWSCredentialsProviderService\",\n+                                    \"version\": \"2.0.0-M3\"\n+                                }\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+                            \"Bucket\": {\n+                                \"description\": \"The S3 Bucket to interact with\",\n+                                \"displayName\": \"Bucket\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Communication Timeout\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Bucket\",\n                                 \"required\": true,\n                                 \"sensitive\": false\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+                            \"Communications Timeout\": {\n+                                \"defaultValue\": \"30 secs\",\n+                                \"description\": \"The amount of time to wait in order to establish a connection to AWS or receive data from AWS before timing out.\",\n+                                \"displayName\": \"Communications Timeout\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Connection String\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Communications Timeout\",\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+                            \"Endpoint Override URL\": {\n+                                \"description\": \"Endpoint URL to use instead of the AWS default including scheme, host, port, and path. The AWS libraries select an endpoint URL based on the AWS region, but this property overrides the selected endpoint URL, allowing use with other S3-compatible endpoints.\",\n+                                \"displayName\": \"Endpoint Override URL\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Database Index\",\n-                                \"required\": true,\n+                                \"name\": \"Endpoint Override URL\",\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+                            \"Listing Batch Size\": {\n+                                \"defaultValue\": \"100\",\n+                                \"description\": \"If not using a Record Writer, this property dictates how many S3 objects should be listed in a single batch. Once this number is reached, the FlowFiles that have been created will be transferred out of the Processor. Setting this value lower may result in lower latency by sending out the FlowFiles before the complete listing has finished. However, it can significantly reduce performance. Larger values may take more memory to store all of the information before sending the FlowFiles out. This property is ignored if using a Record Writer, as one of the main benefits of the Record Writer is being able to emit the entire listing as a single FlowFile.\",\n+                                \"displayName\": \"Listing Batch Size\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Password\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Listing Batch Size\",\n                                 \"required\": false,\n-                                \"sensitive\": true\n+                                \"sensitive\": false\n                             },\n-                            \"Pool - Block When Exhausted\": {\n+                            \"Region\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"description\": \"AWS Region Code : us-gov-west-1\",\n+                                        \"displayName\": \"AWS GovCloud (US)\",\n+                                        \"value\": \"us-gov-west-1\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"description\": \"AWS Region Code : us-gov-east-1\",\n+                                        \"displayName\": \"AWS GovCloud (US-East)\",\n+                                        \"value\": \"us-gov-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-east-1\",\n+                                        \"displayName\": \"US East (N. Virginia)\",\n+                                        \"value\": \"us-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-east-2\",\n+                                        \"displayName\": \"US East (Ohio)\",\n+                                        \"value\": \"us-east-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-west-1\",\n+                                        \"displayName\": \"US West (N. California)\",\n+                                        \"value\": \"us-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-west-2\",\n+                                        \"displayName\": \"US West (Oregon)\",\n+                                        \"value\": \"us-west-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-west-1\",\n+                                        \"displayName\": \"EU (Ireland)\",\n+                                        \"value\": \"eu-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-west-2\",\n+                                        \"displayName\": \"EU (London)\",\n+                                        \"value\": \"eu-west-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-west-3\",\n+                                        \"displayName\": \"EU (Paris)\",\n+                                        \"value\": \"eu-west-3\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-central-1\",\n+                                        \"displayName\": \"EU (Frankfurt)\",\n+                                        \"value\": \"eu-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-central-2\",\n+                                        \"displayName\": \"EU (Zurich)\",\n+                                        \"value\": \"eu-central-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-north-1\",\n+                                        \"displayName\": \"EU (Stockholm)\",\n+                                        \"value\": \"eu-north-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-south-1\",\n+                                        \"displayName\": \"EU (Milan)\",\n+                                        \"value\": \"eu-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-south-2\",\n+                                        \"displayName\": \"EU (Spain)\",\n+                                        \"value\": \"eu-south-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-east-1\",\n+                                        \"displayName\": \"Asia Pacific (Hong Kong)\",\n+                                        \"value\": \"ap-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-south-1\",\n+                                        \"displayName\": \"Asia Pacific (Mumbai)\",\n+                                        \"value\": \"ap-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-south-2\",\n+                                        \"displayName\": \"Asia Pacific (Hyderabad)\",\n+                                        \"value\": \"ap-south-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-southeast-1\",\n+                                        \"displayName\": \"Asia Pacific (Singapore)\",\n+                                        \"value\": \"ap-southeast-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-southeast-2\",\n+                                        \"displayName\": \"Asia Pacific (Sydney)\",\n+                                        \"value\": \"ap-southeast-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-southeast-3\",\n+                                        \"displayName\": \"Asia Pacific (Jakarta)\",\n+                                        \"value\": \"ap-southeast-3\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-southeast-4\",\n+                                        \"displayName\": \"Asia Pacific (Melbourne)\",\n+                                        \"value\": \"ap-southeast-4\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-northeast-1\",\n+                                        \"displayName\": \"Asia Pacific (Tokyo)\",\n+                                        \"value\": \"ap-northeast-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-northeast-2\",\n+                                        \"displayName\": \"Asia Pacific (Seoul)\",\n+                                        \"value\": \"ap-northeast-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-northeast-3\",\n+                                        \"displayName\": \"Asia Pacific (Osaka)\",\n+                                        \"value\": \"ap-northeast-3\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : sa-east-1\",\n+                                        \"displayName\": \"South America (Sao Paulo)\",\n+                                        \"value\": \"sa-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : cn-north-1\",\n+                                        \"displayName\": \"China (Beijing)\",\n+                                        \"value\": \"cn-north-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : cn-northwest-1\",\n+                                        \"displayName\": \"China (Ningxia)\",\n+                                        \"value\": \"cn-northwest-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ca-central-1\",\n+                                        \"displayName\": \"Canada (Central)\",\n+                                        \"value\": \"ca-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ca-west-1\",\n+                                        \"displayName\": \"Canada West (Calgary)\",\n+                                        \"value\": \"ca-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : me-central-1\",\n+                                        \"displayName\": \"Middle East (UAE)\",\n+                                        \"value\": \"me-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : me-south-1\",\n+                                        \"displayName\": \"Middle East (Bahrain)\",\n+                                        \"value\": \"me-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : af-south-1\",\n+                                        \"displayName\": \"Africa (Cape Town)\",\n+                                        \"value\": \"af-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-iso-east-1\",\n+                                        \"displayName\": \"US ISO East\",\n+                                        \"value\": \"us-iso-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-isob-east-1\",\n+                                        \"displayName\": \"US ISOB East (Ohio)\",\n+                                        \"value\": \"us-isob-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-iso-west-1\",\n+                                        \"displayName\": \"US ISO West\",\n+                                        \"value\": \"us-iso-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : il-central-1\",\n+                                        \"displayName\": \"Israel (Tel Aviv)\",\n+                                        \"value\": \"il-central-1\"\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+                                \"defaultValue\": \"us-west-2\",\n+                                \"description\": \"The AWS Region to connect to.\",\n+                                \"displayName\": \"Region\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Pool - Max Idle\",\n+                                \"name\": \"Region\",\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+                            \"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\": \"Pool - Max Total\",\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\": \"2.0.0-M3\"\n+                                }\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+                            \"Signer Override\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Default Signature\",\n+                                        \"value\": \"Default Signature\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Signature Version 4\",\n+                                        \"value\": \"AWSS3V4SignerType\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Signature Version 2\",\n+                                        \"value\": \"S3SignerType\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Custom Signature\",\n+                                        \"value\": \"CustomSignerType\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"Default Signature\",\n+                                \"description\": \"The AWS S3 library uses Signature Version 4 by default but this property allows you to specify the Version 2 signer to support older S3-compatible services or even to plug in your own custom signer implementation.\",\n+                                \"displayName\": \"Signer Override\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Pool - Max Wait Time\",\n-                                \"required\": true,\n+                                \"name\": \"Signer Override\",\n+                                \"required\": false,\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+                            \"custom-signer-class-name\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"CustomSignerType\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Signer Override\",\n+                                        \"propertyName\": \"Signer Override\"\n+                                    }\n+                                ],\n+                                \"description\": \"Fully qualified class name of the custom signer class. The signer must implement com.amazonaws.auth.Signer interface.\",\n+                                \"displayName\": \"Custom Signer Class Name\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Pool - Min Evictable Idle Time\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"custom-signer-class-name\",\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+                            \"custom-signer-module-location\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"CustomSignerType\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Signer Override\",\n+                                        \"propertyName\": \"Signer Override\"\n+                                    }\n+                                ],\n+                                \"description\": \"Comma-separated list of paths to files and/or directories which contain the custom signer's JAR file and its dependencies (if any).\",\n+                                \"displayName\": \"Custom Signer Module Location\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Pool - Min Idle\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"custom-signer-module-location\",\n+                                \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"MULTIPLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\",\n+                                        \"DIRECTORY\"\n+                                    ]\n+                                },\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+                            \"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                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Pool - Num Tests Per Eviction Run\",\n-                                \"required\": true,\n+                                \"name\": \"delimiter\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Pool - Test On Borrow\": {\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\": \"Whether or not connections should be tested upon borrowing from the pool.\",\n-                                \"displayName\": \"Pool - Test On Borrow\",\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\": \"Pool - Test On Borrow\",\n+                                \"name\": \"et-initial-listing-target\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Pool - Test On Create\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n+                            \"et-state-cache\": {\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\": \"Whether or not connections should be tested upon creation.\",\n-                                \"displayName\": \"Pool - Test On Create\",\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\": \"Pool - Test On Create\",\n+                                \"name\": \"et-state-cache\",\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.DistributedMapCacheClient\",\n+                                    \"version\": \"2.0.0-M3\"\n+                                }\n                             },\n-                            \"Pool - Test On Return\": {\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+                                        \"propertyDisplayName\": \"Entity Tracking State Cache\",\n+                                        \"propertyName\": \"et-state-cache\"\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+                                \"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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Pool - Test On Return\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"et-time-window\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Pool - Test While Idle\": {\n+                            \"list-type\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"displayName\": \"List Objects V1\",\n+                                        \"value\": \"1\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"displayName\": \"List Objects V2\",\n+                                        \"value\": \"2\"\n                                     }\n                                 ],\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\": \"Pool - Test While Idle\",\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+                                \"defaultValue\": \"1\",\n+                                \"description\": \"Specifies whether to use the original List Objects or the newer List Objects Version 2 endpoint.\",\n+                                \"displayName\": \"List Type\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Pool - Time Between Eviction Runs\",\n+                                \"name\": \"list-type\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Redis Mode\": {\n+                            \"listing-strategy\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"A single standalone Redis instance.\",\n-                                        \"displayName\": \"Standalone\",\n-                                        \"value\": \"Standalone\"\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\": \"Redis Sentinel which provides high-availability. Described further at https://redis.io/topics/sentinel\",\n-                                        \"displayName\": \"Sentinel\",\n-                                        \"value\": \"Sentinel\"\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\": \"Clustered Redis which provides sharding and replication. Described further at https://redis.io/topics/cluster-spec\",\n-                                        \"displayName\": \"Cluster\",\n-                                        \"value\": \"Cluster\"\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\": \"Standalone\",\n-                                \"description\": \"The type of Redis being communicated with - standalone, sentinel, or clustered.\",\n-                                \"displayName\": \"Redis Mode\",\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\": \"Redis Mode\",\n+                                \"name\": \"listing-strategy\",\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+                            \"max-age\": {\n+                                \"description\": \"The maximum age that an S3 object can be in order to be considered; any object older than this amount of time (according to last modification date) will be ignored\",\n+                                \"displayName\": \"Maximum Object Age\",\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\": \"2.0.0-M3\"\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Sentinel Master\",\n+                                \"name\": \"max-age\",\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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+                            \"min-age\": {\n+                                \"defaultValue\": \"0 sec\",\n+                                \"description\": \"The minimum age that an S3 object must be in order to be considered; any object younger than this amount of time (according to last modification date) will be ignored\",\n+                                \"displayName\": \"Minimum Object Age\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Sentinel Username\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"min-age\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Username\": {\n-                                \"description\": \"The username used to authenticate to the Redis server.\",\n-                                \"displayName\": \"Username\",\n+                            \"prefix\": {\n+                                \"description\": \"The prefix used to filter the object list. Do not begin with a forward slash '/'. In most cases, it should end with a forward slash '/'.\",\n+                                \"displayName\": \"Prefix\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Username\",\n+                                \"name\": \"prefix\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n-                            }\n-                        },\n-                        \"providedApiImplementations\": [\n-                            {\n-                                \"artifact\": \"nifi-redis-service-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.redis.RedisConnectionPool\",\n-                                \"version\": \"2.0.0-M3\"\n-                            }\n-                        ],\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"cache\",\n-                            \"redis\"\n-                        ],\n-                        \"type\": \"org.apache.nifi.redis.service.RedisConnectionPoolService\",\n-                        \"typeDescription\": \"A service that provides connections to Redis.\",\n-                        \"version\": \"2.0.0-M3\"\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-redis-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"f2215c6\"\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+                            \"proxy-configuration-service\": {\n+                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests.\",\n+                                \"displayName\": \"Proxy Configuration Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"redis-connection-pool\",\n-                                \"required\": true,\n+                                \"name\": \"proxy-configuration-service\",\n+                                \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-redis-service-api-nar\",\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.redis.RedisConnectionPool\",\n+                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n                                     \"version\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-redis-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"f2215c6\"\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+                            \"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\": \"redis-connection-pool\",\n-                                \"required\": true,\n+                                \"name\": \"record-writer\",\n+                                \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-redis-service-api-nar\",\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.redis.RedisConnectionPool\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n                                     \"version\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\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.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\": \"2.0.0-M3\"\n-                    }\n-                ],\n-                \"processors\": [\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-redis-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"f2215c6\"\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-                        \"multiProcessorUseCases\": [],\n-                        \"primaryNodeOnly\": false,\n-                        \"propertyDescriptors\": {\n-                            \"charset\": {\n-                                \"defaultValue\": \"UTF-8\",\n-                                \"description\": \"Specifies the character set to use when storing record field values as strings. All fields will be converted to strings using this character set before being stored in Redis.\",\n-                                \"displayName\": \"Character Set\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"charset\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n                             },\n-                            \"data-record-path\": {\n-                                \"defaultValue\": \"/\",\n-                                \"description\": \"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 Redis instead of sending the entire incoming Record. The property defaults to the root '/' which corresponds to a 'flat' record (all fields/values at the top level of  the Record.\",\n-                                \"displayName\": \"Data Record Path\",\n+                            \"requester-pays\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Indicates that the requester consents to pay any charges associated with listing the S3 bucket.\",\n+                                        \"displayName\": \"True\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Does not consent to pay requester charges for listing the S3 bucket.\",\n+                                        \"displayName\": \"False\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"If true, indicates that the requester consents to pay any charges associated with listing the S3 bucket.  This sets the 'x-amz-request-payer' header to 'requester'.  Note that this setting is not applicable when 'Use Versions' is 'true'.\",\n+                                \"displayName\": \"Requester Pays\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"data-record-path\",\n+                                \"name\": \"requester-pays\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"hash-value-record-path\": {\n-                                \"description\": \"Specifies a RecordPath to evaluate against each Record in order to determine the hash value associated with all the record fields/values (see 'hset' in Redis documentation for more details). The RecordPath must point at exactly one field or an error will occur.\",\n-                                \"displayName\": \"Hash Value Record Path\",\n+                            \"use-versions\": {\n+                                \"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 S3 versions, if applicable.  If false, only the latest version of each object will be returned.\",\n+                                \"displayName\": \"Use Versions\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"hash-value-record-path\",\n+                                \"name\": \"use-versions\",\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+                            \"write-s3-object-tags\": {\n+                                \"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', the tags associated with the S3 object will be written as FlowFile attributes\",\n+                                \"displayName\": \"Write Object Tags\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"record-reader\",\n+                                \"name\": \"write-s3-object-tags\",\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\": \"2.0.0-M3\"\n-                                }\n+                                \"sensitive\": false\n                             },\n-                            \"redis-connection-pool\": {\n-                                \"description\": \"\",\n-                                \"displayName\": \"Redis Connection Pool\",\n+                            \"write-s3-user-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\": \"false\",\n+                                \"description\": \"If set to 'True', the user defined metadata associated with the S3 object will be added to FlowFile attributes/records\",\n+                                \"displayName\": \"Write User Metadata\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"redis-connection-pool\",\n+                                \"name\": \"write-s3-user-metadata\",\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\": \"2.0.0-M3\"\n-                                }\n+                                \"sensitive\": false\n                             }\n                         },\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.aws.s3.DeleteS3Object\",\n+                            \"org.apache.nifi.processors.aws.s3.FetchS3Object\",\n+                            \"org.apache.nifi.processors.aws.s3.PutS3Object\"\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 having all Records stored in Redis will be routed to this relationship\",\n+                                \"description\": \"FlowFiles are routed to this Relationship after they have been successfully processed.\",\n                                 \"name\": \"success\"\n-                            },\n-                            {\n-                                \"description\": \"FlowFiles containing Records with processing errors 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                         \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"hash\",\n-                            \"put\",\n-                            \"record\",\n-                            \"redis\"\n+                            \"AWS\",\n+                            \"Amazon\",\n+                            \"S3\",\n+                            \"list\"\n                         ],\n-                        \"triggerSerially\": false,\n+                        \"triggerSerially\": true,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.redis.processor.PutRedisHashRecord\",\n-                        \"typeDescription\": \"Puts record field data into Redis using a specified hash value, which is determined by a RecordPath to a field in each record containing the hash value. The record fields and values are stored as key/value pairs associated by the hash value. NOTE: Neither the evaluated hash value nor any of the field values can be null. If the hash value is null, the FlowFile will be routed to failure. For each of the field values, if the value is null that field will be not set in Redis.\",\n+                        \"triggerWhenEmpty\": true,\n+                        \"type\": \"org.apache.nifi.processors.aws.s3.ListS3\",\n+                        \"typeDescription\": \"Retrieves a listing of objects from an S3 bucket. For each object that is listed, creates a FlowFile that represents the object so that it can be fetched in conjunction with FetchS3Object. 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                         \"useCases\": [],\n                         \"version\": \"2.0.0-M3\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"Number of records written to Redis\",\n-                                \"name\": \"redis.success.record.count\"\n+                                \"description\": \"The name of the S3 bucket\",\n+                                \"name\": \"s3.bucket\"\n+                            },\n+                            {\n+                                \"description\": \"The region of the S3 bucket\",\n+                                \"name\": \"s3.region\"\n+                            },\n+                            {\n+                                \"description\": \"The name of the file\",\n+                                \"name\": \"filename\"\n+                            },\n+                            {\n+                                \"description\": \"The ETag that can be used to see if the file has changed\",\n+                                \"name\": \"s3.etag\"\n+                            },\n+                            {\n+                                \"description\": \"A boolean indicating if this is the latest version of the object\",\n+                                \"name\": \"s3.isLatest\"\n+                            },\n+                            {\n+                                \"description\": \"The last modified time in milliseconds since epoch in UTC time\",\n+                                \"name\": \"s3.lastModified\"\n+                            },\n+                            {\n+                                \"description\": \"The size of the object in bytes\",\n+                                \"name\": \"s3.length\"\n+                            },\n+                            {\n+                                \"description\": \"The storage class of the object\",\n+                                \"name\": \"s3.storeClass\"\n+                            },\n+                            {\n+                                \"description\": \"The version of the object, if applicable\",\n+                                \"name\": \"s3.version\"\n+                            },\n+                            {\n+                                \"description\": \"If 'Write Object Tags' is set to 'True', the tags associated to the S3 object that is being listed will be written as part of the flowfile attributes\",\n+                                \"name\": \"s3.tag.___\"\n+                            },\n+                            {\n+                                \"description\": \"If 'Write User Metadata' is set to 'True', the user defined metadata associated to the S3 object that is being listed will be written as part of the flowfile attributes\",\n+                                \"name\": \"s3.user.metadata.___\"\n                             }\n                         ]\n-                    }\n-                ],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"2.0.0-M3\"\n-        },\n-        {\n-            \"artifact\": \"nifi-mongodb-services-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [\n+                    },\n                     {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-mongodb-services-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-aws-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\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 user-defined metadata to be added to the S3 object as key/value pairs\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"name\": \"The name of a User-Defined Metadata field to add to the S3 Object\",\n+                                \"value\": \"The value of a User-Defined Metadata field to add to the S3 Object\"\n+                            }\n+                        ],\n                         \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"multiProcessorUseCases\": [],\n+                        \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Database User\": {\n-                                \"description\": \"Database user name\",\n-                                \"displayName\": \"Database User\",\n+                            \"AWS Credentials Provider service\": {\n+                                \"description\": \"The Controller Service that is used to obtain AWS credentials provider\",\n+                                \"displayName\": \"AWS Credentials Provider Service\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Database User\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"AWS Credentials Provider service\",\n+                                \"required\": true,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-aws-service-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.processors.aws.credentials.provider.service.AWSCredentialsProviderService\",\n+                                    \"version\": \"2.0.0-M3\"\n+                                }\n                             },\n-                            \"Password\": {\n-                                \"description\": \"The password for the database user\",\n-                                \"displayName\": \"Password\",\n+                            \"Bucket\": {\n+                                \"defaultValue\": \"${s3.bucket}\",\n+                                \"description\": \"The S3 Bucket to interact with\",\n+                                \"displayName\": \"Bucket\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Password\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Bucket\",\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+                            \"Cache Control\": {\n+                                \"description\": \"Sets the Cache-Control HTTP header indicating the caching directives of the associated object. Multiple directives are comma-separated.\",\n+                                \"displayName\": \"Cache Control\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"mongo-uri\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Cache Control\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"mongo-write-concern\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Write operations that use this write concern will wait for acknowledgement, using the default write concern configured on the server\",\n-                                        \"displayName\": \"ACKNOWLEDGED\",\n-                                        \"value\": \"ACKNOWLEDGED\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Write operations that use this write concern will return as soon as the message is written to the socket. Exceptions are raised for network issues, but not server errors\",\n-                                        \"displayName\": \"UNACKNOWLEDGED\",\n-                                        \"value\": \"UNACKNOWLEDGED\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Deprecated.  Use of \\\"JOURNALED\\\" is preferred\",\n-                                        \"displayName\": \"FSYNCED\",\n-                                        \"value\": \"FSYNCED\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Write operations wait for the server to group commit to the journal file on disk\",\n-                                        \"displayName\": \"JOURNALED\",\n-                                        \"value\": \"JOURNALED\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Deprecated.  Use of \\\"W2\\\" is preferred\",\n-                                        \"displayName\": \"REPLICA_ACKNOWLEDGED\",\n-                                        \"value\": \"REPLICA_ACKNOWLEDGED\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Exceptions are raised for network issues, and server errors; waits on a majority of servers for the write operation\",\n-                                        \"displayName\": \"MAJORITY\",\n-                                        \"value\": \"MAJORITY\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Write operations that use this write concern will wait for acknowledgement from a single member\",\n-                                        \"displayName\": \"W1\",\n-                                        \"value\": \"W1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Write operations that use this write concern will wait for acknowledgement from two members\",\n-                                        \"displayName\": \"W2\",\n-                                        \"value\": \"W2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Write operations that use this write concern will wait for acknowledgement from three members\",\n-                                        \"displayName\": \"W3\",\n-                                        \"value\": \"W3\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"ACKNOWLEDGED\",\n-                                \"description\": \"The write concern to use\",\n-                                \"displayName\": \"Write Concern\",\n+                            \"Communications Timeout\": {\n+                                \"defaultValue\": \"30 secs\",\n+                                \"description\": \"The amount of time to wait in order to establish a connection to AWS or receive data from AWS before timing out.\",\n+                                \"displayName\": \"Communications Timeout\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"mongo-write-concern\",\n+                                \"name\": \"Communications Timeout\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"ssl-client-auth\": {\n+                            \"Content Disposition\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"WANT\",\n-                                        \"value\": \"WANT\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"REQUIRED\",\n-                                        \"value\": \"REQUIRED\"\n+                                        \"displayName\": \"inline\",\n+                                        \"value\": \"inline\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"NONE\",\n-                                        \"value\": \"NONE\"\n+                                        \"displayName\": \"attachment\",\n+                                        \"value\": \"attachment\"\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\": \"Sets the Content-Disposition HTTP header indicating if the content is intended to be displayed inline or should be downloaded.\\n Possible values are 'inline' or 'attachment'. If this property is not specified, object's content-disposition will be set to filename. When 'attachment' is selected, '; filename=' plus object key are automatically appended to form final value 'attachment; filename=\\\"filename.jpg\\\"'.\",\n+                                \"displayName\": \"Content Disposition\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"ssl-client-auth\",\n+                                \"name\": \"Content Disposition\",\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\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-mongodb-services-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"f2215c6\"\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+                            \"Content Type\": {\n+                                \"description\": \"Sets the Content-Type HTTP header indicating the type of content stored in the associated object. The value of this header is a standard MIME type.\\nAWS S3 Java client will attempt to determine the correct content type if one hasn't been set yet. Users are responsible for ensuring a suitable content type is set when uploading streams. If no content type is provided and cannot be determined by the filename, the default content type \\\"application/octet-stream\\\" will be used.\",\n+                                \"displayName\": \"Content Type\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"mongo-collection-name\",\n-                                \"required\": true,\n+                                \"name\": \"Content Type\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"mongo-db-name\": {\n-                                \"description\": \"The name of the database to use\",\n-                                \"displayName\": \"Mongo Database Name\",\n+                            \"Endpoint Override URL\": {\n+                                \"description\": \"Endpoint URL to use instead of the AWS default including scheme, host, port, and path. The AWS libraries select an endpoint URL based on the AWS region, but this property overrides the selected endpoint URL, allowing use with other S3-compatible endpoints.\",\n+                                \"displayName\": \"Endpoint Override URL\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Endpoint Override URL\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Expiration Time Rule\": {\n+                                \"description\": \"\",\n+                                \"displayName\": \"Expiration Time Rule\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"mongo-db-name\",\n-                                \"required\": true,\n+                                \"name\": \"Expiration Time Rule\",\n+                                \"required\": false,\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+                            \"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\": \"mongo-lookup-client-service\",\n+                                \"name\": \"File Resource Service\",\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.fileresource.service.api.FileResourceService\",\n                                     \"version\": \"2.0.0-M3\"\n                                 }\n                             },\n-                            \"mongo-lookup-projection\": {\n-                                \"description\": \"Specifies a projection for limiting which fields will be returned.\",\n-                                \"displayName\": \"Projection\",\n+                            \"FullControl User List\": {\n+                                \"defaultValue\": \"${s3.permissions.full.users}\",\n+                                \"description\": \"A comma-separated list of Amazon User ID's or E-mail addresses that specifies who should have Full Control for an object\",\n+                                \"displayName\": \"FullControl User List\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"FullControl User List\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Multipart Part Size\": {\n+                                \"defaultValue\": \"5 GB\",\n+                                \"description\": \"Specifies the part size for use when the PutS3Multipart Upload API is used. Flow files will be broken into chunks of this size for the upload process, but the last part sent can be smaller since it is not padded. The valid range is 50MB to 5GB.\",\n+                                \"displayName\": \"Multipart Part Size\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"mongo-lookup-projection\",\n-                                \"required\": false,\n+                                \"name\": \"Multipart Part Size\",\n+                                \"required\": true,\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+                            \"Multipart Threshold\": {\n+                                \"defaultValue\": \"5 GB\",\n+                                \"description\": \"Specifies the file size threshold for switch from the PutS3Object API to the PutS3MultipartUpload API.  Flow files bigger than this limit will be sent using the stateful multipart process. The valid range is 50MB to 5GB.\",\n+                                \"displayName\": \"Multipart Threshold\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"mongo-lookup-value-field\",\n-                                \"required\": false,\n+                                \"name\": \"Multipart Threshold\",\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 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\": \"\",\n-                                        \"displayName\": \"Infer from Result\",\n-                                        \"value\": \"infer\"\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+                            \"Multipart Upload AgeOff Interval\": {\n+                                \"defaultValue\": \"60 min\",\n+                                \"description\": \"Specifies the interval at which existing multipart uploads in AWS S3 will be evaluated for ageoff.  When processor is triggered it will initiate the ageoff evaluation if this interval has been exceeded.\",\n+                                \"displayName\": \"Multipart Upload AgeOff Interval\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"schema-access-strategy\",\n+                                \"name\": \"Multipart Upload AgeOff Interval\",\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+                            \"Multipart Upload Max Age Threshold\": {\n+                                \"defaultValue\": \"7 days\",\n+                                \"description\": \"Specifies the maximum age for existing multipart uploads in AWS S3.  When the ageoff process occurs, any upload older than this threshold will be aborted.\",\n+                                \"displayName\": \"Multipart Upload Max Age Threshold\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"schema-branch\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Multipart Upload Max Age Threshold\",\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+                            \"Object Key\": {\n+                                \"defaultValue\": \"${filename}\",\n+                                \"description\": \"The S3 Object Key to use. This is analogous to a filename for traditional file systems.\",\n+                                \"displayName\": \"Object Key\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"schema-name\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Object Key\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"schema-registry\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"schema-reference-reader\",\n-                                            \"schema-name\"\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+                            \"Owner\": {\n+                                \"defaultValue\": \"${s3.owner}\",\n+                                \"description\": \"The Amazon ID to use for the object's owner\",\n+                                \"displayName\": \"Owner\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"schema-registry\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Owner\",\n                                 \"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\": \"2.0.0-M3\"\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+                            \"Read ACL User List\": {\n+                                \"defaultValue\": \"${s3.permissions.readacl.users}\",\n+                                \"description\": \"A comma-separated list of Amazon User ID's or E-mail addresses that specifies who should have permissions to read the Access Control List for an object\",\n+                                \"displayName\": \"Read ACL User List\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"schema-text\",\n+                                \"name\": \"Read ACL User List\",\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+                            \"Read Permission User List\": {\n+                                \"defaultValue\": \"${s3.permissions.read.users}\",\n+                                \"description\": \"A comma-separated list of Amazon User ID's or E-mail addresses that specifies who should have Read Access for an object\",\n+                                \"displayName\": \"Read Permission User List\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables 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.lookup.LookupService\",\n-                                \"version\": \"2.0.0-M3\"\n-                            }\n-                        ],\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"lookup\",\n-                            \"mongo\",\n-                            \"mongodb\",\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-                        \"version\": \"2.0.0-M3\"\n-                    }\n-                ],\n-                \"processors\": [],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"2.0.0-M3\"\n-        },\n-        {\n-            \"artifact\": \"nifi-elasticsearch-restapi-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [],\n-                \"processors\": [\n-                    {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-elasticsearch-restapi-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"f2215c6\"\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-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\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-                        \"multiProcessorUseCases\": [],\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"el-query-attribute\",\n+                                \"name\": \"Read Permission User List\",\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\": \"2.0.0-M3\"\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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"el-rest-fetch-index\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"el-rest-format-aggregations\": {\n+                            \"Region\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Contains full Elasticsearch Aggregation, including Buckets and Metadata.\",\n-                                        \"displayName\": \"FULL\",\n-                                        \"value\": \"FULL\"\n+                                        \"description\": \"AWS Region Code : us-gov-west-1\",\n+                                        \"displayName\": \"AWS GovCloud (US)\",\n+                                        \"value\": \"us-gov-west-1\"\n                                     },\n                                     {\n-                                        \"description\": \"Bucket Content only.\",\n-                                        \"displayName\": \"BUCKETS_ONLY\",\n-                                        \"value\": \"BUCKETS_ONLY\"\n+                                        \"description\": \"AWS Region Code : us-gov-east-1\",\n+                                        \"displayName\": \"AWS GovCloud (US-East)\",\n+                                        \"value\": \"us-gov-east-1\"\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+                                        \"description\": \"AWS Region Code : us-east-1\",\n+                                        \"displayName\": \"US East (N. Virginia)\",\n+                                        \"value\": \"us-east-1\"\n+                                    },\n                                     {\n-                                        \"description\": \"Contains full Elasticsearch Hit, including Document Source and Metadata.\",\n-                                        \"displayName\": \"FULL\",\n-                                        \"value\": \"FULL\"\n+                                        \"description\": \"AWS Region Code : us-east-2\",\n+                                        \"displayName\": \"US East (Ohio)\",\n+                                        \"value\": \"us-east-2\"\n                                     },\n                                     {\n-                                        \"description\": \"Document Source only (where present).\",\n-                                        \"displayName\": \"SOURCE_ONLY\",\n-                                        \"value\": \"SOURCE_ONLY\"\n+                                        \"description\": \"AWS Region Code : us-west-1\",\n+                                        \"displayName\": \"US West (N. California)\",\n+                                        \"value\": \"us-west-1\"\n                                     },\n                                     {\n-                                        \"description\": \"Hit Metadata only.\",\n-                                        \"displayName\": \"METADATA_ONLY\",\n-                                        \"value\": \"METADATA_ONLY\"\n+                                        \"description\": \"AWS Region Code : us-west-2\",\n+                                        \"displayName\": \"US West (Oregon)\",\n+                                        \"value\": \"us-west-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-west-1\",\n+                                        \"displayName\": \"EU (Ireland)\",\n+                                        \"value\": \"eu-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-west-2\",\n+                                        \"displayName\": \"EU (London)\",\n+                                        \"value\": \"eu-west-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-west-3\",\n+                                        \"displayName\": \"EU (Paris)\",\n+                                        \"value\": \"eu-west-3\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-central-1\",\n+                                        \"displayName\": \"EU (Frankfurt)\",\n+                                        \"value\": \"eu-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-central-2\",\n+                                        \"displayName\": \"EU (Zurich)\",\n+                                        \"value\": \"eu-central-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-north-1\",\n+                                        \"displayName\": \"EU (Stockholm)\",\n+                                        \"value\": \"eu-north-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-south-1\",\n+                                        \"displayName\": \"EU (Milan)\",\n+                                        \"value\": \"eu-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-south-2\",\n+                                        \"displayName\": \"EU (Spain)\",\n+                                        \"value\": \"eu-south-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-east-1\",\n+                                        \"displayName\": \"Asia Pacific (Hong Kong)\",\n+                                        \"value\": \"ap-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-south-1\",\n+                                        \"displayName\": \"Asia Pacific (Mumbai)\",\n+                                        \"value\": \"ap-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-south-2\",\n+                                        \"displayName\": \"Asia Pacific (Hyderabad)\",\n+                                        \"value\": \"ap-south-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-southeast-1\",\n+                                        \"displayName\": \"Asia Pacific (Singapore)\",\n+                                        \"value\": \"ap-southeast-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-southeast-2\",\n+                                        \"displayName\": \"Asia Pacific (Sydney)\",\n+                                        \"value\": \"ap-southeast-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-southeast-3\",\n+                                        \"displayName\": \"Asia Pacific (Jakarta)\",\n+                                        \"value\": \"ap-southeast-3\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-southeast-4\",\n+                                        \"displayName\": \"Asia Pacific (Melbourne)\",\n+                                        \"value\": \"ap-southeast-4\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-northeast-1\",\n+                                        \"displayName\": \"Asia Pacific (Tokyo)\",\n+                                        \"value\": \"ap-northeast-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-northeast-2\",\n+                                        \"displayName\": \"Asia Pacific (Seoul)\",\n+                                        \"value\": \"ap-northeast-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-northeast-3\",\n+                                        \"displayName\": \"Asia Pacific (Osaka)\",\n+                                        \"value\": \"ap-northeast-3\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : sa-east-1\",\n+                                        \"displayName\": \"South America (Sao Paulo)\",\n+                                        \"value\": \"sa-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : cn-north-1\",\n+                                        \"displayName\": \"China (Beijing)\",\n+                                        \"value\": \"cn-north-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : cn-northwest-1\",\n+                                        \"displayName\": \"China (Ningxia)\",\n+                                        \"value\": \"cn-northwest-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ca-central-1\",\n+                                        \"displayName\": \"Canada (Central)\",\n+                                        \"value\": \"ca-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ca-west-1\",\n+                                        \"displayName\": \"Canada West (Calgary)\",\n+                                        \"value\": \"ca-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : me-central-1\",\n+                                        \"displayName\": \"Middle East (UAE)\",\n+                                        \"value\": \"me-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : me-south-1\",\n+                                        \"displayName\": \"Middle East (Bahrain)\",\n+                                        \"value\": \"me-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : af-south-1\",\n+                                        \"displayName\": \"Africa (Cape Town)\",\n+                                        \"value\": \"af-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-iso-east-1\",\n+                                        \"displayName\": \"US ISO East\",\n+                                        \"value\": \"us-iso-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-isob-east-1\",\n+                                        \"displayName\": \"US ISOB East (Ohio)\",\n+                                        \"value\": \"us-isob-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-iso-west-1\",\n+                                        \"displayName\": \"US ISO West\",\n+                                        \"value\": \"us-iso-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : il-central-1\",\n+                                        \"displayName\": \"Israel (Tel Aviv)\",\n+                                        \"value\": \"il-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Uses 's3.region' FlowFile attribute as region.\",\n+                                        \"displayName\": \"Use 's3.region' Attribute\",\n+                                        \"value\": \"attribute-defined-region\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"FULL\",\n-                                \"description\": \"Format of Hits output.\",\n-                                \"displayName\": \"Search Results Format\",\n+                                \"defaultValue\": \"us-west-2\",\n+                                \"description\": \"The AWS Region to connect to.\",\n+                                \"displayName\": \"Region\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"el-rest-format-hits\",\n+                                \"name\": \"Region\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"el-rest-output-no-hits\": {\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\": \"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+                                \"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\": \"el-rest-output-no-hits\",\n+                                \"name\": \"Resource Transfer Source\",\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+                            \"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\": \"el-rest-pagination-keep-alive\",\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\": \"2.0.0-M3\"\n+                                }\n                             },\n-                            \"el-rest-pagination-type\": {\n+                            \"Signer Override\": {\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+                                        \"description\": \"\",\n+                                        \"displayName\": \"Default Signature\",\n+                                        \"value\": \"Default Signature\"\n                                     },\n                                     {\n-                                        \"description\": \"Use Elasticsearch \\\"search_after\\\" _search API to page sorted results.\",\n-                                        \"displayName\": \"SEARCH_AFTER\",\n-                                        \"value\": \"pagination-search_after\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Signature Version 4\",\n+                                        \"value\": \"AWSS3V4SignerType\"\n                                     },\n                                     {\n-                                        \"description\": \"Use Elasticsearch (7.10+ with XPack) \\\"point in time\\\" _search API to page sorted results. Not available for use with AWS OpenSearch.\",\n-                                        \"displayName\": \"POINT_IN_TIME\",\n-                                        \"value\": \"pagination-pit\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Signature Version 2\",\n+                                        \"value\": \"S3SignerType\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Custom Signature\",\n+                                        \"value\": \"CustomSignerType\"\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+                                \"defaultValue\": \"Default Signature\",\n+                                \"description\": \"The AWS S3 library uses Signature Version 4 by default but this property allows you to specify the Version 2 signer to support older S3-compatible services or even to plug in your own custom signer implementation.\",\n+                                \"displayName\": \"Signer Override\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"el-rest-pagination-type\",\n-                                \"required\": true,\n+                                \"name\": \"Signer Override\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"el-rest-split-up-aggregations\": {\n+                            \"Storage Class\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Flowfile per hit.\",\n-                                        \"displayName\": \"PER_HIT\",\n-                                        \"value\": \"splitUp-yes\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"DeepArchive\",\n+                                        \"value\": \"DeepArchive\"\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\": \"Glacier\",\n+                                        \"value\": \"Glacier\"\n+                                    },\n                                     {\n-                                        \"description\": \"Flowfile per hit.\",\n-                                        \"displayName\": \"PER_HIT\",\n-                                        \"value\": \"splitUp-yes\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"GlacierInstantRetrieval\",\n+                                        \"value\": \"GlacierInstantRetrieval\"\n                                     },\n                                     {\n-                                        \"description\": \"Flowfile per response.\",\n-                                        \"displayName\": \"PER_RESPONSE\",\n-                                        \"value\": \"splitUp-no\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"IntelligentTiering\",\n+                                        \"value\": \"IntelligentTiering\"\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\": \"OneZoneInfrequentAccess\",\n+                                        \"value\": \"OneZoneInfrequentAccess\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Outposts\",\n+                                        \"value\": \"Outposts\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"ReducedRedundancy\",\n+                                        \"value\": \"ReducedRedundancy\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Snow\",\n+                                        \"value\": \"Snow\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Standard\",\n+                                        \"value\": \"Standard\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"StandardInfrequentAccess\",\n+                                        \"value\": \"StandardInfrequentAccess\"\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\": \"Standard\",\n+                                \"description\": \"\",\n+                                \"displayName\": \"Storage Class\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"el-rest-split-up-hits\",\n+                                \"name\": \"Storage Class\",\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\": \"Environment variables 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\": \"Environment variables 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+                            \"Write ACL User List\": {\n+                                \"defaultValue\": \"${s3.permissions.writeacl.users}\",\n+                                \"description\": \"A comma-separated list of Amazon User ID's or E-mail addresses that specifies who should have permissions to change the Access Control List for an object\",\n+                                \"displayName\": \"Write ACL User List\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"es-rest-query-fields\",\n+                                \"name\": \"Write ACL User List\",\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+                            \"Write Permission User List\": {\n+                                \"defaultValue\": \"${s3.permissions.write.users}\",\n+                                \"description\": \"A comma-separated list of Amazon User ID's or E-mail addresses that specifies who should have Write Access for an object\",\n+                                \"displayName\": \"Write Permission User List\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"es-rest-query-script-fields\",\n+                                \"name\": \"Write Permission User List\",\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+                            \"canned-acl\": {\n+                                \"defaultValue\": \"${s3.permissions.cannedacl}\",\n+                                \"description\": \"Amazon Canned ACL for an object, one of: BucketOwnerFullControl, BucketOwnerRead, LogDeliveryWrite, AuthenticatedRead, PublicReadWrite, PublicRead, Private; will be ignored if any other ACL/permission/owner property is specified\",\n+                                \"displayName\": \"Canned ACL\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"es-rest-query-sort\",\n+                                \"name\": \"canned-acl\",\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+                            \"custom-signer-class-name\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"CustomSignerType\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Signer Override\",\n+                                        \"propertyName\": \"Signer Override\"\n+                                    }\n+                                ],\n+                                \"description\": \"Fully qualified class name of the custom signer class. The signer must implement com.amazonaws.auth.Signer interface.\",\n+                                \"displayName\": \"Custom Signer Class Name\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"es-rest-range-field\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"custom-signer-class-name\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"es-rest-range-format\": {\n+                            \"custom-signer-module-location\": {\n                                 \"dependencies\": [\n                                     {\n-                                        \"propertyDisplayName\": \"Initial Value\",\n-                                        \"propertyName\": \"es-rest-range-initial-value\"\n+                                        \"dependentValues\": [\n+                                            \"CustomSignerType\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Signer Override\",\n+                                        \"propertyName\": \"Signer Override\"\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+                                \"description\": \"Comma-separated list of paths to files and/or directories which contain the custom signer's JAR file and its dependencies (if any).\",\n+                                \"displayName\": \"Custom Signer Module Location\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"es-rest-range-format\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"custom-signer-module-location\",\n                                 \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"MULTIPLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\",\n+                                        \"DIRECTORY\"\n+                                    ]\n+                                },\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+                            \"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                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"es-rest-range-initial-value\",\n+                                \"name\": \"encryption-service\",\n                                 \"required\": false,\n-                                \"sensitive\": false\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-aws-service-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.processors.aws.s3.AmazonS3EncryptionService\",\n+                                    \"version\": \"2.0.0-M3\"\n+                                }\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+                            \"proxy-configuration-service\": {\n+                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests.\",\n+                                \"displayName\": \"Proxy Configuration Service\",\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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"es-rest-size\",\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\": \"2.0.0-M3\"\n+                                }\n                             },\n-                            \"es-rest-sort-order\": {\n+                            \"s3-object-remove-tags-prefix\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"asc\",\n-                                        \"value\": \"asc\"\n+                                        \"displayName\": \"True\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"desc\",\n-                                        \"value\": \"desc\"\n+                                        \"displayName\": \"False\",\n+                                        \"value\": \"false\"\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\": \"false\",\n+                                \"description\": \"If set to 'True', the value provided for 'Object Tags Prefix' will be removed from the attribute(s) and then considered as the Tag name. For ex: If the incoming FlowFile carries the attributes tagS3country, tagS3PII and the prefix is set to 'tagS3' then the corresponding tag values would be 'country' and 'PII'\",\n+                                \"displayName\": \"Remove Tag Prefix\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"es-rest-sort-order\",\n-                                \"required\": true,\n+                                \"name\": \"s3-object-remove-tags-prefix\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n-                            }\n-                        },\n-                        \"seeAlso\": [\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\": \"Search hits are routed to this relationship.\",\n-                                \"name\": \"hits\"\n-                            },\n-                            {\n-                                \"description\": \"Aggregations are routed to this relationship.\",\n-                                \"name\": \"aggregations\"\n-                            }\n-                        ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": true,\n-                        \"supportsDynamicRelationships\": 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-                            \"elasticsearch\",\n-                            \"elasticsearch5\",\n-                            \"elasticsearch6\",\n-                            \"elasticsearch7\",\n-                            \"elasticsearch8\",\n-                            \"json\",\n-                            \"page\",\n-                            \"query\",\n-                            \"scroll\",\n-                            \"search\"\n-                        ],\n-                        \"triggerSerially\": true,\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-                        \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\",\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-                    },\n-                    {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-elasticsearch-restapi-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"f2215c6\"\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\": \"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-                        \"multiProcessorUseCases\": [],\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+                            \"s3-object-tags-prefix\": {\n+                                \"description\": \"Specifies the prefix which would be scanned against the incoming FlowFile's attributes and the matching attribute's name and value would be considered as the outgoing S3 object's Tag name and Tag value respectively. For Ex: If the incoming FlowFile carries the attributes tagS3country, tagS3PII, the tag prefix to be specified would be 'tagS3'\",\n+                                \"displayName\": \"Object Tags Prefix\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"el-query-attribute\",\n+                                \"name\": \"s3-object-tags-prefix\",\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\": \"2.0.0-M3\"\n-                                }\n-                            },\n-                            \"el-rest-fetch-index\": {\n-                                \"description\": \"The name of the index to use.\",\n-                                \"displayName\": \"Index\",\n+                            \"s3-temporary-directory-multipart\": {\n+                                \"defaultValue\": \"${java.io.tmpdir}\",\n+                                \"description\": \"Directory in which, for multipart uploads, the processor will locally save the state tracking the upload ID and parts uploaded which must both be provided to complete the upload.\",\n+                                \"displayName\": \"Temporary Directory Multipart State\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"el-rest-fetch-index\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"s3-temporary-directory-multipart\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"el-rest-query\": {\n-                                \"dependencies\": [\n+                            \"server-side-encryption\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"full\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Query Definition Style\",\n-                                        \"propertyName\": \"el-rest-query-definition-style\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"None\",\n+                                        \"value\": \"None\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"AES256\",\n+                                        \"value\": \"AES256\"\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+                                \"defaultValue\": \"None\",\n+                                \"description\": \"Specifies the algorithm used for server side encryption.\",\n+                                \"displayName\": \"Server Side Encryption\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"el-rest-query\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"server-side-encryption\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"el-rest-query-clause\": {\n-                                \"dependencies\": [\n+                            \"use-chunked-encoding\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"build\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Query Definition Style\",\n-                                        \"propertyName\": \"el-rest-query-definition-style\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\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+                                \"defaultValue\": \"true\",\n+                                \"description\": \"Enables / disables chunked encoding for upload requests. Set it to false only if your endpoint does not support chunked uploading.\",\n+                                \"displayName\": \"Use Chunked Encoding\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"el-rest-query-clause\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"use-chunked-encoding\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"el-rest-query-definition-style\": {\n+                            \"use-path-style-access\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Provide the full Query.\",\n-                                        \"displayName\": \"FULL_QUERY\",\n-                                        \"value\": \"full\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n-                                        \"description\": \"Build the Query from separate JSON objects.\",\n-                                        \"displayName\": \"BUILD_QUERY\",\n-                                        \"value\": \"build\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\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\": \"false\",\n+                                \"description\": \"Path-style access can be enforced by setting this property to true. Set it to true if your endpoint does not support virtual-hosted-style requests, only path-style requests.\",\n+                                \"displayName\": \"Use Path Style Access\",\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-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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"el-rest-type\",\n+                                \"name\": \"use-path-style-access\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             }\n                         },\n+                        \"readsAttributes\": [\n+                            {\n+                                \"description\": \"Uses the FlowFile's filename as the filename for the S3 object\",\n+                                \"name\": \"filename\"\n+                            }\n+                        ],\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.aws.s3.DeleteS3Object\",\n+                            \"org.apache.nifi.processors.aws.s3.FetchS3Object\",\n+                            \"org.apache.nifi.processors.aws.s3.ListS3\"\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+                                \"description\": \"FlowFiles are routed to this Relationship after they have been successfully processed.\",\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\": \"If the Processor is unable to process a given FlowFile, it will be routed to this Relationship.\",\n                                 \"name\": \"failure\"\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                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": false,\n+                        \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": true,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"delete\",\n-                            \"elastic\",\n-                            \"elasticsearch\",\n-                            \"elasticsearch5\",\n-                            \"elasticsearch6\",\n-                            \"elasticsearch7\",\n-                            \"elasticsearch8\",\n-                            \"query\"\n+                            \"AWS\",\n+                            \"Amazon\",\n+                            \"Archive\",\n+                            \"Put\",\n+                            \"S3\"\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+                        \"type\": \"org.apache.nifi.processors.aws.s3.PutS3Object\",\n+                        \"typeDescription\": \"Writes the contents of a FlowFile as an S3 Object to an Amazon S3 Bucket.\",\n                         \"useCases\": [],\n                         \"version\": \"2.0.0-M3\",\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+                                \"description\": \"The URL that can be used to access the S3 object\",\n+                                \"name\": \"s3.url\"\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-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-elasticsearch-restapi-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"f2215c6\"\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+                                \"description\": \"The S3 bucket where the Object was put in S3\",\n+                                \"name\": \"s3.bucket\"\n+                            },\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_ALLOWED\",\n-                        \"multiProcessorUseCases\": [],\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\": \"2.0.0-M3\"\n-                                }\n+                                \"description\": \"The S3 key within where the Object was put in S3\",\n+                                \"name\": \"s3.key\"\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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"el-rest-fetch-index\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n+                            {\n+                                \"description\": \"The S3 content type of the S3 Object that put in S3\",\n+                                \"name\": \"s3.contenttype\"\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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"el-rest-type\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n+                            {\n+                                \"description\": \"The version of the S3 Object that was put to S3\",\n+                                \"name\": \"s3.version\"\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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"get-es-attribute-name\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n+                            {\n+                                \"description\": \"The class name of the exception thrown during processor execution\",\n+                                \"name\": \"s3.exception\"\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+                                \"description\": \"The S3 supplied detail from the failed operation\",\n+                                \"name\": \"s3.additionalDetails\"\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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"get-es-id\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            }\n-                        },\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.elasticsearch.JsonQueryElasticsearch\"\n-                        ],\n-                        \"sideEffectFree\": false,\n-                        \"supportedRelationships\": [\n                             {\n-                                \"description\": \"Fetched documents are routed to this relationship.\",\n-                                \"name\": \"document\"\n+                                \"description\": \"The HTTP error code (if available) from the failed operation\",\n+                                \"name\": \"s3.statusCode\"\n                             },\n                             {\n-                                \"description\": \"All flowfiles that fail for reasons unrelated to server availability go to this relationship.\",\n-                                \"name\": \"failure\"\n+                                \"description\": \"The S3 moniker of the failed operation\",\n+                                \"name\": \"s3.errorCode\"\n                             },\n                             {\n-                                \"description\": \"All flowfiles that fail due to server/cluster availability go to this relationship.\",\n-                                \"name\": \"retry\"\n+                                \"description\": \"The S3 exception message from the failed operation\",\n+                                \"name\": \"s3.errorMessage\"\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-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": true,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\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.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-                        \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\",\n-                        \"writesAttributes\": [\n+                                \"description\": \"The ETag of the S3 Object\",\n+                                \"name\": \"s3.etag\"\n+                            },\n                             {\n-                                \"description\": \"The filename attribute is set to the document identifier\",\n-                                \"name\": \"filename\"\n+                                \"description\": \"The content disposition of the S3 Object that put in S3\",\n+                                \"name\": \"s3.contentdisposition\"\n                             },\n                             {\n-                                \"description\": \"The Elasticsearch index containing the document\",\n-                                \"name\": \"elasticsearch.index\"\n+                                \"description\": \"The cache-control header of the S3 Object\",\n+                                \"name\": \"s3.cachecontrol\"\n                             },\n                             {\n-                                \"description\": \"The Elasticsearch document type\",\n-                                \"name\": \"elasticsearch.type\"\n+                                \"description\": \"The uploadId used to upload the Object to S3\",\n+                                \"name\": \"s3.uploadId\"\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\": \"A human-readable form of the expiration date of the S3 object, if one is set\",\n+                                \"name\": \"s3.expiration\"\n+                            },\n+                            {\n+                                \"description\": \"The server side encryption algorithm of the object\",\n+                                \"name\": \"s3.sseAlgorithm\"\n+                            },\n+                            {\n+                                \"description\": \"A human-readable form of the User Metadata of the S3 object, if any was set\",\n+                                \"name\": \"s3.usermetadata\"\n+                            },\n+                            {\n+                                \"description\": \"The name of the encryption strategy, if any was set\",\n+                                \"name\": \"s3.encryptionStrategy\"\n                             }\n                         ]\n                     },\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-elasticsearch-restapi-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-aws-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -32166,916 +39598,508 @@\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                         \"multiProcessorUseCases\": [],\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\": \"Environment variables 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+                            \"AWS Credentials Provider service\": {\n+                                \"description\": \"The Controller Service that is used to obtain AWS credentials provider\",\n+                                \"displayName\": \"AWS Credentials Provider Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"el-rest-client-service\",\n+                                \"name\": \"AWS Credentials Provider service\",\n                                 \"required\": true,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-elasticsearch-client-service-api-nar\",\n+                                    \"artifact\": \"nifi-aws-service-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.elasticsearch.ElasticSearchClientService\",\n+                                    \"type\": \"org.apache.nifi.processors.aws.credentials.provider.service.AWSCredentialsProviderService\",\n                                     \"version\": \"2.0.0-M3\"\n                                 }\n                             },\n-                            \"el-rest-fetch-index\": {\n-                                \"description\": \"The name of the index to use.\",\n-                                \"displayName\": \"Index\",\n+                            \"Bucket\": {\n+                                \"defaultValue\": \"${s3.bucket}\",\n+                                \"description\": \"The S3 Bucket to interact with\",\n+                                \"displayName\": \"Bucket\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"el-rest-fetch-index\",\n+                                \"name\": \"Bucket\",\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+                            \"Communications Timeout\": {\n+                                \"defaultValue\": \"30 secs\",\n+                                \"description\": \"The amount of time to wait in order to establish a connection to AWS or receive data from AWS before timing out.\",\n+                                \"displayName\": \"Communications Timeout\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"el-rest-format-aggregations\",\n+                                \"name\": \"Communications Timeout\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"el-rest-format-hits\": {\n+                            \"Endpoint Override URL\": {\n+                                \"description\": \"Endpoint URL to use instead of the AWS default including scheme, host, port, and path. The AWS libraries select an endpoint URL based on the AWS region, but this property overrides the selected endpoint URL, allowing use with other S3-compatible endpoints.\",\n+                                \"displayName\": \"Endpoint Override URL\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Endpoint Override URL\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Object Key\": {\n+                                \"defaultValue\": \"${filename}\",\n+                                \"description\": \"The S3 Object Key to use. This is analogous to a filename for traditional file systems.\",\n+                                \"displayName\": \"Object Key\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Object Key\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Region\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Contains full Elasticsearch Hit, including Document Source and Metadata.\",\n-                                        \"displayName\": \"FULL\",\n-                                        \"value\": \"FULL\"\n+                                        \"description\": \"AWS Region Code : us-gov-west-1\",\n+                                        \"displayName\": \"AWS GovCloud (US)\",\n+                                        \"value\": \"us-gov-west-1\"\n                                     },\n                                     {\n-                                        \"description\": \"Document Source only (where present).\",\n-                                        \"displayName\": \"SOURCE_ONLY\",\n-                                        \"value\": \"SOURCE_ONLY\"\n+                                        \"description\": \"AWS Region Code : us-gov-east-1\",\n+                                        \"displayName\": \"AWS GovCloud (US-East)\",\n+                                        \"value\": \"us-gov-east-1\"\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\": \"el-rest-format-hits\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"el-rest-output-no-hits\": {\n-                                \"allowableValues\": [\n+                                        \"description\": \"AWS Region Code : us-east-1\",\n+                                        \"displayName\": \"US East (N. Virginia)\",\n+                                        \"value\": \"us-east-1\"\n+                                    },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"description\": \"AWS Region Code : us-east-2\",\n+                                        \"displayName\": \"US East (Ohio)\",\n+                                        \"value\": \"us-east-2\"\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+                                        \"description\": \"AWS Region Code : us-west-1\",\n+                                        \"displayName\": \"US West (N. California)\",\n+                                        \"value\": \"us-west-1\"\n+                                    },\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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"el-rest-query\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"el-rest-query-clause\": {\n-                                \"dependencies\": [\n+                                        \"description\": \"AWS Region Code : us-west-2\",\n+                                        \"displayName\": \"US West (Oregon)\",\n+                                        \"value\": \"us-west-2\"\n+                                    },\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\": \"Environment variables 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+                                        \"description\": \"AWS Region Code : eu-west-1\",\n+                                        \"displayName\": \"EU (Ireland)\",\n+                                        \"value\": \"eu-west-1\"\n+                                    },\n                                     {\n-                                        \"description\": \"Provide the full Query.\",\n-                                        \"displayName\": \"FULL_QUERY\",\n-                                        \"value\": \"full\"\n+                                        \"description\": \"AWS Region Code : eu-west-2\",\n+                                        \"displayName\": \"EU (London)\",\n+                                        \"value\": \"eu-west-2\"\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+                                        \"description\": \"AWS Region Code : eu-west-3\",\n+                                        \"displayName\": \"EU (Paris)\",\n+                                        \"value\": \"eu-west-3\"\n+                                    },\n                                     {\n-                                        \"description\": \"Flowfile per hit.\",\n-                                        \"displayName\": \"PER_HIT\",\n-                                        \"value\": \"splitUp-yes\"\n+                                        \"description\": \"AWS Region Code : eu-central-1\",\n+                                        \"displayName\": \"EU (Frankfurt)\",\n+                                        \"value\": \"eu-central-1\"\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\": \"AWS Region Code : eu-central-2\",\n+                                        \"displayName\": \"EU (Zurich)\",\n+                                        \"value\": \"eu-central-2\"\n+                                    },\n                                     {\n-                                        \"description\": \"Flowfile per hit.\",\n-                                        \"displayName\": \"PER_HIT\",\n-                                        \"value\": \"splitUp-yes\"\n+                                        \"description\": \"AWS Region Code : eu-north-1\",\n+                                        \"displayName\": \"EU (Stockholm)\",\n+                                        \"value\": \"eu-north-1\"\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\": \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"el-rest-type\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"es-rest-query-aggs\": {\n-                                \"dependencies\": [\n+                                        \"description\": \"AWS Region Code : eu-south-1\",\n+                                        \"displayName\": \"EU (Milan)\",\n+                                        \"value\": \"eu-south-1\"\n+                                    },\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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"es-rest-query-aggs\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"es-rest-query-fields\": {\n-                                \"dependencies\": [\n+                                        \"description\": \"AWS Region Code : eu-south-2\",\n+                                        \"displayName\": \"EU (Spain)\",\n+                                        \"value\": \"eu-south-2\"\n+                                    },\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\": \"Environment variables 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+                                        \"description\": \"AWS Region Code : ap-east-1\",\n+                                        \"displayName\": \"Asia Pacific (Hong Kong)\",\n+                                        \"value\": \"ap-east-1\"\n+                                    },\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\": \"Environment variables 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+                                        \"description\": \"AWS Region Code : ap-south-1\",\n+                                        \"displayName\": \"Asia Pacific (Mumbai)\",\n+                                        \"value\": \"ap-south-1\"\n+                                    },\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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"es-rest-query-sort\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"es-rest-size\": {\n-                                \"dependencies\": [\n+                                        \"description\": \"AWS Region Code : ap-south-2\",\n+                                        \"displayName\": \"Asia Pacific (Hyderabad)\",\n+                                        \"value\": \"ap-south-2\"\n+                                    },\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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"es-rest-size\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            }\n-                        },\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.elasticsearch.PaginatedJsonQueryElasticsearch\"\n-                        ],\n-                        \"sideEffectFree\": false,\n-                        \"supportedRelationships\": [\n-                            {\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-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": true,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"elasticsearch\",\n-                            \"elasticsearch5\",\n-                            \"elasticsearch6\",\n-                            \"elasticsearch7\",\n-                            \"elasticsearch8\",\n-                            \"get\",\n-                            \"json\",\n-                            \"query\",\n-                            \"read\"\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-                        \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\",\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\": true,\n-                        \"artifact\": \"nifi-elasticsearch-restapi-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"f2215c6\"\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\": \"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-                        \"multiProcessorUseCases\": [],\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\": \"Environment variables 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\": \"2.0.0-M3\"\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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"el-rest-fetch-index\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"el-rest-format-aggregations\": {\n-                                \"allowableValues\": [\n+                                        \"description\": \"AWS Region Code : ap-southeast-1\",\n+                                        \"displayName\": \"Asia Pacific (Singapore)\",\n+                                        \"value\": \"ap-southeast-1\"\n+                                    },\n                                     {\n-                                        \"description\": \"Contains full Elasticsearch Aggregation, including Buckets and Metadata.\",\n-                                        \"displayName\": \"FULL\",\n-                                        \"value\": \"FULL\"\n+                                        \"description\": \"AWS Region Code : ap-southeast-2\",\n+                                        \"displayName\": \"Asia Pacific (Sydney)\",\n+                                        \"value\": \"ap-southeast-2\"\n                                     },\n                                     {\n-                                        \"description\": \"Bucket Content only.\",\n-                                        \"displayName\": \"BUCKETS_ONLY\",\n-                                        \"value\": \"BUCKETS_ONLY\"\n+                                        \"description\": \"AWS Region Code : ap-southeast-3\",\n+                                        \"displayName\": \"Asia Pacific (Jakarta)\",\n+                                        \"value\": \"ap-southeast-3\"\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+                                        \"description\": \"AWS Region Code : ap-southeast-4\",\n+                                        \"displayName\": \"Asia Pacific (Melbourne)\",\n+                                        \"value\": \"ap-southeast-4\"\n+                                    },\n                                     {\n-                                        \"description\": \"Contains full Elasticsearch Hit, including Document Source and Metadata.\",\n-                                        \"displayName\": \"FULL\",\n-                                        \"value\": \"FULL\"\n+                                        \"description\": \"AWS Region Code : ap-northeast-1\",\n+                                        \"displayName\": \"Asia Pacific (Tokyo)\",\n+                                        \"value\": \"ap-northeast-1\"\n                                     },\n                                     {\n-                                        \"description\": \"Document Source only (where present).\",\n-                                        \"displayName\": \"SOURCE_ONLY\",\n-                                        \"value\": \"SOURCE_ONLY\"\n+                                        \"description\": \"AWS Region Code : ap-northeast-2\",\n+                                        \"displayName\": \"Asia Pacific (Seoul)\",\n+                                        \"value\": \"ap-northeast-2\"\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\": \"el-rest-format-hits\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"el-rest-output-no-hits\": {\n-                                \"allowableValues\": [\n+                                        \"description\": \"AWS Region Code : ap-northeast-3\",\n+                                        \"displayName\": \"Asia Pacific (Osaka)\",\n+                                        \"value\": \"ap-northeast-3\"\n+                                    },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"description\": \"AWS Region Code : sa-east-1\",\n+                                        \"displayName\": \"South America (Sao Paulo)\",\n+                                        \"value\": \"sa-east-1\"\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+                                        \"description\": \"AWS Region Code : cn-north-1\",\n+                                        \"displayName\": \"China (Beijing)\",\n+                                        \"value\": \"cn-north-1\"\n+                                    },\n                                     {\n-                                        \"description\": \"Use Elasticsearch \\\"_scroll\\\" API to page results. Does not accept additional query parameters.\",\n-                                        \"displayName\": \"SCROLL\",\n-                                        \"value\": \"pagination-scroll\"\n+                                        \"description\": \"AWS Region Code : cn-northwest-1\",\n+                                        \"displayName\": \"China (Ningxia)\",\n+                                        \"value\": \"cn-northwest-1\"\n                                     },\n                                     {\n-                                        \"description\": \"Use Elasticsearch \\\"search_after\\\" _search API to page sorted results.\",\n-                                        \"displayName\": \"SEARCH_AFTER\",\n-                                        \"value\": \"pagination-search_after\"\n+                                        \"description\": \"AWS Region Code : ca-central-1\",\n+                                        \"displayName\": \"Canada (Central)\",\n+                                        \"value\": \"ca-central-1\"\n                                     },\n                                     {\n-                                        \"description\": \"Use Elasticsearch (7.10+ with XPack) \\\"point in time\\\" _search API to page sorted results. Not available for use with AWS OpenSearch.\",\n-                                        \"displayName\": \"POINT_IN_TIME\",\n-                                        \"value\": \"pagination-pit\"\n+                                        \"description\": \"AWS Region Code : ca-west-1\",\n+                                        \"displayName\": \"Canada West (Calgary)\",\n+                                        \"value\": \"ca-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : me-central-1\",\n+                                        \"displayName\": \"Middle East (UAE)\",\n+                                        \"value\": \"me-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : me-south-1\",\n+                                        \"displayName\": \"Middle East (Bahrain)\",\n+                                        \"value\": \"me-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : af-south-1\",\n+                                        \"displayName\": \"Africa (Cape Town)\",\n+                                        \"value\": \"af-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-iso-east-1\",\n+                                        \"displayName\": \"US ISO East\",\n+                                        \"value\": \"us-iso-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-isob-east-1\",\n+                                        \"displayName\": \"US ISOB East (Ohio)\",\n+                                        \"value\": \"us-isob-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-iso-west-1\",\n+                                        \"displayName\": \"US ISO West\",\n+                                        \"value\": \"us-iso-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : il-central-1\",\n+                                        \"displayName\": \"Israel (Tel Aviv)\",\n+                                        \"value\": \"il-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Uses 's3.region' FlowFile attribute as region.\",\n+                                        \"displayName\": \"Use 's3.region' Attribute\",\n+                                        \"value\": \"attribute-defined-region\"\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+                                \"defaultValue\": \"us-west-2\",\n+                                \"description\": \"The AWS Region to connect to.\",\n+                                \"displayName\": \"Region\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"el-rest-pagination-type\",\n+                                \"name\": \"Region\",\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\": \"Environment variables 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+                            \"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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"el-rest-query-clause\",\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\": \"2.0.0-M3\"\n+                                }\n                             },\n-                            \"el-rest-query-definition-style\": {\n+                            \"Signer Override\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Provide the full Query.\",\n-                                        \"displayName\": \"FULL_QUERY\",\n-                                        \"value\": \"full\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Default Signature\",\n+                                        \"value\": \"Default Signature\"\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+                                        \"description\": \"\",\n+                                        \"displayName\": \"Signature Version 4\",\n+                                        \"value\": \"AWSS3V4SignerType\"\n+                                    },\n                                     {\n-                                        \"description\": \"Flowfile per hit.\",\n-                                        \"displayName\": \"PER_HIT\",\n-                                        \"value\": \"splitUp-yes\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Signature Version 2\",\n+                                        \"value\": \"S3SignerType\"\n                                     },\n                                     {\n-                                        \"description\": \"Flowfile per response.\",\n-                                        \"displayName\": \"PER_RESPONSE\",\n-                                        \"value\": \"splitUp-no\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Custom Signature\",\n+                                        \"value\": \"CustomSignerType\"\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+                                \"defaultValue\": \"Default Signature\",\n+                                \"description\": \"The AWS S3 library uses Signature Version 4 by default but this property allows you to specify the Version 2 signer to support older S3-compatible services or even to plug in your own custom signer implementation.\",\n+                                \"displayName\": \"Signer Override\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"el-rest-split-up-aggregations\",\n-                                \"required\": true,\n+                                \"name\": \"Signer Override\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"el-rest-split-up-hits\": {\n+                            \"append-tag\": {\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\": \"true\",\n+                                \"description\": \"If set to true, the tag will be appended to the existing set of tags on the S3 object. Any existing tags with the same key as the new tag will be updated with the specified value. If set to false, the existing tags will be removed and the new tag will be set on the S3 object.\",\n+                                \"displayName\": \"Append Tag\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"el-rest-split-up-hits\",\n+                                \"name\": \"append-tag\",\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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"el-rest-type\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"es-rest-query-aggs\": {\n+                            \"custom-signer-class-name\": {\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"build\"\n+                                            \"CustomSignerType\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Query Definition Style\",\n-                                        \"propertyName\": \"el-rest-query-definition-style\"\n+                                        \"propertyDisplayName\": \"Signer Override\",\n+                                        \"propertyName\": \"Signer Override\"\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+                                \"description\": \"Fully qualified class name of the custom signer class. The signer must implement com.amazonaws.auth.Signer interface.\",\n+                                \"displayName\": \"Custom Signer Class Name\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"es-rest-query-aggs\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"custom-signer-class-name\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"es-rest-query-fields\": {\n+                            \"custom-signer-module-location\": {\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"build\"\n+                                            \"CustomSignerType\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Query Definition Style\",\n-                                        \"propertyName\": \"el-rest-query-definition-style\"\n+                                        \"propertyDisplayName\": \"Signer Override\",\n+                                        \"propertyName\": \"Signer Override\"\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+                                \"description\": \"Comma-separated list of paths to files and/or directories which contain the custom signer's JAR file and its dependencies (if any).\",\n+                                \"displayName\": \"Custom Signer Module Location\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"es-rest-query-fields\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"custom-signer-module-location\",\n                                 \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"MULTIPLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\",\n+                                        \"DIRECTORY\"\n+                                    ]\n+                                },\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+                            \"proxy-configuration-service\": {\n+                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests.\",\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\": \"2.0.0-M3\"\n+                                }\n+                            },\n+                            \"tag-key\": {\n+                                \"description\": \"The key of the tag that will be set on the S3 Object\",\n+                                \"displayName\": \"Tag Key\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"es-rest-query-script-fields\",\n-                                \"required\": false,\n+                                \"name\": \"tag-key\",\n+                                \"required\": true,\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+                            \"tag-value\": {\n+                                \"description\": \"The value of the tag that will be set on the S3 Object\",\n+                                \"displayName\": \"Tag Value\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"es-rest-query-sort\",\n-                                \"required\": false,\n+                                \"name\": \"tag-value\",\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+                            \"version\": {\n+                                \"description\": \"The Version of the Object to tag\",\n+                                \"displayName\": \"Version ID\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"es-rest-size\",\n+                                \"name\": \"version\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             }\n                         },\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.aws.s3.FetchS3Object\",\n+                            \"org.apache.nifi.processors.aws.s3.ListS3\",\n+                            \"org.apache.nifi.processors.aws.s3.PutS3Object\"\n                         ],\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"Aggregations are routed to this relationship.\",\n-                                \"name\": \"aggregations\"\n+                                \"description\": \"FlowFiles are routed to this Relationship after they have been successfully processed.\",\n+                                \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"All flowfiles that fail for reasons unrelated to server availability go to this relationship.\",\n+                                \"description\": \"If the Processor is unable to process a given FlowFile, it 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                         ],\n-                        \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": true,\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": 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-                            \"elasticsearch\",\n-                            \"elasticsearch5\",\n-                            \"elasticsearch6\",\n-                            \"elasticsearch7\",\n-                            \"elasticsearch8\",\n-                            \"json\",\n-                            \"page\",\n-                            \"query\",\n-                            \"read\",\n-                            \"scroll\"\n+                            \"AWS\",\n+                            \"Amazon\",\n+                            \"Archive\",\n+                            \"S3\",\n+                            \"Tag\"\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.aws.s3.TagS3Object\",\n+                        \"typeDescription\": \"Adds or updates a tag on an Amazon S3 Object.\",\n                         \"useCases\": [],\n                         \"version\": \"2.0.0-M3\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"application/json\",\n-                                \"name\": \"mime.type\"\n+                                \"description\": \"The tags associated with the S3 object will be written as part of the FlowFile attributes\",\n+                                \"name\": \"s3.tag.___\"\n                             },\n                             {\n-                                \"description\": \"The name of the aggregation whose results are in the output flowfile\",\n-                                \"name\": \"aggregation.name\"\n+                                \"description\": \"The class name of the exception thrown during processor execution\",\n+                                \"name\": \"s3.exception\"\n                             },\n                             {\n-                                \"description\": \"The number of the aggregation whose results are in the output flowfile\",\n-                                \"name\": \"aggregation.number\"\n+                                \"description\": \"The S3 supplied detail from the failed operation\",\n+                                \"name\": \"s3.additionalDetails\"\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 HTTP error code (if available) from the failed operation\",\n+                                \"name\": \"s3.statusCode\"\n                             },\n                             {\n-                                \"description\": \"The number of hits that are in the output flowfile\",\n-                                \"name\": \"hit.count\"\n+                                \"description\": \"The S3 moniker of the failed operation\",\n+                                \"name\": \"s3.errorCode\"\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 S3 exception message from the failed operation\",\n+                                \"name\": \"s3.errorMessage\"\n                             }\n                         ]\n                     },\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-elasticsearch-restapi-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-aws-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -33085,294 +40109,427 @@\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-                            {\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+                                \"description\": \"User specified dynamic Properties are added as attributes to the notification\",\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\": \"A name of an attribute to be added to the notification\",\n+                                \"value\": \"The attribute value\"\n                             }\n                         ],\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"multiProcessorUseCases\": [],\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+                            \"ARN Type\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"The ARN is the name of a topic\",\n+                                        \"displayName\": \"Topic ARN\",\n+                                        \"value\": \"Topic ARN\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The ARN is the name of a particular Target, used to notify a specific subscriber\",\n+                                        \"displayName\": \"Target ARN\",\n+                                        \"value\": \"Target ARN\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"Topic ARN\",\n+                                \"description\": \"The type of Amazon Resource Name that is being used.\",\n+                                \"displayName\": \"ARN Type\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"el-rest-client-service\",\n+                                \"name\": \"ARN Type\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"AWS Credentials Provider service\": {\n+                                \"description\": \"The Controller Service that is used to obtain AWS credentials provider\",\n+                                \"displayName\": \"AWS Credentials Provider Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"AWS Credentials Provider service\",\n                                 \"required\": true,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-elasticsearch-client-service-api-nar\",\n+                                    \"artifact\": \"nifi-aws-service-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.elasticsearch.ElasticSearchClientService\",\n+                                    \"type\": \"org.apache.nifi.processors.aws.credentials.provider.service.AWSCredentialsProviderService\",\n                                     \"version\": \"2.0.0-M3\"\n                                 }\n                             },\n-                            \"el-rest-fetch-index\": {\n-                                \"description\": \"The name of the index to use.\",\n-                                \"displayName\": \"Index\",\n+                            \"Amazon Resource Name (ARN)\": {\n+                                \"description\": \"The name of the resource to which notifications should be published\",\n+                                \"displayName\": \"Amazon Resource Name (ARN)\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"el-rest-fetch-index\",\n+                                \"name\": \"Amazon Resource Name (ARN)\",\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+                            \"Character Set\": {\n+                                \"defaultValue\": \"UTF-8\",\n+                                \"description\": \"The character set in which the FlowFile's content is encoded\",\n+                                \"displayName\": \"Character Set\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"el-rest-type\",\n-                                \"required\": false,\n+                                \"name\": \"Character Set\",\n+                                \"required\": true,\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+                            \"Communications Timeout\": {\n+                                \"defaultValue\": \"30 secs\",\n+                                \"description\": \"\",\n+                                \"displayName\": \"Communications Timeout\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"put-es-json-charset\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Communications Timeout\",\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+                            \"Deduplication Message ID\": {\n+                                \"description\": \"The token used for deduplication of sent messages\",\n+                                \"displayName\": \"Deduplication Message ID\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"put-es-json-dynamic_templates\",\n+                                \"name\": \"Deduplication Message ID\",\n                                 \"required\": false,\n                                 \"sensitive\": false\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+                            \"E-mail Subject\": {\n+                                \"description\": \"The optional subject to use for any subscribers that are subscribed via E-mail\",\n+                                \"displayName\": \"E-mail Subject\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"put-es-json-id-attr\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"E-mail Subject\",\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+                            \"Message Group ID\": {\n+                                \"description\": \"If using FIFO, the message group to which the flowFile belongs\",\n+                                \"displayName\": \"Message Group ID\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"put-es-json-script\",\n+                                \"name\": \"Message Group ID\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"put-es-json-scripted-upsert\": {\n+                            \"Region\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"description\": \"AWS Region Code : us-gov-east-1\",\n+                                        \"displayName\": \"AWS GovCloud (US-East)\",\n+                                        \"value\": \"us-gov-east-1\"\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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"put-es-json-scripted-upsert\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"put-es-not_found-is-error\": {\n-                                \"allowableValues\": [\n+                                        \"description\": \"AWS Region Code : us-gov-west-1\",\n+                                        \"displayName\": \"AWS GovCloud (US-West)\",\n+                                        \"value\": \"us-gov-west-1\"\n+                                    },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"description\": \"AWS Region Code : af-south-1\",\n+                                        \"displayName\": \"Africa (Cape Town)\",\n+                                        \"value\": \"af-south-1\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"If true, \\\"not_found\\\" Elasticsearch Document associated Records will be routed to the \\\"successful\\\" 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-not_found-is-error\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"put-es-output-error-responses\": {\n-                                \"allowableValues\": [\n+                                        \"description\": \"AWS Region Code : ap-east-1\",\n+                                        \"displayName\": \"Asia Pacific (Hong Kong)\",\n+                                        \"value\": \"ap-east-1\"\n+                                    },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"description\": \"AWS Region Code : ap-south-2\",\n+                                        \"displayName\": \"Asia Pacific (Hyderabad)\",\n+                                        \"value\": \"ap-south-2\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"description\": \"AWS Region Code : ap-southeast-3\",\n+                                        \"displayName\": \"Asia Pacific (Jakarta)\",\n+                                        \"value\": \"ap-southeast-3\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-southeast-4\",\n+                                        \"displayName\": \"Asia Pacific (Melbourne)\",\n+                                        \"value\": \"ap-southeast-4\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-south-1\",\n+                                        \"displayName\": \"Asia Pacific (Mumbai)\",\n+                                        \"value\": \"ap-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-northeast-3\",\n+                                        \"displayName\": \"Asia Pacific (Osaka)\",\n+                                        \"value\": \"ap-northeast-3\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-northeast-2\",\n+                                        \"displayName\": \"Asia Pacific (Seoul)\",\n+                                        \"value\": \"ap-northeast-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-southeast-1\",\n+                                        \"displayName\": \"Asia Pacific (Singapore)\",\n+                                        \"value\": \"ap-southeast-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-southeast-2\",\n+                                        \"displayName\": \"Asia Pacific (Sydney)\",\n+                                        \"value\": \"ap-southeast-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-northeast-1\",\n+                                        \"displayName\": \"Asia Pacific (Tokyo)\",\n+                                        \"value\": \"ap-northeast-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ca-central-1\",\n+                                        \"displayName\": \"Canada (Central)\",\n+                                        \"value\": \"ca-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ca-west-1\",\n+                                        \"displayName\": \"Canada West (Calgary)\",\n+                                        \"value\": \"ca-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : cn-north-1\",\n+                                        \"displayName\": \"China (Beijing)\",\n+                                        \"value\": \"cn-north-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : cn-northwest-1\",\n+                                        \"displayName\": \"China (Ningxia)\",\n+                                        \"value\": \"cn-northwest-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-central-1\",\n+                                        \"displayName\": \"Europe (Frankfurt)\",\n+                                        \"value\": \"eu-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-west-1\",\n+                                        \"displayName\": \"Europe (Ireland)\",\n+                                        \"value\": \"eu-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-west-2\",\n+                                        \"displayName\": \"Europe (London)\",\n+                                        \"value\": \"eu-west-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-south-1\",\n+                                        \"displayName\": \"Europe (Milan)\",\n+                                        \"value\": \"eu-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-west-3\",\n+                                        \"displayName\": \"Europe (Paris)\",\n+                                        \"value\": \"eu-west-3\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-south-2\",\n+                                        \"displayName\": \"Europe (Spain)\",\n+                                        \"value\": \"eu-south-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-north-1\",\n+                                        \"displayName\": \"Europe (Stockholm)\",\n+                                        \"value\": \"eu-north-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-central-2\",\n+                                        \"displayName\": \"Europe (Zurich)\",\n+                                        \"value\": \"eu-central-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : il-central-1\",\n+                                        \"displayName\": \"Israel (Tel Aviv)\",\n+                                        \"value\": \"il-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : me-south-1\",\n+                                        \"displayName\": \"Middle East (Bahrain)\",\n+                                        \"value\": \"me-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : me-central-1\",\n+                                        \"displayName\": \"Middle East (UAE)\",\n+                                        \"value\": \"me-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : sa-east-1\",\n+                                        \"displayName\": \"South America (Sao Paulo)\",\n+                                        \"value\": \"sa-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-east-1\",\n+                                        \"displayName\": \"US East (N. Virginia)\",\n+                                        \"value\": \"us-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-east-2\",\n+                                        \"displayName\": \"US East (Ohio)\",\n+                                        \"value\": \"us-east-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-iso-east-1\",\n+                                        \"displayName\": \"US ISO East\",\n+                                        \"value\": \"us-iso-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-iso-west-1\",\n+                                        \"displayName\": \"US ISO WEST\",\n+                                        \"value\": \"us-iso-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-isob-east-1\",\n+                                        \"displayName\": \"US ISOB East (Ohio)\",\n+                                        \"value\": \"us-isob-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-west-1\",\n+                                        \"displayName\": \"US West (N. California)\",\n+                                        \"value\": \"us-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-west-2\",\n+                                        \"displayName\": \"US West (Oregon)\",\n+                                        \"value\": \"us-west-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-cn-global\",\n+                                        \"displayName\": \"aws-cn-global\",\n+                                        \"value\": \"aws-cn-global\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-global\",\n+                                        \"displayName\": \"aws-global\",\n+                                        \"value\": \"aws-global\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-iso-b-global\",\n+                                        \"displayName\": \"aws-iso-b-global\",\n+                                        \"value\": \"aws-iso-b-global\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-iso-global\",\n+                                        \"displayName\": \"aws-iso-global\",\n+                                        \"value\": \"aws-iso-global\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-us-gov-global\",\n+                                        \"displayName\": \"aws-us-gov-global\",\n+                                        \"value\": \"aws-us-gov-global\"\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 \\\"successful\\\" or \\\"errors\\\" relationships\",\n-                                \"displayName\": \"Output Error Responses\",\n+                                \"defaultValue\": \"us-west-2\",\n+                                \"description\": \"\",\n+                                \"displayName\": \"Region\",\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-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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"put-es-record-batch-size\",\n+                                \"name\": \"Region\",\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+                            \"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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"put-es-record-index-op\",\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\": \"2.0.0-M3\"\n+                                }\n                             },\n-                            \"put-es-record-log-error-responses\": {\n+                            \"Use JSON Structure\": {\n                                 \"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+                                \"description\": \"If true, the contents of the FlowFile must be JSON with a top-level element named 'default'. Additional elements can be used to send different messages to different protocols. See the Amazon SNS Documentation for more information.\",\n+                                \"displayName\": \"Use JSON Structure\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"put-es-record-log-error-responses\",\n-                                \"required\": false,\n+                                \"name\": \"Use JSON Structure\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n                         \"seeAlso\": [\n-                            \"org.apache.nifi.processors.elasticsearch.PutElasticsearchRecord\"\n+                            \"org.apache.nifi.processors.aws.sqs.GetSQS\",\n+                            \"org.apache.nifi.processors.aws.sqs.PutSQS\"\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\": \"Record(s)/Flowfile(s) corresponding to Elasticsearch document(s) that resulted in an \\\"error\\\" (within Elasticsearch) will be routed here.\",\n-                                \"name\": \"errors\"\n-                            },\n-                            {\n-                                \"description\": \"Record(s)/Flowfile(s) corresponding to Elasticsearch document(s) that did not result in an \\\"error\\\" (within Elasticsearch) will be routed here.\",\n-                                \"name\": \"successful\"\n-                            },\n-                            {\n-                                \"description\": \"All flowfiles that are sent to Elasticsearch without request failures go to this relationship.\",\n-                                \"name\": \"original\"\n+                                \"description\": \"FlowFiles are routed to success relationship\",\n+                                \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"All flowfiles that fail for reasons unrelated to server availability go to this relationship.\",\n+                                \"description\": \"FlowFiles are routed to failure 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                         \"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+                            \"amazon\",\n+                            \"aws\",\n+                            \"publish\",\n+                            \"pubsub\",\n+                            \"put\",\n+                            \"sns\",\n+                            \"topic\"\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.aws.sns.PutSNS\",\n+                        \"typeDescription\": \"Sends the content of a FlowFile as a notification to the Amazon Simple Notification Service\",\n                         \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\",\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-                            },\n-                            {\n-                                \"description\": \"The _bulk response if there was an error during processing the document within Elasticsearch.\",\n-                                \"name\": \"elasticsearch.bulk.error\"\n-                            }\n-                        ]\n+                        \"version\": \"2.0.0-M3\"\n                     },\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-elasticsearch-restapi-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-aws-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -33380,1184 +40537,369 @@\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-                            {\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                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"multiProcessorUseCases\": [],\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+                            \"AWS Credentials Provider service\": {\n+                                \"description\": \"The Controller Service that is used to obtain AWS credentials provider\",\n+                                \"displayName\": \"AWS Credentials Provider Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"el-rest-client-service\",\n+                                \"name\": \"AWS Credentials Provider service\",\n                                 \"required\": true,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-elasticsearch-client-service-api-nar\",\n+                                    \"artifact\": \"nifi-aws-service-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.elasticsearch.ElasticSearchClientService\",\n+                                    \"type\": \"org.apache.nifi.processors.aws.credentials.provider.service.AWSCredentialsProviderService\",\n                                     \"version\": \"2.0.0-M3\"\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\": \"Environment variables 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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"el-rest-type\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"put-es-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\": \"If true, \\\"not_found\\\" Elasticsearch Document associated Records will be routed to the \\\"successful\\\" 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-not_found-is-error\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\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\": \"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 \\\"successful\\\" or \\\"errors\\\" relationships\",\n-                                \"displayName\": \"Output Error Responses\",\n+                            \"Communications Timeout\": {\n+                                \"defaultValue\": \"30 secs\",\n+                                \"description\": \"\",\n+                                \"displayName\": \"Communications Timeout\",\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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"put-es-record-at-timestamp\",\n-                                \"required\": false,\n+                                \"name\": \"Communications Timeout\",\n+                                \"required\": true,\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+                            \"Endpoint Override URL\": {\n+                                \"description\": \"Endpoint URL to use instead of the AWS default including scheme, host, port, and path. The AWS libraries select an endpoint URL based on the AWS region, but this property overrides the selected endpoint URL, allowing use with other S3-compatible endpoints.\",\n+                                \"displayName\": \"Endpoint Override URL\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"put-es-record-at-timestamp-date-format\",\n+                                \"name\": \"Endpoint Override URL\",\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+                            \"Queue URL\": {\n+                                \"description\": \"The URL of the queue delete from\",\n+                                \"displayName\": \"Queue URL\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"put-es-record-at-timestamp-path\",\n-                                \"required\": false,\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"put-es-record-at-timestamp-time-format\",\n-                                \"required\": false,\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"put-es-record-at-timestamp-timestamp-format\",\n-                                \"required\": false,\n+                                \"name\": \"Queue URL\",\n+                                \"required\": true,\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+                            \"Receipt Handle\": {\n+                                \"defaultValue\": \"${sqs.receipt.handle}\",\n+                                \"description\": \"The identifier that specifies the receipt of the message\",\n+                                \"displayName\": \"Receipt Handle\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"put-es-record-batch-size\",\n+                                \"name\": \"Receipt Handle\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"put-es-record-bulk-error-groups\": {\n+                            \"Region\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"description\": \"AWS Region Code : us-gov-east-1\",\n+                                        \"displayName\": \"AWS GovCloud (US-East)\",\n+                                        \"value\": \"us-gov-east-1\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"dependencies\": [\n+                                        \"description\": \"AWS Region Code : us-gov-west-1\",\n+                                        \"displayName\": \"AWS GovCloud (US-West)\",\n+                                        \"value\": \"us-gov-west-1\"\n+                                    },\n                                     {\n-                                        \"propertyDisplayName\": \"Result Record Writer\",\n-                                        \"propertyName\": \"put-es-record-error-writer\"\n-                                    }\n-                                ],\n-                                \"description\": \"The errored 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\": \"Environment variables 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\": \"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\\\" relationship.\",\n-                                \"displayName\": \"Result Record Writer\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"put-es-record-error-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\": \"2.0.0-M3\"\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\": \"Environment variables 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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"put-es-record-index-op\",\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\": \"Environment variables 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\": \"Environment variables 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-                                \"allowableValues\": [\n+                                        \"description\": \"AWS Region Code : af-south-1\",\n+                                        \"displayName\": \"Africa (Cape Town)\",\n+                                        \"value\": \"af-south-1\"\n+                                    },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"description\": \"AWS Region Code : ap-east-1\",\n+                                        \"displayName\": \"Asia Pacific (Hong Kong)\",\n+                                        \"value\": \"ap-east-1\"\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-                                \"required\": false,\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"put-es-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\": \"2.0.0-M3\"\n-                                }\n-                            },\n-                            \"put-es-record-retain-at-timestamp-field\": {\n-                                \"allowableValues\": [\n+                                        \"description\": \"AWS Region Code : ap-south-2\",\n+                                        \"displayName\": \"Asia Pacific (Hyderabad)\",\n+                                        \"value\": \"ap-south-2\"\n+                                    },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"description\": \"AWS Region Code : ap-southeast-3\",\n+                                        \"displayName\": \"Asia Pacific (Jakarta)\",\n+                                        \"value\": \"ap-southeast-3\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"dependencies\": [\n+                                        \"description\": \"AWS Region Code : ap-southeast-4\",\n+                                        \"displayName\": \"Asia Pacific (Melbourne)\",\n+                                        \"value\": \"ap-southeast-4\"\n+                                    },\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\": \"Environment variables 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+                                        \"description\": \"AWS Region Code : ap-south-1\",\n+                                        \"displayName\": \"Asia Pacific (Mumbai)\",\n+                                        \"value\": \"ap-south-1\"\n+                                    },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"description\": \"AWS Region Code : ap-northeast-3\",\n+                                        \"displayName\": \"Asia Pacific (Osaka)\",\n+                                        \"value\": \"ap-northeast-3\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"dependencies\": [\n+                                        \"description\": \"AWS Region Code : ap-northeast-2\",\n+                                        \"displayName\": \"Asia Pacific (Seoul)\",\n+                                        \"value\": \"ap-northeast-2\"\n+                                    },\n                                     {\n-                                        \"propertyDisplayName\": \"ID Record Path\",\n-                                        \"propertyName\": \"put-es-record-id-path\"\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\": \"Environment variables 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\": \"Environment variables 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\": \"Environment variables 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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"put-es-record-type-record-path\",\n-                                \"required\": false,\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\": \"Record(s)/Flowfile(s) corresponding to Elasticsearch document(s) that did not result in an \\\"error\\\" (within Elasticsearch) will be routed here.\",\n-                                \"name\": \"successful\"\n-                            },\n-                            {\n-                                \"description\": \"Record(s)/Flowfile(s) corresponding to Elasticsearch document(s) that resulted in an \\\"error\\\" (within Elasticsearch) will be routed here.\",\n-                                \"name\": \"errors\"\n-                            },\n-                            {\n-                                \"description\": \"All flowfiles that are sent to Elasticsearch without request failures go to this relationship.\",\n-                                \"name\": \"original\"\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\": true,\n-                        \"supportsDynamicRelationships\": 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-                        ],\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-                        \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\",\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-                    },\n-                    {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-elasticsearch-restapi-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"f2215c6\"\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-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\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-                        \"multiProcessorUseCases\": [],\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables 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\": \"2.0.0-M3\"\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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"el-rest-fetch-index\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"el-rest-format-aggregations\": {\n-                                \"allowableValues\": [\n+                                        \"description\": \"AWS Region Code : ap-southeast-1\",\n+                                        \"displayName\": \"Asia Pacific (Singapore)\",\n+                                        \"value\": \"ap-southeast-1\"\n+                                    },\n                                     {\n-                                        \"description\": \"Contains full Elasticsearch Aggregation, including Buckets and Metadata.\",\n-                                        \"displayName\": \"FULL\",\n-                                        \"value\": \"FULL\"\n+                                        \"description\": \"AWS Region Code : ap-southeast-2\",\n+                                        \"displayName\": \"Asia Pacific (Sydney)\",\n+                                        \"value\": \"ap-southeast-2\"\n                                     },\n                                     {\n-                                        \"description\": \"Bucket Content only.\",\n-                                        \"displayName\": \"BUCKETS_ONLY\",\n-                                        \"value\": \"BUCKETS_ONLY\"\n+                                        \"description\": \"AWS Region Code : ap-northeast-1\",\n+                                        \"displayName\": \"Asia Pacific (Tokyo)\",\n+                                        \"value\": \"ap-northeast-1\"\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+                                        \"description\": \"AWS Region Code : ca-central-1\",\n+                                        \"displayName\": \"Canada (Central)\",\n+                                        \"value\": \"ca-central-1\"\n+                                    },\n                                     {\n-                                        \"description\": \"Contains full Elasticsearch Hit, including Document Source and Metadata.\",\n-                                        \"displayName\": \"FULL\",\n-                                        \"value\": \"FULL\"\n+                                        \"description\": \"AWS Region Code : ca-west-1\",\n+                                        \"displayName\": \"Canada West (Calgary)\",\n+                                        \"value\": \"ca-west-1\"\n                                     },\n                                     {\n-                                        \"description\": \"Document Source only (where present).\",\n-                                        \"displayName\": \"SOURCE_ONLY\",\n-                                        \"value\": \"SOURCE_ONLY\"\n+                                        \"description\": \"AWS Region Code : cn-north-1\",\n+                                        \"displayName\": \"China (Beijing)\",\n+                                        \"value\": \"cn-north-1\"\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\": \"el-rest-format-hits\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"el-rest-output-no-hits\": {\n-                                \"allowableValues\": [\n+                                        \"description\": \"AWS Region Code : cn-northwest-1\",\n+                                        \"displayName\": \"China (Ningxia)\",\n+                                        \"value\": \"cn-northwest-1\"\n+                                    },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"description\": \"AWS Region Code : eu-central-1\",\n+                                        \"displayName\": \"Europe (Frankfurt)\",\n+                                        \"value\": \"eu-central-1\"\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+                                        \"description\": \"AWS Region Code : eu-west-1\",\n+                                        \"displayName\": \"Europe (Ireland)\",\n+                                        \"value\": \"eu-west-1\"\n+                                    },\n                                     {\n-                                        \"description\": \"Use Elasticsearch \\\"_scroll\\\" API to page results. Does not accept additional query parameters.\",\n-                                        \"displayName\": \"SCROLL\",\n-                                        \"value\": \"pagination-scroll\"\n+                                        \"description\": \"AWS Region Code : eu-west-2\",\n+                                        \"displayName\": \"Europe (London)\",\n+                                        \"value\": \"eu-west-2\"\n                                     },\n                                     {\n-                                        \"description\": \"Use Elasticsearch \\\"search_after\\\" _search API to page sorted results.\",\n-                                        \"displayName\": \"SEARCH_AFTER\",\n-                                        \"value\": \"pagination-search_after\"\n+                                        \"description\": \"AWS Region Code : eu-south-1\",\n+                                        \"displayName\": \"Europe (Milan)\",\n+                                        \"value\": \"eu-south-1\"\n                                     },\n                                     {\n-                                        \"description\": \"Use Elasticsearch (7.10+ with XPack) \\\"point in time\\\" _search API to page sorted results. Not available for use with AWS OpenSearch.\",\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+                                        \"description\": \"AWS Region Code : eu-west-3\",\n+                                        \"displayName\": \"Europe (Paris)\",\n+                                        \"value\": \"eu-west-3\"\n+                                    },\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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"el-rest-query\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"el-rest-query-clause\": {\n-                                \"dependencies\": [\n+                                        \"description\": \"AWS Region Code : eu-south-2\",\n+                                        \"displayName\": \"Europe (Spain)\",\n+                                        \"value\": \"eu-south-2\"\n+                                    },\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\": \"Environment variables 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+                                        \"description\": \"AWS Region Code : eu-north-1\",\n+                                        \"displayName\": \"Europe (Stockholm)\",\n+                                        \"value\": \"eu-north-1\"\n+                                    },\n                                     {\n-                                        \"description\": \"Provide the full Query.\",\n-                                        \"displayName\": \"FULL_QUERY\",\n-                                        \"value\": \"full\"\n+                                        \"description\": \"AWS Region Code : eu-central-2\",\n+                                        \"displayName\": \"Europe (Zurich)\",\n+                                        \"value\": \"eu-central-2\"\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+                                        \"description\": \"AWS Region Code : il-central-1\",\n+                                        \"displayName\": \"Israel (Tel Aviv)\",\n+                                        \"value\": \"il-central-1\"\n+                                    },\n                                     {\n-                                        \"description\": \"Flowfile per hit.\",\n-                                        \"displayName\": \"PER_HIT\",\n-                                        \"value\": \"splitUp-yes\"\n+                                        \"description\": \"AWS Region Code : me-south-1\",\n+                                        \"displayName\": \"Middle East (Bahrain)\",\n+                                        \"value\": \"me-south-1\"\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\": \"AWS Region Code : me-central-1\",\n+                                        \"displayName\": \"Middle East (UAE)\",\n+                                        \"value\": \"me-central-1\"\n+                                    },\n                                     {\n-                                        \"description\": \"Flowfile per hit.\",\n-                                        \"displayName\": \"PER_HIT\",\n-                                        \"value\": \"splitUp-yes\"\n+                                        \"description\": \"AWS Region Code : sa-east-1\",\n+                                        \"displayName\": \"South America (Sao Paulo)\",\n+                                        \"value\": \"sa-east-1\"\n                                     },\n                                     {\n-                                        \"description\": \"Flowfile per response.\",\n-                                        \"displayName\": \"PER_RESPONSE\",\n-                                        \"value\": \"splitUp-no\"\n+                                        \"description\": \"AWS Region Code : us-east-1\",\n+                                        \"displayName\": \"US East (N. Virginia)\",\n+                                        \"value\": \"us-east-1\"\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-                                    }\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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"el-rest-type\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"es-rest-query-aggs\": {\n-                                \"dependencies\": [\n+                                        \"description\": \"AWS Region Code : us-east-2\",\n+                                        \"displayName\": \"US East (Ohio)\",\n+                                        \"value\": \"us-east-2\"\n+                                    },\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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"es-rest-query-aggs\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"es-rest-query-fields\": {\n-                                \"dependencies\": [\n+                                        \"description\": \"AWS Region Code : us-iso-east-1\",\n+                                        \"displayName\": \"US ISO East\",\n+                                        \"value\": \"us-iso-east-1\"\n+                                    },\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\": \"Environment variables 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+                                        \"description\": \"AWS Region Code : us-iso-west-1\",\n+                                        \"displayName\": \"US ISO WEST\",\n+                                        \"value\": \"us-iso-west-1\"\n+                                    },\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\": \"Environment variables 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+                                        \"description\": \"AWS Region Code : us-isob-east-1\",\n+                                        \"displayName\": \"US ISOB East (Ohio)\",\n+                                        \"value\": \"us-isob-east-1\"\n+                                    },\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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"es-rest-query-sort\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"es-rest-size\": {\n-                                \"dependencies\": [\n+                                        \"description\": \"AWS Region Code : us-west-1\",\n+                                        \"displayName\": \"US West (N. California)\",\n+                                        \"value\": \"us-west-1\"\n+                                    },\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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"es-rest-size\",\n-                                \"required\": false,\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\": \"Search hits are routed to this relationship.\",\n-                                \"name\": \"hits\"\n-                            },\n-                            {\n-                                \"description\": \"Aggregations are routed to this relationship.\",\n-                                \"name\": \"aggregations\"\n-                            }\n-                        ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": true,\n-                        \"supportsDynamicRelationships\": 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-                            \"elasticsearch\",\n-                            \"elasticsearch5\",\n-                            \"elasticsearch6\",\n-                            \"elasticsearch7\",\n-                            \"elasticsearch8\",\n-                            \"json\",\n-                            \"page\",\n-                            \"query\",\n-                            \"scroll\",\n-                            \"search\"\n-                        ],\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-                        \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\",\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\": true,\n-                        \"artifact\": \"nifi-elasticsearch-restapi-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"f2215c6\"\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\": \"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-                        \"multiProcessorUseCases\": [],\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\": \"Environment variables 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\": \"2.0.0-M3\"\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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"el-rest-fetch-index\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"el-rest-query\": {\n-                                \"dependencies\": [\n+                                        \"description\": \"AWS Region Code : us-west-2\",\n+                                        \"displayName\": \"US West (Oregon)\",\n+                                        \"value\": \"us-west-2\"\n+                                    },\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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"el-rest-query\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"el-rest-query-clause\": {\n-                                \"dependencies\": [\n+                                        \"description\": \"AWS Region Code : aws-cn-global\",\n+                                        \"displayName\": \"aws-cn-global\",\n+                                        \"value\": \"aws-cn-global\"\n+                                    },\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\": \"Environment variables 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+                                        \"description\": \"AWS Region Code : aws-global\",\n+                                        \"displayName\": \"aws-global\",\n+                                        \"value\": \"aws-global\"\n+                                    },\n                                     {\n-                                        \"description\": \"Provide the full Query.\",\n-                                        \"displayName\": \"FULL_QUERY\",\n-                                        \"value\": \"full\"\n+                                        \"description\": \"AWS Region Code : aws-iso-b-global\",\n+                                        \"displayName\": \"aws-iso-b-global\",\n+                                        \"value\": \"aws-iso-b-global\"\n                                     },\n                                     {\n-                                        \"description\": \"Build the Query from separate JSON objects.\",\n-                                        \"displayName\": \"BUILD_QUERY\",\n-                                        \"value\": \"build\"\n+                                        \"description\": \"AWS Region Code : aws-iso-global\",\n+                                        \"displayName\": \"aws-iso-global\",\n+                                        \"value\": \"aws-iso-global\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-us-gov-global\",\n+                                        \"displayName\": \"aws-us-gov-global\",\n+                                        \"value\": \"aws-us-gov-global\"\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\": \"us-west-2\",\n+                                \"description\": \"\",\n+                                \"displayName\": \"Region\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"el-rest-query-definition-style\",\n+                                \"name\": \"Region\",\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+                            \"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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"el-rest-script\",\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\": \"2.0.0-M3\"\n+                                }\n                             },\n-                            \"el-rest-type\": {\n-                                \"description\": \"The type of this document (used by Elasticsearch for indexing and searching).\",\n-                                \"displayName\": \"Type\",\n+                            \"proxy-configuration-service\": {\n+                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests.\",\n+                                \"displayName\": \"Proxy Configuration Service\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"el-rest-type\",\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\": \"2.0.0-M3\"\n+                                }\n                             }\n                         },\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.aws.sqs.GetSQS\",\n+                            \"org.apache.nifi.processors.aws.sqs.PutSQS\"\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+                                \"description\": \"FlowFiles are routed to success 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+                                \"description\": \"FlowFiles are routed to failure relationship\",\n                                 \"name\": \"failure\"\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                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": true,\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"elastic\",\n-                            \"elasticsearch\",\n-                            \"elasticsearch5\",\n-                            \"elasticsearch6\",\n-                            \"elasticsearch7\",\n-                            \"elasticsearch8\",\n-                            \"query\",\n-                            \"update\"\n+                            \"AWS\",\n+                            \"Amazon\",\n+                            \"Delete\",\n+                            \"Queue\",\n+                            \"SQS\"\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.aws.sqs.DeleteSQS\",\n+                        \"typeDescription\": \"Deletes a message from an Amazon Simple Queuing Service Queue\",\n                         \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\",\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\": \"2.0.0-M3\"\n-        },\n-        {\n-            \"artifact\": \"nifi-standard-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [],\n-                \"processors\": [\n+                        \"version\": \"2.0.0-M3\"\n+                    },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-standard-nar\",\n+                        \"artifact\": \"nifi-aws-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -34566,382 +40908,1307 @@\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                         \"multiProcessorUseCases\": [],\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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"attribute-list\",\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"attributes-regex\",\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+                            \"AWS Credentials Provider service\": {\n+                                \"description\": \"The Controller Service that is used to obtain AWS credentials provider\",\n+                                \"displayName\": \"AWS Credentials Provider Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"destination\",\n+                                \"name\": \"AWS Credentials Provider service\",\n                                 \"required\": true,\n-                                \"sensitive\": false\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-aws-service-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.processors.aws.credentials.provider.service.AWSCredentialsProviderService\",\n+                                    \"version\": \"2.0.0-M3\"\n+                                }\n                             },\n-                            \"include-core-attributes\": {\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\": \"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+                                \"description\": \"Specifies whether the messages should be automatically deleted by the processors once they have been received.\",\n+                                \"displayName\": \"Auto Delete Messages\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"include-core-attributes\",\n+                                \"name\": \"Auto Delete Messages\",\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+                            \"Batch Size\": {\n+                                \"defaultValue\": \"10\",\n+                                \"description\": \"The maximum number of messages to send in a single network request\",\n+                                \"displayName\": \"Batch Size\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"include-schema\",\n+                                \"name\": \"Batch Size\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"null-value\": {\n+                            \"Character Set\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"displayName\": \"Big5\",\n+                                        \"value\": \"Big5\"\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\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-                            {\n-                                \"description\": \"Failed to convert attributes to CSV\",\n-                                \"name\": \"failure\"\n-                            }\n-                        ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\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-                        \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\",\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\": \"f2215c6\"\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-                        \"multiProcessorUseCases\": [],\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+                                        \"displayName\": \"Big5-HKSCS\",\n+                                        \"value\": \"Big5-HKSCS\"\n+                                    },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"flowfile-attribute\",\n-                                        \"value\": \"flowfile-attribute\"\n+                                        \"displayName\": \"CESU-8\",\n+                                        \"value\": \"CESU-8\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"flowfile-content\",\n-                                        \"value\": \"flowfile-content\"\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-                                \"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+                                        \"displayName\": \"EUC-JP\",\n+                                        \"value\": \"EUC-JP\"\n+                                    },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"displayName\": \"EUC-KR\",\n+                                        \"value\": \"EUC-KR\"\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Include Core Attributes\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"JSON Handling Strategy\": {\n-                                \"allowableValues\": [\n+                                        \"displayName\": \"GB18030\",\n+                                        \"value\": \"GB18030\"\n+                                    },\n                                     {\n-                                        \"description\": \"Escapes JSON attribute values to strings\",\n-                                        \"displayName\": \"Escaped\",\n-                                        \"value\": \"ESCAPED\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"GB2312\",\n+                                        \"value\": \"GB2312\"\n                                     },\n                                     {\n-                                        \"description\": \"Handles JSON attribute values as nested structured objects or arrays\",\n-                                        \"displayName\": \"Nested\",\n-                                        \"value\": \"NESTED\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"GBK\",\n+                                        \"value\": \"GBK\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"IBM-Thai\",\n+                                        \"value\": \"IBM-Thai\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"IBM00858\",\n+                                        \"value\": \"IBM00858\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"IBM01140\",\n+                                        \"value\": \"IBM01140\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"IBM01141\",\n+                                        \"value\": \"IBM01141\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"IBM01142\",\n+                                        \"value\": \"IBM01142\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"IBM01143\",\n+                                        \"value\": \"IBM01143\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"IBM01144\",\n+                                        \"value\": \"IBM01144\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"IBM01145\",\n+                                        \"value\": \"IBM01145\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"IBM01146\",\n+                                        \"value\": \"IBM01146\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"IBM01147\",\n+                                        \"value\": \"IBM01147\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"IBM01148\",\n+                                        \"value\": \"IBM01148\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"IBM01149\",\n+                                        \"value\": \"IBM01149\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"IBM037\",\n+                                        \"value\": \"IBM037\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"IBM1026\",\n+                                        \"value\": \"IBM1026\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"IBM1047\",\n+                                        \"value\": \"IBM1047\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"IBM273\",\n+                                        \"value\": \"IBM273\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"IBM277\",\n+                                        \"value\": \"IBM277\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"IBM278\",\n+                                        \"value\": \"IBM278\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"IBM280\",\n+                                        \"value\": \"IBM280\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"IBM284\",\n+                                        \"value\": \"IBM284\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"IBM285\",\n+                                        \"value\": \"IBM285\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"IBM290\",\n+                                        \"value\": \"IBM290\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"IBM297\",\n+                                        \"value\": \"IBM297\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"IBM420\",\n+                                        \"value\": \"IBM420\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"IBM424\",\n+                                        \"value\": \"IBM424\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"IBM437\",\n+                                        \"value\": \"IBM437\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"IBM500\",\n+                                        \"value\": \"IBM500\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"IBM775\",\n+                                        \"value\": \"IBM775\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"IBM850\",\n+                                        \"value\": \"IBM850\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"IBM852\",\n+                                        \"value\": \"IBM852\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"IBM855\",\n+                                        \"value\": \"IBM855\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"IBM857\",\n+                                        \"value\": \"IBM857\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"IBM860\",\n+                                        \"value\": \"IBM860\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"IBM861\",\n+                                        \"value\": \"IBM861\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"IBM862\",\n+                                        \"value\": \"IBM862\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"IBM863\",\n+                                        \"value\": \"IBM863\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"IBM864\",\n+                                        \"value\": \"IBM864\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"IBM865\",\n+                                        \"value\": \"IBM865\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"IBM866\",\n+                                        \"value\": \"IBM866\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"IBM868\",\n+                                        \"value\": \"IBM868\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"IBM869\",\n+                                        \"value\": \"IBM869\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"IBM870\",\n+                                        \"value\": \"IBM870\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"IBM871\",\n+                                        \"value\": \"IBM871\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"IBM918\",\n+                                        \"value\": \"IBM918\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"ISO-2022-CN\",\n+                                        \"value\": \"ISO-2022-CN\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"ISO-2022-JP\",\n+                                        \"value\": \"ISO-2022-JP\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"ISO-2022-JP-2\",\n+                                        \"value\": \"ISO-2022-JP-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"ISO-2022-KR\",\n+                                        \"value\": \"ISO-2022-KR\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"ISO-8859-1\",\n+                                        \"value\": \"ISO-8859-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"ISO-8859-13\",\n+                                        \"value\": \"ISO-8859-13\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"ISO-8859-15\",\n+                                        \"value\": \"ISO-8859-15\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"ISO-8859-16\",\n+                                        \"value\": \"ISO-8859-16\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"ISO-8859-2\",\n+                                        \"value\": \"ISO-8859-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"ISO-8859-3\",\n+                                        \"value\": \"ISO-8859-3\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"ISO-8859-4\",\n+                                        \"value\": \"ISO-8859-4\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"ISO-8859-5\",\n+                                        \"value\": \"ISO-8859-5\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"ISO-8859-6\",\n+                                        \"value\": \"ISO-8859-6\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"ISO-8859-7\",\n+                                        \"value\": \"ISO-8859-7\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"ISO-8859-8\",\n+                                        \"value\": \"ISO-8859-8\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"ISO-8859-9\",\n+                                        \"value\": \"ISO-8859-9\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"JIS_X0201\",\n+                                        \"value\": \"JIS_X0201\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"JIS_X0212-1990\",\n+                                        \"value\": \"JIS_X0212-1990\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"KOI8-R\",\n+                                        \"value\": \"KOI8-R\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"KOI8-U\",\n+                                        \"value\": \"KOI8-U\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Shift_JIS\",\n+                                        \"value\": \"Shift_JIS\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"TIS-620\",\n+                                        \"value\": \"TIS-620\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"US-ASCII\",\n+                                        \"value\": \"US-ASCII\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"UTF-16\",\n+                                        \"value\": \"UTF-16\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"UTF-16BE\",\n+                                        \"value\": \"UTF-16BE\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"UTF-16LE\",\n+                                        \"value\": \"UTF-16LE\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"UTF-32\",\n+                                        \"value\": \"UTF-32\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"UTF-32BE\",\n+                                        \"value\": \"UTF-32BE\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"UTF-32LE\",\n+                                        \"value\": \"UTF-32LE\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"UTF-8\",\n+                                        \"value\": \"UTF-8\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"windows-1250\",\n+                                        \"value\": \"windows-1250\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"windows-1251\",\n+                                        \"value\": \"windows-1251\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"windows-1252\",\n+                                        \"value\": \"windows-1252\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"windows-1253\",\n+                                        \"value\": \"windows-1253\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"windows-1254\",\n+                                        \"value\": \"windows-1254\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"windows-1255\",\n+                                        \"value\": \"windows-1255\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"windows-1256\",\n+                                        \"value\": \"windows-1256\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"windows-1257\",\n+                                        \"value\": \"windows-1257\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"windows-1258\",\n+                                        \"value\": \"windows-1258\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"windows-31j\",\n+                                        \"value\": \"windows-31j\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"x-Big5-HKSCS-2001\",\n+                                        \"value\": \"x-Big5-HKSCS-2001\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"x-Big5-Solaris\",\n+                                        \"value\": \"x-Big5-Solaris\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"x-euc-jp-linux\",\n+                                        \"value\": \"x-euc-jp-linux\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"x-EUC-TW\",\n+                                        \"value\": \"x-EUC-TW\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"x-eucJP-Open\",\n+                                        \"value\": \"x-eucJP-Open\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"x-IBM1006\",\n+                                        \"value\": \"x-IBM1006\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"x-IBM1025\",\n+                                        \"value\": \"x-IBM1025\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"x-IBM1046\",\n+                                        \"value\": \"x-IBM1046\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"x-IBM1097\",\n+                                        \"value\": \"x-IBM1097\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"x-IBM1098\",\n+                                        \"value\": \"x-IBM1098\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"x-IBM1112\",\n+                                        \"value\": \"x-IBM1112\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"x-IBM1122\",\n+                                        \"value\": \"x-IBM1122\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"x-IBM1123\",\n+                                        \"value\": \"x-IBM1123\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"x-IBM1124\",\n+                                        \"value\": \"x-IBM1124\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"x-IBM1129\",\n+                                        \"value\": \"x-IBM1129\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"x-IBM1166\",\n+                                        \"value\": \"x-IBM1166\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"x-IBM1364\",\n+                                        \"value\": \"x-IBM1364\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"x-IBM1381\",\n+                                        \"value\": \"x-IBM1381\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"x-IBM1383\",\n+                                        \"value\": \"x-IBM1383\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"x-IBM29626C\",\n+                                        \"value\": \"x-IBM29626C\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"x-IBM300\",\n+                                        \"value\": \"x-IBM300\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"x-IBM33722\",\n+                                        \"value\": \"x-IBM33722\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"x-IBM737\",\n+                                        \"value\": \"x-IBM737\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"x-IBM833\",\n+                                        \"value\": \"x-IBM833\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"x-IBM834\",\n+                                        \"value\": \"x-IBM834\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"x-IBM856\",\n+                                        \"value\": \"x-IBM856\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"x-IBM874\",\n+                                        \"value\": \"x-IBM874\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"x-IBM875\",\n+                                        \"value\": \"x-IBM875\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"x-IBM921\",\n+                                        \"value\": \"x-IBM921\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"x-IBM922\",\n+                                        \"value\": \"x-IBM922\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"x-IBM930\",\n+                                        \"value\": \"x-IBM930\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"x-IBM933\",\n+                                        \"value\": \"x-IBM933\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"x-IBM935\",\n+                                        \"value\": \"x-IBM935\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"x-IBM937\",\n+                                        \"value\": \"x-IBM937\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"x-IBM939\",\n+                                        \"value\": \"x-IBM939\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"x-IBM942\",\n+                                        \"value\": \"x-IBM942\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"x-IBM942C\",\n+                                        \"value\": \"x-IBM942C\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"x-IBM943\",\n+                                        \"value\": \"x-IBM943\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"x-IBM943C\",\n+                                        \"value\": \"x-IBM943C\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"x-IBM948\",\n+                                        \"value\": \"x-IBM948\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"x-IBM949\",\n+                                        \"value\": \"x-IBM949\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"x-IBM949C\",\n+                                        \"value\": \"x-IBM949C\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"x-IBM950\",\n+                                        \"value\": \"x-IBM950\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"x-IBM964\",\n+                                        \"value\": \"x-IBM964\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"x-IBM970\",\n+                                        \"value\": \"x-IBM970\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"x-ISCII91\",\n+                                        \"value\": \"x-ISCII91\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"x-ISO-2022-CN-CNS\",\n+                                        \"value\": \"x-ISO-2022-CN-CNS\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"x-ISO-2022-CN-GB\",\n+                                        \"value\": \"x-ISO-2022-CN-GB\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"x-iso-8859-11\",\n+                                        \"value\": \"x-iso-8859-11\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"x-JIS0208\",\n+                                        \"value\": \"x-JIS0208\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"x-JISAutoDetect\",\n+                                        \"value\": \"x-JISAutoDetect\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"x-Johab\",\n+                                        \"value\": \"x-Johab\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"x-MacArabic\",\n+                                        \"value\": \"x-MacArabic\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"x-MacCentralEurope\",\n+                                        \"value\": \"x-MacCentralEurope\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"x-MacCroatian\",\n+                                        \"value\": \"x-MacCroatian\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"x-MacCyrillic\",\n+                                        \"value\": \"x-MacCyrillic\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"x-MacDingbat\",\n+                                        \"value\": \"x-MacDingbat\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"x-MacGreek\",\n+                                        \"value\": \"x-MacGreek\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"x-MacHebrew\",\n+                                        \"value\": \"x-MacHebrew\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"x-MacIceland\",\n+                                        \"value\": \"x-MacIceland\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"x-MacRoman\",\n+                                        \"value\": \"x-MacRoman\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"x-MacRomania\",\n+                                        \"value\": \"x-MacRomania\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"x-MacSymbol\",\n+                                        \"value\": \"x-MacSymbol\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"x-MacThai\",\n+                                        \"value\": \"x-MacThai\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"x-MacTurkish\",\n+                                        \"value\": \"x-MacTurkish\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"x-MacUkraine\",\n+                                        \"value\": \"x-MacUkraine\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"x-MS932_0213\",\n+                                        \"value\": \"x-MS932_0213\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"x-MS950-HKSCS\",\n+                                        \"value\": \"x-MS950-HKSCS\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"x-MS950-HKSCS-XP\",\n+                                        \"value\": \"x-MS950-HKSCS-XP\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"x-mswin-936\",\n+                                        \"value\": \"x-mswin-936\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"x-PCK\",\n+                                        \"value\": \"x-PCK\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"x-SJIS_0213\",\n+                                        \"value\": \"x-SJIS_0213\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"x-UTF-16LE-BOM\",\n+                                        \"value\": \"x-UTF-16LE-BOM\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"X-UTF-32BE-BOM\",\n+                                        \"value\": \"X-UTF-32BE-BOM\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"X-UTF-32LE-BOM\",\n+                                        \"value\": \"X-UTF-32LE-BOM\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"x-windows-50220\",\n+                                        \"value\": \"x-windows-50220\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"x-windows-50221\",\n+                                        \"value\": \"x-windows-50221\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"x-windows-874\",\n+                                        \"value\": \"x-windows-874\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"x-windows-949\",\n+                                        \"value\": \"x-windows-949\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"x-windows-950\",\n+                                        \"value\": \"x-windows-950\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"x-windows-iso2022jp\",\n+                                        \"value\": \"x-windows-iso2022jp\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"ESCAPED\",\n-                                \"description\": \"Strategy to use for handling attributes which contain nested JSON.\",\n-                                \"displayName\": \"JSON Handling Strategy\",\n+                                \"defaultValue\": \"UTF-8\",\n+                                \"description\": \"The Character Set that should be used to encode the textual content of the SQS message\",\n+                                \"displayName\": \"Character Set\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"JSON Handling Strategy\",\n+                                \"name\": \"Character Set\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\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\": \"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+                            \"Communications Timeout\": {\n+                                \"defaultValue\": \"30 secs\",\n+                                \"description\": \"\",\n+                                \"displayName\": \"Communications Timeout\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Null Value\",\n+                                \"name\": \"Communications Timeout\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Pretty Print\": {\n+                            \"Endpoint Override URL\": {\n+                                \"description\": \"Endpoint URL to use instead of the AWS default including scheme, host, port, and path. The AWS libraries select an endpoint URL based on the AWS region, but this property overrides the selected endpoint URL, allowing use with other S3-compatible endpoints.\",\n+                                \"displayName\": \"Endpoint Override URL\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Endpoint Override URL\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Queue URL\": {\n+                                \"description\": \"The URL of the queue to get messages from\",\n+                                \"displayName\": \"Queue URL\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Queue URL\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Receive Message Wait Time\": {\n+                                \"defaultValue\": \"0 sec\",\n+                                \"description\": \"The maximum amount of time to wait on a long polling receive call. Setting this to a value of 1 second or greater will reduce the number of SQS requests and decrease fetch latency at the cost of a constantly active thread.\",\n+                                \"displayName\": \"Receive Message Wait Time\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Receive Message Wait Time\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Region\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"description\": \"AWS Region Code : us-gov-east-1\",\n+                                        \"displayName\": \"AWS GovCloud (US-East)\",\n+                                        \"value\": \"us-gov-east-1\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"dependencies\": [\n+                                        \"description\": \"AWS Region Code : us-gov-west-1\",\n+                                        \"displayName\": \"AWS GovCloud (US-West)\",\n+                                        \"value\": \"us-gov-west-1\"\n+                                    },\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"flowfile-content\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Destination\",\n-                                        \"propertyName\": \"Destination\"\n+                                        \"description\": \"AWS Region Code : af-south-1\",\n+                                        \"displayName\": \"Africa (Cape Town)\",\n+                                        \"value\": \"af-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-east-1\",\n+                                        \"displayName\": \"Asia Pacific (Hong Kong)\",\n+                                        \"value\": \"ap-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-south-2\",\n+                                        \"displayName\": \"Asia Pacific (Hyderabad)\",\n+                                        \"value\": \"ap-south-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-southeast-3\",\n+                                        \"displayName\": \"Asia Pacific (Jakarta)\",\n+                                        \"value\": \"ap-southeast-3\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-southeast-4\",\n+                                        \"displayName\": \"Asia Pacific (Melbourne)\",\n+                                        \"value\": \"ap-southeast-4\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-south-1\",\n+                                        \"displayName\": \"Asia Pacific (Mumbai)\",\n+                                        \"value\": \"ap-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-northeast-3\",\n+                                        \"displayName\": \"Asia Pacific (Osaka)\",\n+                                        \"value\": \"ap-northeast-3\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-northeast-2\",\n+                                        \"displayName\": \"Asia Pacific (Seoul)\",\n+                                        \"value\": \"ap-northeast-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-southeast-1\",\n+                                        \"displayName\": \"Asia Pacific (Singapore)\",\n+                                        \"value\": \"ap-southeast-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-southeast-2\",\n+                                        \"displayName\": \"Asia Pacific (Sydney)\",\n+                                        \"value\": \"ap-southeast-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-northeast-1\",\n+                                        \"displayName\": \"Asia Pacific (Tokyo)\",\n+                                        \"value\": \"ap-northeast-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ca-central-1\",\n+                                        \"displayName\": \"Canada (Central)\",\n+                                        \"value\": \"ca-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ca-west-1\",\n+                                        \"displayName\": \"Canada West (Calgary)\",\n+                                        \"value\": \"ca-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : cn-north-1\",\n+                                        \"displayName\": \"China (Beijing)\",\n+                                        \"value\": \"cn-north-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : cn-northwest-1\",\n+                                        \"displayName\": \"China (Ningxia)\",\n+                                        \"value\": \"cn-northwest-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-central-1\",\n+                                        \"displayName\": \"Europe (Frankfurt)\",\n+                                        \"value\": \"eu-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-west-1\",\n+                                        \"displayName\": \"Europe (Ireland)\",\n+                                        \"value\": \"eu-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-west-2\",\n+                                        \"displayName\": \"Europe (London)\",\n+                                        \"value\": \"eu-west-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-south-1\",\n+                                        \"displayName\": \"Europe (Milan)\",\n+                                        \"value\": \"eu-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-west-3\",\n+                                        \"displayName\": \"Europe (Paris)\",\n+                                        \"value\": \"eu-west-3\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-south-2\",\n+                                        \"displayName\": \"Europe (Spain)\",\n+                                        \"value\": \"eu-south-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-north-1\",\n+                                        \"displayName\": \"Europe (Stockholm)\",\n+                                        \"value\": \"eu-north-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-central-2\",\n+                                        \"displayName\": \"Europe (Zurich)\",\n+                                        \"value\": \"eu-central-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : il-central-1\",\n+                                        \"displayName\": \"Israel (Tel Aviv)\",\n+                                        \"value\": \"il-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : me-south-1\",\n+                                        \"displayName\": \"Middle East (Bahrain)\",\n+                                        \"value\": \"me-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : me-central-1\",\n+                                        \"displayName\": \"Middle East (UAE)\",\n+                                        \"value\": \"me-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : sa-east-1\",\n+                                        \"displayName\": \"South America (Sao Paulo)\",\n+                                        \"value\": \"sa-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-east-1\",\n+                                        \"displayName\": \"US East (N. Virginia)\",\n+                                        \"value\": \"us-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-east-2\",\n+                                        \"displayName\": \"US East (Ohio)\",\n+                                        \"value\": \"us-east-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-iso-east-1\",\n+                                        \"displayName\": \"US ISO East\",\n+                                        \"value\": \"us-iso-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-iso-west-1\",\n+                                        \"displayName\": \"US ISO WEST\",\n+                                        \"value\": \"us-iso-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-isob-east-1\",\n+                                        \"displayName\": \"US ISOB East (Ohio)\",\n+                                        \"value\": \"us-isob-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-west-1\",\n+                                        \"displayName\": \"US West (N. California)\",\n+                                        \"value\": \"us-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-west-2\",\n+                                        \"displayName\": \"US West (Oregon)\",\n+                                        \"value\": \"us-west-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-cn-global\",\n+                                        \"displayName\": \"aws-cn-global\",\n+                                        \"value\": \"aws-cn-global\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-global\",\n+                                        \"displayName\": \"aws-global\",\n+                                        \"value\": \"aws-global\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-iso-b-global\",\n+                                        \"displayName\": \"aws-iso-b-global\",\n+                                        \"value\": \"aws-iso-b-global\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-iso-global\",\n+                                        \"displayName\": \"aws-iso-global\",\n+                                        \"value\": \"aws-iso-global\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-us-gov-global\",\n+                                        \"displayName\": \"aws-us-gov-global\",\n+                                        \"value\": \"aws-us-gov-global\"\n                                     }\n                                 ],\n-                                \"description\": \"Apply pretty print formatting to the output.\",\n-                                \"displayName\": \"Pretty Print\",\n+                                \"defaultValue\": \"us-west-2\",\n+                                \"description\": \"\",\n+                                \"displayName\": \"Region\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Pretty Print\",\n+                                \"name\": \"Region\",\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+                            \"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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"attributes-to-json-regex\",\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\": \"2.0.0-M3\"\n+                                }\n+                            },\n+                            \"Visibility Timeout\": {\n+                                \"defaultValue\": \"15 mins\",\n+                                \"description\": \"The amount of time after a message is received but not deleted that the message is hidden from 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+                            \"proxy-configuration-service\": {\n+                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests.\",\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\": \"2.0.0-M3\"\n+                                }\n                             }\n                         },\n-                        \"sideEffectFree\": true,\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.aws.sqs.DeleteSQS\",\n+                            \"org.apache.nifi.processors.aws.sqs.PutSQS\"\n+                        ],\n+                        \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"Successfully converted attributes to JSON\",\n+                                \"description\": \"FlowFiles are routed to success relationship\",\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                         ],\n                         \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"attributes\",\n-                            \"flowfile\",\n-                            \"json\"\n+                            \"AWS\",\n+                            \"Amazon\",\n+                            \"Fetch\",\n+                            \"Get\",\n+                            \"Poll\",\n+                            \"Queue\",\n+                            \"SQS\"\n                         ],\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+                        \"type\": \"org.apache.nifi.processors.aws.sqs.GetSQS\",\n+                        \"typeDescription\": \"Fetches messages from an Amazon Simple Queuing Service Queue\",\n                         \"useCases\": [],\n                         \"version\": \"2.0.0-M3\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"JSON representation of Attributes\",\n-                                \"name\": \"JSONAttributes\"\n+                                \"description\": \"The MD5 sum of the message\",\n+                                \"name\": \"hash.value\"\n+                            },\n+                            {\n+                                \"description\": \"MD5\",\n+                                \"name\": \"hash.algorithm\"\n+                            },\n+                            {\n+                                \"description\": \"The unique identifier of the SQS message\",\n+                                \"name\": \"sqs.message.id\"\n+                            },\n+                            {\n+                                \"description\": \"The SQS Receipt Handle that is to be used to delete the message from the queue\",\n+                                \"name\": \"sqs.receipt.handle\"\n                             }\n                         ]\n                     },\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-standard-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-aws-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -34951,102 +42218,407 @@\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+                                \"description\": \"Allows the user to add key/value pairs as Message Attributes by adding a property whose name will become the name of the Message Attribute and value will become the value of the Message Attribute\",\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"name\": \"Record Path property\",\n-                                \"value\": \"The Record Path value\"\n+                                \"name\": \"The name of a Message Attribute to add to the message\",\n+                                \"value\": \"The value of the Message Attribute\"\n                             }\n                         ],\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"multiProcessorUseCases\": [],\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+                            \"AWS Credentials Provider service\": {\n+                                \"description\": \"The Controller Service that is used to obtain AWS credentials provider\",\n+                                \"displayName\": \"AWS Credentials Provider Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"AWS Credentials Provider service\",\n+                                \"required\": true,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-aws-service-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.processors.aws.credentials.provider.service.AWSCredentialsProviderService\",\n+                                    \"version\": \"2.0.0-M3\"\n+                                }\n+                            },\n+                            \"Communications Timeout\": {\n+                                \"defaultValue\": \"30 secs\",\n+                                \"description\": \"\",\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+                            \"Delay\": {\n+                                \"defaultValue\": \"0 secs\",\n+                                \"description\": \"The amount of time to delay the message before it becomes available to consumers\",\n+                                \"displayName\": \"Delay\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Delay\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Endpoint Override URL\": {\n+                                \"description\": \"Endpoint URL to use instead of the AWS default including scheme, host, port, and path. The AWS libraries select an endpoint URL based on the AWS region, but this property overrides the selected endpoint URL, allowing use with other S3-compatible endpoints.\",\n+                                \"displayName\": \"Endpoint Override URL\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Endpoint Override URL\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Queue URL\": {\n+                                \"description\": \"The URL of the queue to act upon\",\n+                                \"displayName\": \"Queue URL\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"record-stats-limit\",\n+                                \"name\": \"Queue URL\",\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+                            \"Region\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-gov-east-1\",\n+                                        \"displayName\": \"AWS GovCloud (US-East)\",\n+                                        \"value\": \"us-gov-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-gov-west-1\",\n+                                        \"displayName\": \"AWS GovCloud (US-West)\",\n+                                        \"value\": \"us-gov-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : af-south-1\",\n+                                        \"displayName\": \"Africa (Cape Town)\",\n+                                        \"value\": \"af-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-east-1\",\n+                                        \"displayName\": \"Asia Pacific (Hong Kong)\",\n+                                        \"value\": \"ap-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-south-2\",\n+                                        \"displayName\": \"Asia Pacific (Hyderabad)\",\n+                                        \"value\": \"ap-south-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-southeast-3\",\n+                                        \"displayName\": \"Asia Pacific (Jakarta)\",\n+                                        \"value\": \"ap-southeast-3\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-southeast-4\",\n+                                        \"displayName\": \"Asia Pacific (Melbourne)\",\n+                                        \"value\": \"ap-southeast-4\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-south-1\",\n+                                        \"displayName\": \"Asia Pacific (Mumbai)\",\n+                                        \"value\": \"ap-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-northeast-3\",\n+                                        \"displayName\": \"Asia Pacific (Osaka)\",\n+                                        \"value\": \"ap-northeast-3\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-northeast-2\",\n+                                        \"displayName\": \"Asia Pacific (Seoul)\",\n+                                        \"value\": \"ap-northeast-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-southeast-1\",\n+                                        \"displayName\": \"Asia Pacific (Singapore)\",\n+                                        \"value\": \"ap-southeast-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-southeast-2\",\n+                                        \"displayName\": \"Asia Pacific (Sydney)\",\n+                                        \"value\": \"ap-southeast-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ap-northeast-1\",\n+                                        \"displayName\": \"Asia Pacific (Tokyo)\",\n+                                        \"value\": \"ap-northeast-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ca-central-1\",\n+                                        \"displayName\": \"Canada (Central)\",\n+                                        \"value\": \"ca-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : ca-west-1\",\n+                                        \"displayName\": \"Canada West (Calgary)\",\n+                                        \"value\": \"ca-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : cn-north-1\",\n+                                        \"displayName\": \"China (Beijing)\",\n+                                        \"value\": \"cn-north-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : cn-northwest-1\",\n+                                        \"displayName\": \"China (Ningxia)\",\n+                                        \"value\": \"cn-northwest-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-central-1\",\n+                                        \"displayName\": \"Europe (Frankfurt)\",\n+                                        \"value\": \"eu-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-west-1\",\n+                                        \"displayName\": \"Europe (Ireland)\",\n+                                        \"value\": \"eu-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-west-2\",\n+                                        \"displayName\": \"Europe (London)\",\n+                                        \"value\": \"eu-west-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-south-1\",\n+                                        \"displayName\": \"Europe (Milan)\",\n+                                        \"value\": \"eu-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-west-3\",\n+                                        \"displayName\": \"Europe (Paris)\",\n+                                        \"value\": \"eu-west-3\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-south-2\",\n+                                        \"displayName\": \"Europe (Spain)\",\n+                                        \"value\": \"eu-south-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-north-1\",\n+                                        \"displayName\": \"Europe (Stockholm)\",\n+                                        \"value\": \"eu-north-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : eu-central-2\",\n+                                        \"displayName\": \"Europe (Zurich)\",\n+                                        \"value\": \"eu-central-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : il-central-1\",\n+                                        \"displayName\": \"Israel (Tel Aviv)\",\n+                                        \"value\": \"il-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : me-south-1\",\n+                                        \"displayName\": \"Middle East (Bahrain)\",\n+                                        \"value\": \"me-south-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : me-central-1\",\n+                                        \"displayName\": \"Middle East (UAE)\",\n+                                        \"value\": \"me-central-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : sa-east-1\",\n+                                        \"displayName\": \"South America (Sao Paulo)\",\n+                                        \"value\": \"sa-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-east-1\",\n+                                        \"displayName\": \"US East (N. Virginia)\",\n+                                        \"value\": \"us-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-east-2\",\n+                                        \"displayName\": \"US East (Ohio)\",\n+                                        \"value\": \"us-east-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-iso-east-1\",\n+                                        \"displayName\": \"US ISO East\",\n+                                        \"value\": \"us-iso-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-iso-west-1\",\n+                                        \"displayName\": \"US ISO WEST\",\n+                                        \"value\": \"us-iso-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-isob-east-1\",\n+                                        \"displayName\": \"US ISOB East (Ohio)\",\n+                                        \"value\": \"us-isob-east-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-west-1\",\n+                                        \"displayName\": \"US West (N. California)\",\n+                                        \"value\": \"us-west-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : us-west-2\",\n+                                        \"displayName\": \"US West (Oregon)\",\n+                                        \"value\": \"us-west-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-cn-global\",\n+                                        \"displayName\": \"aws-cn-global\",\n+                                        \"value\": \"aws-cn-global\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-global\",\n+                                        \"displayName\": \"aws-global\",\n+                                        \"value\": \"aws-global\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-iso-b-global\",\n+                                        \"displayName\": \"aws-iso-b-global\",\n+                                        \"value\": \"aws-iso-b-global\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-iso-global\",\n+                                        \"displayName\": \"aws-iso-global\",\n+                                        \"value\": \"aws-iso-global\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AWS Region Code : aws-us-gov-global\",\n+                                        \"displayName\": \"aws-us-gov-global\",\n+                                        \"value\": \"aws-us-gov-global\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"us-west-2\",\n+                                \"description\": \"\",\n+                                \"displayName\": \"Region\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"record-stats-reader\",\n+                                \"name\": \"Region\",\n                                 \"required\": true,\n+                                \"sensitive\": false\n+                            },\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\": \"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\": \"2.0.0-M3\"\n+                                }\n+                            },\n+                            \"deduplication-message-id\": {\n+                                \"description\": \"The token used for deduplication of sent messages\",\n+                                \"displayName\": \"Deduplication Message ID\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"deduplication-message-id\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"message-group-id\": {\n+                                \"description\": \"If using FIFO, the message group to which the FlowFile belongs\",\n+                                \"displayName\": \"Message Group ID\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"message-group-id\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"proxy-configuration-service\": {\n+                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests.\",\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\": \"2.0.0-M3\"\n                                 }\n                             }\n                         },\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.aws.sqs.DeleteSQS\",\n+                            \"org.apache.nifi.processors.aws.sqs.GetSQS\"\n+                        ],\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"If a flowfile is successfully processed, it goes here.\",\n+                                \"description\": \"FlowFiles are routed to success relationship\",\n                                 \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"If a flowfile fails to be processed, it goes here.\",\n+                                \"description\": \"FlowFiles are routed to failure 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                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"metrics\",\n-                            \"record\",\n-                            \"stats\"\n+                            \"AWS\",\n+                            \"Amazon\",\n+                            \"Publish\",\n+                            \"Put\",\n+                            \"Queue\",\n+                            \"SQS\"\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.aws.sqs.PutSQS\",\n+                        \"typeDescription\": \"Publishes a message to an Amazon Simple Queuing Service Queue\",\n                         \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\",\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-                            }\n-                        ]\n-                    },\n+                        \"version\": \"2.0.0-M3\"\n+                    }\n+                ],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"2.0.0-M3\"\n+        },\n+        {\n+            \"artifact\": \"nifi-asana-processors-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n+                \"processors\": [\n                     {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-standard-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-asana-processors-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -35055,991 +42627,1402 @@\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-                        \"multiProcessorUseCases\": [\n-                            {\n-                                \"configurations\": [\n-                                    {\n-                                        \"configuration\": \"Default property values are sufficient.\\nConnect the 'success' relationship to CompressContent.\\n\",\n-                                        \"processorClassName\": \"org.apache.nifi.processors.standard.IdentifyMimeType\"\n-                                    },\n-                                    {\n-                                        \"configuration\": \"\\\"Mode\\\" = \\\"decompress\\\"\\n\\\"Compression Format\\\" = \\\"use mime.type attribute\\\"\\n\",\n-                                        \"processorClassName\": \"org.apache.nifi.processors.standard.CompressContent\"\n-                                    }\n-                                ],\n-                                \"description\": \"Check whether or not a FlowFile is compressed and if so, decompress it.\",\n-                                \"keywords\": [\n-                                    \"auto\",\n-                                    \"detect\",\n-                                    \"mime type\",\n-                                    \"compress\",\n-                                    \"decompress\",\n-                                    \"gzip\",\n-                                    \"bzip2\"\n-                                ],\n-                                \"notes\": \"If IdentifyMimeType determines that the content is not compressed, CompressContent will pass the FlowFile along to the 'success' relationship without attempting to decompress it.\"\n-                            }\n-                        ],\n-                        \"primaryNodeOnly\": false,\n+                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n+                        \"multiProcessorUseCases\": [],\n+                        \"primaryNodeOnly\": true,\n                         \"propertyDescriptors\": {\n-                            \"Compression Format\": {\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\": \"2.0.0-M3\"\n+                                }\n+                            },\n+                            \"asana-object-type\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"use mime.type attribute\",\n-                                        \"value\": \"use mime.type attribute\"\n+                                        \"description\": \"Collect tasks matching to the specified conditions.\",\n+                                        \"displayName\": \"Tasks\",\n+                                        \"value\": \"asana-collect-tasks\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"gzip\",\n-                                        \"value\": \"gzip\"\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\": \"\",\n-                                        \"displayName\": \"deflate\",\n-                                        \"value\": \"deflate\"\n+                                        \"description\": \"Collect projects of the workspace.\",\n+                                        \"displayName\": \"Projects\",\n+                                        \"value\": \"asana-collect-projects\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"bzip2\",\n-                                        \"value\": \"bzip2\"\n+                                        \"description\": \"Collect tags of the workspace.\",\n+                                        \"displayName\": \"Tags\",\n+                                        \"value\": \"asana-collect-tags\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"xz-lzma2\",\n-                                        \"value\": \"xz-lzma2\"\n+                                        \"description\": \"Collect users assigned to the workspace.\",\n+                                        \"displayName\": \"Users\",\n+                                        \"value\": \"asana-collect-users\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"lzma\",\n-                                        \"value\": \"lzma\"\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\": \"\",\n-                                        \"displayName\": \"snappy\",\n-                                        \"value\": \"snappy\"\n+                                        \"description\": \"Collect teams of the workspace.\",\n+                                        \"displayName\": \"Teams\",\n+                                        \"value\": \"asana-collect-teams\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"snappy-hadoop\",\n-                                        \"value\": \"snappy-hadoop\"\n+                                        \"description\": \"Collect users assigned to the specified team.\",\n+                                        \"displayName\": \"Team Members\",\n+                                        \"value\": \"asana-collect-team-members\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"snappy framed\",\n-                                        \"value\": \"snappy framed\"\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\": \"\",\n-                                        \"displayName\": \"lz4-framed\",\n-                                        \"value\": \"lz4-framed\"\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\": \"\",\n-                                        \"displayName\": \"zstd\",\n-                                        \"value\": \"zstd\"\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\": \"\",\n-                                        \"displayName\": \"brotli\",\n-                                        \"value\": \"brotli\"\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\": \"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\": \"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\": \"Compression Format\",\n+                                \"name\": \"asana-object-type\",\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+                            \"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+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"asana-output-batch-size\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"asana-project-name\": {\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"zstd\",\n-                                            \"use mime.type attribute\",\n-                                            \"deflate\",\n-                                            \"brotli\",\n-                                            \"gzip\",\n-                                            \"xz-lzma2\"\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\": \"Compression Format\",\n-                                        \"propertyName\": \"Compression Format\"\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                                         \"dependentValues\": [\n-                                            \"compress\"\n+                                            \"asana-collect-task-attachments\",\n+                                            \"asana-collect-stories\",\n+                                            \"asana-collect-tasks\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Mode\",\n-                                        \"propertyName\": \"Mode\"\n+                                        \"propertyDisplayName\": \"Object Type\",\n+                                        \"propertyName\": \"asana-object-type\"\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+                                \"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\": \"Compression Level\",\n-                                \"required\": true,\n+                                \"name\": \"asana-section-name\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Mode\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"compress\",\n-                                        \"value\": \"compress\"\n-                                    },\n+                            \"asana-tag-name\": {\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"decompress\",\n-                                        \"value\": \"decompress\"\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-                                \"defaultValue\": \"compress\",\n-                                \"description\": \"Indicates whether the processor should compress content or decompress content. Must be either 'compress' or 'decompress'\",\n-                                \"displayName\": \"Mode\",\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\": \"Mode\",\n-                                \"required\": true,\n+                                \"name\": \"asana-tag-name\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Update Filename\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n+                            \"asana-team-name\": {\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"dependentValues\": [\n+                                            \"asana-collect-team-members\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Object Type\",\n+                                        \"propertyName\": \"asana-object-type\"\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\": \"Team name. Case sensitive.\",\n+                                \"displayName\": \"Team\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Update Filename\",\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\": \"2.0.0-M3\"\n+                                }\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+                        \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"FlowFiles will be transferred to the success relationship after successfully being compressed or decompressed\",\n-                                \"name\": \"success\"\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\": \"FlowFiles will be transferred to the failure relationship if they fail to compress/decompress\",\n-                                \"name\": \"failure\"\n+                                \"description\": \"Objects that have already been collected earlier, but were updated since, are routed to this relationship.\",\n+                                \"name\": \"updated\"\n+                            },\n+                            {\n+                                \"description\": \"Newly collected objects are routed to this relationship.\",\n+                                \"name\": \"new\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": true,\n+                        \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": 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-                            \"decompress\",\n-                            \"deflate\",\n-                            \"gzip\",\n-                            \"lz4-framed\",\n-                            \"lzma\",\n-                            \"snappy\",\n-                            \"snappy framed\",\n-                            \"snappy-hadoop\",\n-                            \"xz-lzma2\",\n-                            \"zstd\"\n+                            \"asana\",\n+                            \"ingest\",\n+                            \"source\"\n                         ],\n-                        \"triggerSerially\": false,\n+                        \"triggerSerially\": true,\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-                        \"useCases\": [\n-                            {\n-                                \"configuration\": \"\\\"Mode\\\" = \\\"compress\\\"\\n\\\"Compression Format\\\" should be set to whichever compression algorithm should be used.\",\n-                                \"description\": \"Compress the contents of a FlowFile\",\n-                                \"keywords\": [],\n-                                \"notes\": \"\"\n-                            },\n-                            {\n-                                \"configuration\": \"\\\"Mode\\\" = \\\"decompress\\\"\\n\\\"Compression Format\\\" should be set to whichever compression algorithm was used to compress the data previously.\",\n-                                \"description\": \"Decompress the contents of a FlowFile\",\n-                                \"keywords\": [],\n-                                \"notes\": \"\"\n-                            }\n-                        ],\n+                        \"type\": \"org.apache.nifi.processors.asana.GetAsanaObject\",\n+                        \"typeDescription\": \"This processor collects data from Asana\",\n+                        \"useCases\": [],\n                         \"version\": \"2.0.0-M3\",\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+                                \"description\": \"Global ID of the object in Asana.\",\n+                                \"name\": \"asana.gid\"\n                             }\n                         ]\n-                    },\n+                    }\n+                ],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"2.0.0-M3\"\n+        },\n+        {\n+            \"artifact\": \"nifi-record-sink-service-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-standard-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-record-sink-service-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\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-                        \"multiProcessorUseCases\": [],\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+                            \"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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"Grouping Attribute\",\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.serialization.RecordSetWriterFactory\",\n+                                    \"version\": \"2.0.0-M3\"\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"smtp-auth\",\n+                                \"required\": true,\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+                            \"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\": \"Maximum Data Rate\",\n-                                \"required\": false,\n+                                \"name\": \"smtp-hostname\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Maximum FlowFile Rate\": {\n+                            \"smtp-password\": {\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"data rate or flowfile count\"\n+                                            \"true\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Rate Control Criteria\",\n-                                        \"propertyName\": \"Rate Control Criteria\"\n+                                        \"propertyDisplayName\": \"SMTP Auth\",\n+                                        \"propertyName\": \"smtp-auth\"\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+                                \"description\": \"Password for the SMTP account\",\n+                                \"displayName\": \"SMTP Password\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Maximum FlowFile Rate\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"smtp-port\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Maximum Rate\": {\n+                            \"smtp-ssl\": {\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Flag indicating whether SSL should be enabled\",\n+                                \"displayName\": \"SMTP SSL\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"smtp-starttls\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"smtp-username\": {\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"data rate\",\n-                                            \"attribute value\",\n-                                            \"flowfile count\"\n+                                            \"true\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Rate Control Criteria\",\n-                                        \"propertyName\": \"Rate Control Criteria\"\n+                                        \"propertyDisplayName\": \"SMTP Auth\",\n+                                        \"propertyName\": \"smtp-auth\"\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+                                \"description\": \"Username for the SMTP account\",\n+                                \"displayName\": \"SMTP Username\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Maximum Rate\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"smtp-username\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Rate Control Criteria\": {\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"subject\",\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-record-sink-service-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"f2215c6\"\n+                        },\n+                        \"group\": \"org.apache.nifi\",\n+                        \"propertyDescriptors\": {\n+                            \"logsink-log-level\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Rate is controlled by counting bytes transferred per time duration.\",\n-                                        \"displayName\": \"data rate\",\n-                                        \"value\": \"data rate\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"TRACE\",\n+                                        \"value\": \"TRACE\"\n                                     },\n                                     {\n-                                        \"description\": \"Rate is controlled by counting FlowFiles transferred per time duration\",\n-                                        \"displayName\": \"flowfile count\",\n-                                        \"value\": \"flowfile count\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"DEBUG\",\n+                                        \"value\": \"DEBUG\"\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\": \"INFO\",\n+                                        \"value\": \"INFO\"\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+                                        \"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\": \"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+                                \"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\": \"Rate Control Criteria\",\n+                                \"name\": \"logsink-log-level\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Rate Controlled Attribute\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"attribute value\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Rate Control Criteria\",\n-                                        \"propertyName\": \"Rate Control Criteria\"\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+                            \"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\": \"Rate Controlled Attribute\",\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.serialization.RecordSetWriterFactory\",\n+                                    \"version\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-record-sink-service-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"f2215c6\"\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"hostname\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Rate Exceeded Strategy\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"The FlowFile will be held in its input queue until the rate of data has fallen below the configured maximum and will then be allowed through.\",\n-                                        \"displayName\": \"Hold FlowFile\",\n-                                        \"value\": \"Hold FlowFile\"\n-                                    },\n-                                    {\n-                                        \"description\": \"The FlowFile will be routed to the 'rate exceeded' Relationship.\",\n-                                        \"displayName\": \"Route to 'rate exceeded'\",\n-                                        \"value\": \"Route to 'rate exceeded'\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"Hold FlowFile\",\n-                                \"description\": \"Specifies how to handle an incoming FlowFile when the maximum data rate has been exceeded.\",\n-                                \"displayName\": \"Rate Exceeded Strategy\",\n+                            \"port\": {\n+                                \"description\": \"Destination port number\",\n+                                \"displayName\": \"Port\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"port\",\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\": \"Rate Exceeded Strategy\",\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\": \"2.0.0-M3\"\n+                                }\n+                            },\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"sender-threads\",\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\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-record-sink-service-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"f2215c6\"\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\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\n+                    }\n+                ],\n+                \"processors\": [],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"2.0.0-M3\"\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\": \"f2215c6\"\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\": \"Maximum Outstanding Requests\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Time Duration\": {\n+                            \"Request Expiration\": {\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+                                \"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\": \"Time Duration\",\n+                                \"name\": \"Request Expiration\",\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+                        \"providedApiImplementations\": [\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+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.http.HttpContextMap\",\n+                                \"version\": \"2.0.0-M3\"\n                             }\n                         ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.standard.HandleHttpRequest\",\n+                            \"org.apache.nifi.processors.standard.HandleHttpResponse\"\n                         ],\n-                        \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"rate\",\n-                            \"rate control\",\n-                            \"throttle\",\n-                            \"throughput\"\n+                            \"http\",\n+                            \"request\",\n+                            \"response\"\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-                        \"useCases\": [\n-                            {\n-                                \"configuration\": \"Set the \\\"Rate Control Criteria\\\" to `data rate`.\\nSet the \\\"Time Duration\\\" property to `1 sec`.\\nConfigure the \\\"Maximum Rate\\\" property to specify how much data should be allowed through each second.\\n\\nFor example, to allow through 8 MB per second, set \\\"Maximum Rate\\\" to `8 MB`.\\n\",\n-                                \"description\": \"Limit the rate at which data is sent to a downstream system with little to no bursts\",\n-                                \"keywords\": [\n-                                    \"throttle\",\n-                                    \"limit\",\n-                                    \"slow down\",\n-                                    \"data rate\"\n-                                ],\n-                                \"notes\": \"\"\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\": \"2.0.0-M3\"\n+                    }\n+                ],\n+                \"processors\": [],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\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\": \"f2215c6\"\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"app-config-file\",\n+                                \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"SINGLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\"\n+                                    ]\n+                                },\n+                                \"sensitive\": false\n                             },\n-                            {\n-                                \"configuration\": \"Set the \\\"Rate Control Criteria\\\" to `flowfile count`.\\nSet the \\\"Time Duration\\\" property to `1 sec`.\\nConfigure the \\\"Maximum Rate\\\" property to specify how many FlowFiles should be allowed through each second.\\n\\nFor example, to allow through 100 FlowFiles per second, set \\\"Maximum Rate\\\" to `100`.\\n\",\n-                                \"description\": \"Limit the rate at which FlowFiles are sent to a downstream system with little to no bursts\",\n-                                \"keywords\": [\n-                                    \"throttle\",\n-                                    \"limit\",\n-                                    \"slow down\",\n-                                    \"flowfile rate\"\n-                                ],\n-                                \"notes\": \"\"\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"app-config-json\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n                             },\n-                            {\n-                                \"configuration\": \"Set the \\\"Rate Control Criteria\\\" to `flowfile count`.\\nSet the \\\"Time Duration\\\" property to `1 sec`.\\nSet the \\\"Rate Exceeded Strategy\\\" property to `Route to 'rate exceeded'`.\\nConfigure the \\\"Maximum Rate\\\" property to specify how many requests should be allowed through each second.\\n\\nFor example, to allow through 100 requests per second, set \\\"Maximum Rate\\\" to `100`.\\nIf more than 100 requests come in during any one second, the additional requests will be routed to `rate exceeded` instead of `success`.\\n\",\n-                                \"description\": \"Reject requests that exceed a specific rate with little to no bursts\",\n-                                \"keywords\": [\n-                                    \"throttle\",\n-                                    \"limit\",\n-                                    \"slow down\",\n-                                    \"request rate\"\n-                                ],\n-                                \"notes\": \"\"\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"box-account-id\",\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\": \"2.0.0-M3\"\n+                                }\n+                            }\n+                        },\n+                        \"providedApiImplementations\": [\n                             {\n-                                \"configuration\": \"Set the \\\"Rate Control Criteria\\\" to `flowfile count`.\\nSet the \\\"Time Duration\\\" property to `1 min`.\\nSet the \\\"Rate Exceeded Strategy\\\" property to `Route to 'rate exceeded'`.\\nConfigure the \\\"Maximum Rate\\\" property to specify how many requests should be allowed through each minute.\\n\\nFor example, to allow through 100 requests per second, set \\\"Maximum Rate\\\" to `6000`.\\nThis will allow through 6,000 FlowFiles per minute, which averages to 100 FlowFiles per second. However, those 6,000 FlowFiles may come all within the first couple of\\nseconds, or they may come in over a period of 60 seconds. As a result, this gives us an average rate of 100 FlowFiles per second but allows for bursts of data.\\nIf more than 6,000 requests come in during any one minute, the additional requests will be routed to `rate exceeded` instead of `success`.\\n\",\n-                                \"description\": \"Reject requests that exceed a specific rate, allowing for bursts\",\n-                                \"keywords\": [\n-                                    \"throttle\",\n-                                    \"limit\",\n-                                    \"slow down\",\n-                                    \"request rate\"\n-                                ],\n-                                \"notes\": \"\"\n+                                \"artifact\": \"nifi-box-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.box.controllerservices.BoxClientService\",\n+                                \"version\": \"2.0.0-M3\"\n                             }\n                         ],\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"box\",\n+                            \"client\",\n+                            \"provider\"\n+                        ],\n+                        \"type\": \"org.apache.nifi.box.controllerservices.JsonConfigBasedBoxClientService\",\n+                        \"typeDescription\": \"Provides Box client objects through which Box API calls can be used.\",\n                         \"version\": \"2.0.0-M3\"\n-                    },\n+                    }\n+                ],\n+                \"processors\": [],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"2.0.0-M3\"\n+        },\n+        {\n+            \"artifact\": \"nifi-distributed-cache-services-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-standard-nar\",\n+                        \"artifact\": \"nifi-distributed-cache-services-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\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-                        \"multiProcessorUseCases\": [],\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+                            \"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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Input Character Set\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Communications Timeout\",\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+                            \"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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Output Character Set\",\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\": \"2.0.0-M3\"\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-                        \"sideEffectFree\": true,\n-                        \"supportedRelationships\": [\n+                        \"providedApiImplementations\": [\n                             {\n-                                \"description\": \"\",\n-                                \"name\": \"success\"\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.distributed.cache.client.DistributedMapCacheClient\",\n+                                \"version\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\n                             }\n                         ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.distributed.cache.server.map.DistributedMapCacheServer\",\n+                            \"org.apache.nifi.ssl.StandardSSLContextService\"\n                         ],\n-                        \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"character set\",\n-                            \"characterset\",\n-                            \"convert\",\n-                            \"text\"\n+                            \"cache\",\n+                            \"cluster\",\n+                            \"distributed\",\n+                            \"map\",\n+                            \"state\"\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-                        \"useCases\": [],\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\": \"2.0.0-M3\"\n                     },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-standard-nar\",\n+                        \"artifact\": \"nifi-distributed-cache-services-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\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-                        \"multiProcessorUseCases\": [],\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+                            \"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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Catalog Name\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Communications Timeout\",\n+                                \"required\": true,\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+                            \"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\": \"JDBC Connection Pool\",\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.dbcp.DBCPService\",\n+                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n                                     \"version\": \"2.0.0-M3\"\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+                            \"Server Hostname\": {\n+                                \"description\": \"The name of the server that is running the DistributedSetCacheServer service\",\n+                                \"displayName\": \"Server Hostname\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Schema Name\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Server Hostname\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Statement Type\": {\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\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-distributed-cache-services-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"f2215c6\"\n+                        },\n+                        \"group\": \"org.apache.nifi\",\n+                        \"propertyDescriptors\": {\n+                            \"Eviction Strategy\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"UPDATE\",\n-                                        \"value\": \"UPDATE\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"INSERT\",\n-                                        \"value\": \"INSERT\"\n+                                        \"displayName\": \"Least Frequently Used\",\n+                                        \"value\": \"Least Frequently Used\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"DELETE\",\n-                                        \"value\": \"DELETE\"\n+                                        \"displayName\": \"Least Recently Used\",\n+                                        \"value\": \"Least Recently Used\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"Use statement.type Attribute\",\n-                                        \"value\": \"Use statement.type Attribute\"\n+                                        \"displayName\": \"First In, First Out\",\n+                                        \"value\": \"First In, First Out\"\n                                     }\n                                 ],\n-                                \"description\": \"Specifies the type of SQL Statement to generate\",\n-                                \"displayName\": \"Statement Type\",\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\": \"Statement Type\",\n+                                \"name\": \"Eviction Strategy\",\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+                            \"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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Table Name\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Maximum Cache Entries\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"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 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+                            \"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\": \"Translate Field Names\",\n+                                \"name\": \"Persistence Directory\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Unmatched Column Behavior\": {\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\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-distributed-cache-services-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"f2215c6\"\n+                        },\n+                        \"group\": \"org.apache.nifi\",\n+                        \"propertyDescriptors\": {\n+                            \"Eviction Strategy\": {\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+                                        \"description\": \"\",\n+                                        \"displayName\": \"Least Frequently Used\",\n+                                        \"value\": \"Least Frequently Used\"\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+                                        \"description\": \"\",\n+                                        \"displayName\": \"Least Recently Used\",\n+                                        \"value\": \"Least Recently Used\"\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+                                        \"description\": \"\",\n+                                        \"displayName\": \"First In, First Out\",\n+                                        \"value\": \"First In, First Out\"\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+                                \"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\": \"Unmatched Column Behavior\",\n-                                \"required\": false,\n+                                \"name\": \"Eviction Strategy\",\n+                                \"required\": true,\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+                            \"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\": \"Unmatched Field Behavior\",\n-                                \"required\": false,\n+                                \"name\": \"Maximum Cache Entries\",\n+                                \"required\": true,\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+                            \"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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Update Keys\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Persistence Directory\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"jts-quoted-identifiers\": {\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\": \"2.0.0-M3\"\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+                        \"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\": \"2.0.0-M3\"\n+                    }\n+                ],\n+                \"processors\": [],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"2.0.0-M3\"\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\": \"f2215c6\"\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+                        \"multiProcessorUseCases\": [],\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\": \"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+                                \"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\": \"jts-quoted-identifiers\",\n-                                \"required\": false,\n+                                \"name\": \"Count Items\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"jts-quoted-table-identifiers\": {\n+                            \"Fingerprint Algorithm\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"displayName\": \"CRC-64-AVRO\",\n+                                        \"value\": \"CRC-64-AVRO\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"displayName\": \"MD5\",\n+                                        \"value\": \"MD5\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SHA-256\",\n+                                        \"value\": \"SHA-256\"\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+                                \"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\": \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"jts-sql-param-attr-prefix\",\n+                                \"name\": \"Fingerprint Algorithm\",\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+                            \"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\": \"table-schema-cache-size\",\n-                                \"required\": true,\n+                                \"name\": \"Metadata Keys\",\n+                                \"required\": false,\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+                                \"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 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\": \"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-                                \"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                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"database\",\n-                            \"delete\",\n-                            \"flat\",\n-                            \"insert\",\n-                            \"json\",\n-                            \"rdbms\",\n-                            \"relational\",\n-                            \"sql\",\n-                            \"update\"\n+                            \"avro\",\n+                            \"metadata\",\n+                            \"schema\"\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.avro.ExtractAvroMetadata\",\n+                        \"typeDescription\": \"Extracts metadata from the header of an Avro datafile.\",\n                         \"useCases\": [],\n                         \"version\": \"2.0.0-M3\",\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+                                \"description\": \"The type of the schema (i.e. record, enum, etc.).\",\n+                                \"name\": \"schema.type\"\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\": \"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 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 result of the Fingerprint Algorithm as a Hex string.\",\n+                                \"name\": \"schema.fingerprint\"\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 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-standard-nar\",\n+                        \"artifact\": \"nifi-avro-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -36052,134 +44035,163 @@\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"multiProcessorUseCases\": [],\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Include Zero Record FlowFiles\": {\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+                            \"Output Strategy\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"description\": \"Avro's object container file format\",\n+                                        \"displayName\": \"Datafile\",\n+                                        \"value\": \"Datafile\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"description\": \"Bare Avro records\",\n+                                        \"displayName\": \"Bare Record\",\n+                                        \"value\": \"Bare Record\"\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+                                \"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\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Include Zero Record FlowFiles\",\n+                                \"name\": \"Output Strategy\",\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+                            \"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\": \"Record Reader\",\n+                                \"name\": \"Split 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\": \"2.0.0-M3\"\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+                            \"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                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Record Writer\",\n+                                \"name\": \"Transfer Metadata\",\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\": \"2.0.0-M3\"\n-                                }\n+                                \"sensitive\": false\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+                                \"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\": \"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\": \"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                         \"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-                            \"convert\",\n-                            \"csv\",\n-                            \"freeform\",\n-                            \"generic\",\n-                            \"json\",\n-                            \"log\",\n-                            \"logs\",\n-                            \"record\",\n-                            \"schema\",\n-                            \"text\"\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-                        \"useCases\": [\n-                            {\n-                                \"configuration\": \"The Record Reader should be configured according to the incoming data format.\\nThe Record Writer should be configured according to the desired output format.\",\n-                                \"description\": \"Convert data from one record-oriented format to another\",\n-                                \"keywords\": [],\n-                                \"notes\": \"\"\n-                            }\n-                        ],\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+                        \"useCases\": [],\n                         \"version\": \"2.0.0-M3\",\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\": \"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 number of records in the FlowFile\",\n-                                \"name\": \"record.count\"\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\": \"This attribute provides on failure the error message encountered by the Reader or Writer.\",\n-                                \"name\": \"record.error.message\"\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+                ],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"2.0.0-M3\"\n+        },\n+        {\n+            \"artifact\": \"nifi-geohash-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n+                \"processors\": [\n                     {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-standard-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-geohash-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -36192,254 +44204,235 @@\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"multiProcessorUseCases\": [],\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"ajust-immediately\": {\n+                            \"geohash-format\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"displayName\": \"BASE32\",\n+                                        \"value\": \"BASE32\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"displayName\": \"BINARY\",\n+                                        \"value\": \"BINARY\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"LONG\",\n+                                        \"value\": \"LONG\"\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+                                \"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\": \"ajust-immediately\",\n+                                \"name\": \"geohash-format\",\n                                 \"required\": true,\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+                            \"geohash-level\": {\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"US-ASCII\",\n-                                        \"value\": \"US-ASCII\"\n+                                        \"dependentValues\": [\n+                                            \"ENCODE\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Mode\",\n+                                        \"propertyName\": \"mode\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"UTF-8\",\n-                                \"description\": \"Specifies a character encoding to use.\",\n-                                \"displayName\": \"Character Encoding\",\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\": \"character-encoding\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"geohash-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+                            \"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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"split-words-on-symbols\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"geohash-record-path\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"text-character-count\": {\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\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"latitude-record-path\",\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"longitude-record-path\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"mode\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"displayName\": \"ENCODE\",\n+                                        \"value\": \"ENCODE\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"displayName\": \"DECODE\",\n+                                        \"value\": \"DECODE\"\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+                                \"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\": \"text-character-count\",\n+                                \"name\": \"mode\",\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+                            \"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\": \"text-line-count\",\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\": \"2.0.0-M3\"\n+                                }\n                             },\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\": \"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+                            \"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\": \"text-line-nonempty-count\",\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\": \"2.0.0-M3\"\n+                                }\n                             },\n-                            \"text-word-count\": {\n+                            \"routing-strategy\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"displayName\": \"SKIP\",\n+                                        \"value\": \"SKIP\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"displayName\": \"SPLIT\",\n+                                        \"value\": \"SPLIT\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"REQUIRE\",\n+                                        \"value\": \"REQUIRE\"\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+                                \"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\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"text-word-count\",\n+                                \"name\": \"routing-strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.standard.SplitText\"\n-                        ],\n                         \"sideEffectFree\": true,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"The flowfile contains the original content with one or more attributes added containing the respective counts\",\n+                                \"description\": \"Flowfiles that are successfully encoded or decoded will be routed 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\": \"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                         ],\n                         \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"character\",\n-                            \"count\",\n-                            \"line\",\n-                            \"text\",\n-                            \"word\"\n+                            \"geo\",\n+                            \"geohash\",\n+                            \"record\"\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+                        \"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                         \"useCases\": [],\n                         \"version\": \"2.0.0-M3\",\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+                                \"description\": \"The MIME type indicated by the record writer\",\n+                                \"name\": \"mime.type\"\n                             },\n                             {\n-                                \"description\": \"The number of characters (given the specified character encoding) present in the original FlowFile\",\n-                                \"name\": \"text.character.count\"\n+                                \"description\": \"The number of records in the resulting flow file\",\n+                                \"name\": \"record.count\"\n                             }\n                         ]\n-                    },\n+                    }\n+                ],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"2.0.0-M3\"\n+        },\n+        {\n+            \"artifact\": \"nifi-evtx-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n+                \"processors\": [\n                     {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-standard-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-evtx-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -36452,1889 +44445,2116 @@\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"multiProcessorUseCases\": [],\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"fail_when_empty\": {\n+                            \"granularity\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"displayName\": \"Record\",\n+                                        \"value\": \"Record\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\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+                                        \"displayName\": \"Chunk\",\n+                                        \"value\": \"Chunk\"\n                                     },\n                                     {\n-                                        \"description\": \"BLAKE2-512 (64 byte output) Also known as Blake2b\",\n-                                        \"displayName\": \"BLAKE2-512\",\n-                                        \"value\": \"BLAKE2-512\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"File\",\n+                                        \"value\": \"File\"\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+                                \"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\": \"hash_algorithm\",\n+                                \"name\": \"granularity\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n+                        \"readsAttributes\": [\n+                            {\n+                                \"description\": \"The filename of the evtx file\",\n+                                \"name\": \"filename\"\n+                            }\n+                        ],\n                         \"sideEffectFree\": true,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"Used for flowfiles that have a hash value added\",\n+                                \"description\": \"Any FlowFile that was successfully converted from evtx to XML\",\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 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                         ],\n                         \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"blake2\",\n-                            \"content\",\n-                            \"cryptography\",\n-                            \"hash\",\n-                            \"md5\",\n-                            \"sha\"\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.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.evtx.ParseEvtx\",\n+                        \"typeDescription\": \"Parses the contents of a Windows Event Log file (evtx) and writes the resulting XML to the FlowFile\",\n                         \"useCases\": [],\n                         \"version\": \"2.0.0-M3\",\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\": \"The output filename\",\n+                                \"name\": \"filename\"\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                             }\n                         ]\n-                    },\n+                    }\n+                ],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"2.0.0-M3\"\n+        },\n+        {\n+            \"artifact\": \"nifi-slack-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-standard-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-slack-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\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-                        \"multiProcessorUseCases\": [],\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+                            \"access-token\": {\n+                                \"description\": \"Bot OAuth Token used for authenticating and authorizing the Slack request sent by NiFi.\",\n+                                \"displayName\": \"Access Token\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"@OnScheduled Pause Time\",\n+                                \"name\": \"access-token\",\n                                 \"required\": true,\n-                                \"sensitive\": false\n+                                \"sensitive\": true\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+                            \"api-url\": {\n+                                \"defaultValue\": \"https://slack.com/api\",\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\": \"API URL\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"@OnStopped Pause Time\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"api-url\",\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+                            \"channel-id\": {\n+                                \"description\": \"Slack channel, private group, or IM channel to send the message to. Use Channel ID instead of the name.\",\n+                                \"displayName\": \"Channel ID\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"@OnUnscheduled Pause Time\",\n+                                \"name\": \"channel-id\",\n                                 \"required\": true,\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+                            \"input-character-set\": {\n+                                \"defaultValue\": \"UTF-8\",\n+                                \"description\": \"Specifies the character set of the records used to generate the Slack message.\",\n+                                \"displayName\": \"Input Character Set\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Content Size\",\n+                                \"name\": \"input-character-set\",\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+                            \"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\": \"CustomValidate Pause 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\": \"2.0.0-M3\"\n+                                }\n+                            },\n+                            \"web-service-client-provider\": {\n+                                \"description\": \"Controller service to provide HTTP client for communicating with Slack API\",\n+                                \"displayName\": \"Web Service Client Provider\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"web-service-client-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\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\n+                            }\n+                        ],\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"record\",\n+                            \"sink\",\n+                            \"slack\"\n+                        ],\n+                        \"type\": \"org.apache.nifi.services.slack.SlackRecordSink\",\n+                        \"typeDescription\": \"Format and send Records to a configured Channel using the Slack Post Message API. The service requires a Slack App with a Bot User configured for access to a Slack workspace. The Bot User OAuth Bearer Token is required for posting messages to Slack.\",\n+                        \"version\": \"2.0.0-M3\"\n+                    }\n+                ],\n+                \"processors\": [\n+                    {\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-slack-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"f2215c6\"\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_FORBIDDEN\",\n+                        \"multiProcessorUseCases\": [],\n+                        \"primaryNodeOnly\": true,\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. It must be granted the channels:history, groups:history, im:history, or mpim:history scope, depending on the type of conversation being used.\",\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+                            \"Batch Size\": {\n+                                \"defaultValue\": \"100\",\n+                                \"description\": \"The maximum number of messages to retrieve in a single request to Slack. The entire response will be parsed into memory, so it is important that this be kept in mind when setting this value.\",\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-                            \"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\": \"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+                            \"Channels\": {\n+                                \"description\": \"A comma-separated list of Slack Channels to Retrieve Messages From. Each element in the list may be either a Channel ID, such as C0L9VCD47, or (for public channels only) the name of a channel, prefixed with a # sign, such as #general. If any channel name is provided instead,instead of an ID, the Access Token provided must be granted the channels:read scope in order to resolve the Channel ID. See the Processor's Additional Details for information on how to find a Channel ID.\",\n+                                \"displayName\": \"Channels\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Fail When @OnScheduled called\",\n+                                \"name\": \"Channels\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Fail When @OnStopped called\": {\n+                            \"Include Message Blocks\": {\n                                 \"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+                                \"description\": \"Specifies whether or not the output JSON should include the value of the 'blocks' field for each Slack Message. This field includes information such as individual parts of a message that are formatted using rich text. This may be useful, for instance, for parsing. However, it often accounts for a significant portion of the data and as such may be set to null when it is not useful to you.\",\n+                                \"displayName\": \"Include Message Blocks\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Fail When @OnStopped called\",\n+                                \"name\": \"Include Message Blocks\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Fail When @OnUnscheduled called\": {\n+                            \"Include Null 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\": \"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+                                \"defaultValue\": \"true\",\n+                                \"description\": \"Specifies whether or not fields that have null values should be included in the output JSON. If true, any field in a Slack Message that has a null value will be included in the JSON with a value of null. If false, the key omitted from the output JSON entirely. Omitting null values results in smaller messages that are generally more efficient to process, but including the values may provide a better understanding of the format, especially for schema inference.\",\n+                                \"displayName\": \"Include Null Fields\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Fail When @OnUnscheduled called\",\n+                                \"name\": \"Include Null Fields\",\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+                            \"Reply Monitor Frequency\": {\n+                                \"defaultValue\": \"5 mins\",\n+                                \"description\": \"After consuming all messages in a given channel, this Processor will periodically poll all \\\"threaded messages\\\", aka Replies, whose timestamp falls between now and the amount of time specified by the <Reply Monitor Window> property. This property determines how frequently those messages are polled. Setting the value to a shorter duration may result in replies to messages being captured more quickly, providing a lower latency. However, it will also result in additional resource use and could trigger Rate Limiting to occur.\",\n+                                \"displayName\": \"Reply Monitor Frequency\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"FlowFile Exception Class\",\n+                                \"name\": \"Reply Monitor Frequency\",\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+                            \"Reply Monitor Window\": {\n+                                \"defaultValue\": \"7 days\",\n+                                \"description\": \"After consuming all messages in a given channel, this Processor will periodically poll all \\\"threaded messages\\\", aka Replies, whose timestamp is between now and this amount of time in the past in order to check for any new replies. Setting this value to a larger value may result in additional resource use and may result in Rate Limiting. However, if a user replies to an old thread that was started outside of this window, the reply may not be captured.\",\n+                                \"displayName\": \"Reply Monitor Window\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"FlowFile Exception Iterations\",\n+                                \"name\": \"Reply Monitor Window\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"FlowFile Failure Iterations\": {\n-                                \"defaultValue\": \"0\",\n-                                \"description\": \"Number of FlowFiles to forward to failure relationship.\",\n-                                \"displayName\": \"FlowFile Failure Iterations\",\n+                            \"Resolve Usernames\": {\n+                                \"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 User IDs should be resolved to usernames. By default, Slack Messages provide the ID of the user that sends a message, such as U0123456789, but not the username, such as NiFiUser. The username may be resolved, but it may require additional calls to the Slack API and requires that the Token used be granted the users:read scope. If set to true, usernames will be resolved with a best-effort policy: if a username cannot be obtained, it will be skipped over. Also, note that when a username is obtained, the Message's <username> field is populated, and the <text> field is updated such that any mention will be output such as \\\"Hi @user\\\" instead of \\\"Hi <@U1234567>\\\".\",\n+                                \"displayName\": \"Resolve Usernames\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"FlowFile Failure Iterations\",\n+                                \"name\": \"Resolve Usernames\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n+                            }\n+                        },\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.slack.ListenSlack\"\n+                        ],\n+                        \"sideEffectFree\": false,\n+                        \"stateful\": {\n+                            \"description\": \"Maintains a mapping of Slack Channel IDs to the timestamp of the last message that was retrieved for that channel. This allows the processor to only retrieve messages that have been posted since the last time the processor was run. This state is stored in the cluster so that if the Primary Node changes, the new node will pick up where the previous node left off.\",\n+                            \"scopes\": [\n+                                \"CLUSTER\"\n+                            ]\n+                        },\n+                        \"supportedRelationships\": [\n+                            {\n+                                \"description\": \"Slack messages that are successfully received will be 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+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"conversation\",\n+                            \"conversation.history\",\n+                            \"slack\",\n+                            \"social media\",\n+                            \"team\",\n+                            \"text\",\n+                            \"unstructured\"\n+                        ],\n+                        \"triggerSerially\": true,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.slack.ConsumeSlack\",\n+                        \"typeDescription\": \"Retrieves messages from one or more configured Slack channels. The messages are written out in JSON format. See Usage / Additional Details for more information about how to configure this Processor and enable it to retrieve messages from Slack.\",\n+                        \"useCases\": [],\n+                        \"version\": \"2.0.0-M3\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"The ID of the Slack Channel from which the messages were retrieved\",\n+                                \"name\": \"slack.channel.id\"\n                             },\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\": \"FlowFile Rollback Iterations\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n+                            {\n+                                \"description\": \"The number of slack messages that are included in the FlowFile\",\n+                                \"name\": \"slack.message.count\"\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+                            {\n+                                \"description\": \"Set to application/json, as the output will always be in JSON format\",\n+                                \"name\": \"mime.type\"\n+                            }\n+                        ]\n+                    },\n+                    {\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-slack-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"f2215c6\"\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\": \"250 millis\",\n+                        \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n+                        \"multiProcessorUseCases\": [],\n+                        \"primaryNodeOnly\": true,\n+                        \"propertyDescriptors\": {\n+                            \"App Token\": {\n+                                \"description\": \"The Application Token that is registered to your Slack application\",\n+                                \"displayName\": \"App Token\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"FlowFile Rollback Penalty Iterations\",\n+                                \"name\": \"App Token\",\n                                 \"required\": true,\n-                                \"sensitive\": false\n+                                \"sensitive\": true\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+                            \"Bot Token\": {\n+                                \"description\": \"The Bot Token that is registered to your Slack application\",\n+                                \"displayName\": \"Bot Token\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"FlowFile Rollback Yield Iterations\",\n+                                \"name\": \"Bot Token\",\n                                 \"required\": true,\n-                                \"sensitive\": false\n+                                \"sensitive\": true\n                             },\n-                            \"FlowFile Success Iterations\": {\n-                                \"defaultValue\": \"1\",\n-                                \"description\": \"Number of FlowFiles to forward to success relationship.\",\n-                                \"displayName\": \"FlowFile Success Iterations\",\n+                            \"Event Type to Receive\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"The Processor is to receive only slack messages that mention the bot user (App Mention Events)\",\n+                                        \"displayName\": \"Receive App Mention Events\",\n+                                        \"value\": \"Receive App Mention Events\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The Processor is to receive Slack Message Events\",\n+                                        \"displayName\": \"Receive Message Events\",\n+                                        \"value\": \"Receive Message Events\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The Processor is to receive Commands from Slack that are specific to your application. The Processor will not receive Message Events.\",\n+                                        \"displayName\": \"Receive Commands\",\n+                                        \"value\": \"Receive Commands\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"Receive App Mention Events\",\n+                                \"description\": \"Specifies the type of Event that the Processor should respond to\",\n+                                \"displayName\": \"Event Type to Receive\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"FlowFile Success Iterations\",\n+                                \"name\": \"Event Type to Receive\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Ignore Interrupts When Paused\": {\n+                            \"Resolve User Details\": {\n                                 \"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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Ignore Interrupts When Paused\",\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-                                \"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+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"Receive App Mention Events\",\n+                                            \"Receive Message Events\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Event Type to Receive\",\n+                                        \"propertyName\": \"Event Type to Receive\"\n+                                    }\n+                                ],\n+                                \"description\": \"Specifies whether the Processor should lookup details about the Slack User who sent the received message. If true, the output JSON will contain an additional field named 'userDetails'. The 'user' field will still contain the ID of the user. In order to enable this capability, the Bot Token must be granted the 'users:read' and optionally the 'users.profile:read' Bot Token Scope. If the rate limit is exceeded when retrieving this information, the received message will be rejected and must be re-delivered.\",\n+                                \"displayName\": \"Resolve User Details\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Write Iterations\",\n+                                \"name\": \"Resolve User Details\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.slack.ConsumeSlack\"\n+                        ],\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"FlowFiles processed successfully.\",\n+                                \"description\": \"All FlowFiles that are created will be sent to this Relationship.\",\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                         ],\n                         \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"FlowFile\",\n-                            \"debug\",\n-                            \"flow\",\n-                            \"processor\",\n-                            \"test\",\n-                            \"utility\"\n+                            \"command\",\n+                            \"event\",\n+                            \"listen\",\n+                            \"message\",\n+                            \"real-time\",\n+                            \"receive\",\n+                            \"slack\",\n+                            \"social media\",\n+                            \"team\",\n+                            \"text\",\n+                            \"unstructured\"\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.slack.ListenSlack\",\n+                        \"typeDescription\": \"Retrieves real-time messages or Slack commands from one or more Slack conversations. The messages are written out in JSON format. Note that this Processor should be used to obtain real-time messages and commands from Slack and does not provide a mechanism for obtaining historical messages. The ConsumeSlack Processor should be used for an initial load of messages from a channel. See Usage / Additional Details for more information about how to configure this Processor and enable it to retrieve messages and commands from Slack.\",\n                         \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\"\n+                        \"version\": \"2.0.0-M3\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"Set to application/json, as the output will always be in JSON format\",\n+                                \"name\": \"mime.type\"\n+                            }\n+                        ]\n                     },\n                     {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-standard-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-slack-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\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+                        \"defaultYieldDuration\": \"3 sec\",\n+                        \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"multiProcessorUseCases\": [\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+                                \"configurations\": [\n+                                    {\n+                                        \"configuration\": \"Set \\\"Destination\\\" to \\\"flowfile-attribute\\\"\\n\\nAdd a new property named \\\"thread.ts\\\" with a value of `$.threadTs`\\nAdd a new property named \\\"message.ts\\\" with a value of `$.ts`\\nAdd a new property named \\\"channel.id\\\" with a value of `$.channel`\\nAdd a new property named \\\"user.id\\\" with a value of `$.user`\\n\\nConnect the \\\"matched\\\" Relationship to PublishSlack.\\n\",\n+                                        \"processorClassName\": \"org.apache.nifi.processors.standard.EvaluateJsonPath\"\n+                                    },\n+                                    {\n+                                        \"configuration\": \"Set \\\"Access Token\\\" to the value of your Slack OAuth Access Token.\\nSet \\\"Channel\\\" to `${'channel.id'}`\\nSet \\\"Publish Strategy\\\" to \\\"Use 'Message Text' Property\\\".\\nSet \\\"Message Text\\\" to the text that you would like to send as the response. If desired, you can reference the user of the original message by including the text `<@${'user.id'}>`.\\n    For example: `Hey, <@${'user.id'}>, thanks for asking...`\\nSet \\\"Include FlowFile Content as Attachment\\\" to \\\"false\\\".\\nSet \\\"Thread Timestamp\\\" to `${'thread.ts':replaceEmpty( ${'message.ts'} )}`\\n\",\n+                                        \"processorClassName\": \"org.apache.nifi.processors.slack.PublishSlack\"\n+                                    }\n+                                ],\n+                                \"description\": \"Respond to a Slack message in a thread.\",\n+                                \"keywords\": [\n+                                    \"slack\",\n+                                    \"respond\",\n+                                    \"reply\",\n+                                    \"thread\"\n+                                ],\n+                                \"notes\": \"\"\n                             }\n                         ],\n-                        \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n-                        \"multiProcessorUseCases\": [],\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+                            \"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\": \"bloom-filter-certainty\",\n-                                \"required\": false,\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\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Channel\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"cache-identifier\": {\n+                            \"Character Set\": {\n+                                \"defaultValue\": \"UTF-8\",\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"multiple\"\n+                                            \"Send FlowFile Content as Message\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Deduplication Strategy\",\n-                                        \"propertyName\": \"deduplication-strategy\"\n+                                        \"propertyDisplayName\": \"Publish Strategy\",\n+                                        \"propertyName\": \"Publish 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+                                \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"cache-identifier\",\n-                                \"required\": false,\n+                                \"name\": \"Character Set\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"deduplication-strategy\": {\n+                            \"Include FlowFile Content as Attachment\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"Single File\",\n-                                        \"value\": \"single\"\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"Multiple Files\",\n-                                        \"value\": \"multiple\"\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"deduplication-strategy\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"distributed-map-cache\": {\n+                                \"defaultValue\": \"false\",\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"multiple\"\n+                                            \"Use 'Message Text' Property\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Deduplication Strategy\",\n-                                        \"propertyName\": \"deduplication-strategy\"\n+                                        \"propertyDisplayName\": \"Publish Strategy\",\n+                                        \"propertyName\": \"Publish Strategy\"\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+                                \"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\": \"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\": \"2.0.0-M3\"\n-                                }\n+                                \"name\": \"Include FlowFile Content as Attachment\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             },\n-                            \"filter-capacity-hint\": {\n-                                \"defaultValue\": \"25000\",\n+                            \"Max FlowFile Size\": {\n+                                \"defaultValue\": \"1 MB\",\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"bloom-filter\"\n+                                            \"true\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Filter Type\",\n-                                        \"propertyName\": \"filter-type\"\n+                                        \"propertyDisplayName\": \"Include FlowFile Content as Attachment\",\n+                                        \"propertyName\": \"Include FlowFile Content as Attachment\"\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+                                \"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\": \"filter-capacity-hint\",\n+                                \"name\": \"Max FlowFile Size\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\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+                            \"Message Text\": {\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"single\"\n+                                            \"Use 'Message Text' Property\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Deduplication Strategy\",\n-                                        \"propertyName\": \"deduplication-strategy\"\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"filter-type\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\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+                                        \"propertyDisplayName\": \"Publish Strategy\",\n+                                        \"propertyName\": \"Publish Strategy\"\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\": \"The text of the message to send to Slack.\",\n+                                \"displayName\": \"Message Text\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"include-zero-record-flowfiles\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Message Text\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"put-cache-identifier\": {\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-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"propertyDisplayName\": \"Distributed Map Cache client\",\n-                                        \"propertyName\": \"distributed-map-cache\"\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-                                \"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+                                \"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\": \"put-cache-identifier\",\n+                                \"name\": \"Publish Strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"record-hashing-algorithm\": {\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-                                    },\n-                                    {\n-                                        \"description\": \"SHA-512 cryptographic hashing algorithm.\",\n-                                        \"displayName\": \"SHA-512\",\n-                                        \"value\": \"SHA-512\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"SHA-256\",\n-                                \"description\": \"The algorithm used to hash the cache key.\",\n-                                \"displayName\": \"Record Hashing Algorithm\",\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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"record-hashing-algorithm\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Thread Timestamp\",\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\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\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.slack.ConsumeSlack\",\n+                            \"org.apache.nifi.processors.slack.ListenSlack\"\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+                                \"description\": \"FlowFiles are routed to 'rate limited' if the Rate Limit has been exceeded\",\n+                                \"name\": \"rate limited\"\n                             },\n                             {\n-                                \"description\": \"If unable to communicate with the cache, the FlowFile will be penalized and routed to this relationship\",\n+                                \"description\": \"FlowFiles are routed to 'failure' if unable to be sent to Slack for any other reason\",\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+                                \"description\": \"FlowFiles are routed to success after being successfully sent to Slack\",\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                         \"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+                            \"chat.postMessage\",\n+                            \"conversation\",\n+                            \"publish\",\n+                            \"send\",\n+                            \"slack\",\n+                            \"social media\",\n+                            \"team\",\n                             \"text\",\n-                            \"unique\",\n-                            \"update\"\n+                            \"unstructured\",\n+                            \"upload\",\n+                            \"write\"\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-                        \"useCases\": [],\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\\nthe 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\\na file attachment.\\n\",\n+                        \"useCases\": [\n+                            {\n+                                \"configuration\": \"Set \\\"Access Token\\\" to the value of your Slack OAuth Access Token.\\nSet \\\"Channel\\\" to the ID of the channel or the name of the channel prefixed with the # symbol. For example, \\\"C0123456789\\\" or \\\"#general\\\".\\nSet \\\"Publish Strategy\\\" to \\\"Use 'Message Text' Property\\\".\\nSet \\\"Message Text\\\" to the text that you would like to send as the Slack message.\\nSet \\\"Include FlowFile Content as Attachment\\\" to \\\"true\\\" if the FlowFile's contents should be attached as a file, or \\\"false\\\" to send just the message text without an attachment.\\n\",\n+                                \"description\": \"Send specific text as a message to Slack, optionally including the FlowFile's contents as an attached file.\",\n+                                \"keywords\": [],\n+                                \"notes\": \"\"\n+                            },\n+                            {\n+                                \"configuration\": \"Set \\\"Access Token\\\" to the value of your Slack OAuth Access Token.\\nSet \\\"Channel\\\" to the ID of the channel or the name of the channel prefixed with the # symbol. For example, \\\"C0123456789\\\" or \\\"#general\\\".\\nSet \\\"Publish Strategy\\\" to \\\"Send FlowFile Content as Message\\\".\\n\",\n+                                \"description\": \"Send the contents of the FlowFile as a message to Slack.\",\n+                                \"keywords\": [],\n+                                \"notes\": \"\"\n+                            }\n+                        ],\n                         \"version\": \"2.0.0-M3\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"Number of records written to the destination FlowFile.\",\n-                                \"name\": \"record.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+                ],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"2.0.0-M3\"\n+        },\n+        {\n+            \"artifact\": \"nifi-oauth2-provider-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-standard-nar\",\n+                        \"artifact\": \"nifi-oauth2-provider-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\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-                        \"multiProcessorUseCases\": [],\n-                        \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Age Off Duration\": {\n-                                \"description\": \"Time interval to age off cached FlowFiles\",\n-                                \"displayName\": \"Age Off Duration\",\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\": \"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\": \"Age Off Duration\",\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"audience\",\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+                            \"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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Cache Entry Identifier\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"authorization-server-url\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Cache The Entry Identifier\": {\n+                            \"client-authentication-strategy\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\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\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"description\": \"Send client authentication using HTTP Basic authentication.\",\n+                                        \"displayName\": \"BASIC_AUTHENTICATION\",\n+                                        \"value\": \"BASIC_AUTHENTICATION\"\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+                                \"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\": \"Cache The Entry Identifier\",\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"client-id\",\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+                            \"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\": \"Distributed Cache Service\",\n+                                \"name\": \"client-secret\",\n+                                \"required\": true,\n+                                \"sensitive\": true\n+                            },\n+                            \"grant-type\": {\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+                                    },\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+                                    },\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+                                    }\n+                                ],\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\": \"grant-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: 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.distributed.cache.client.DistributedMapCacheClient\",\n+                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n                                     \"version\": \"2.0.0-M3\"\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+                            \"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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"FlowFile Description\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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-                        },\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-                                \"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+                            \"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+                                \"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+                                \"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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"service-user-name\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             },\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+                                \"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\": \"2.0.0-M3\"\n+                                }\n+                            }\n+                        },\n+                        \"providedApiImplementations\": [\n                             {\n-                                \"description\": \"If unable to communicate with the cache, the FlowFile will be penalized and 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\": \"2.0.0-M3\"\n                             }\n                         ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"dedupe\",\n-                            \"dupe\",\n-                            \"duplicate\",\n-                            \"hash\"\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.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-                        \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\",\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+                        \"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\": \"2.0.0-M3\"\n+                    }\n+                ],\n+                \"processors\": [],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"2.0.0-M3\"\n+        },\n+        {\n+            \"artifact\": \"nifi-hazelcast-services-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [\n                     {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-standard-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-hazelcast-services-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\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\": \"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-                        ],\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-                        \"multiProcessorUseCases\": [],\n-                        \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Distribution Strategy\": {\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-                                    },\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-                                    {\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\": \"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+                            \"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\": \"Distribution Strategy\",\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\": \"2.0.0-M3\"\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"hazelcast-cache-name\",\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+                            \"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\": \"Number of Relationships\",\n+                                \"name\": \"hazelcast-entry-ttl\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"sideEffectFree\": true,\n-                        \"supportedRelationships\": [\n+                        \"providedApiImplementations\": [\n                             {\n-                                \"description\": \"Where to route flowfiles for this relationship index\",\n-                                \"name\": \"1\"\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.distributed.cache.client.DistributedMapCacheClient\",\n+                                \"version\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\n                             }\n                         ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": true,\n-                        \"supportsDynamicRelationships\": true,\n+                        \"supportsDynamicProperties\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"distribute\",\n-                            \"load balance\",\n-                            \"round robin\",\n-                            \"route\",\n-                            \"weighted\"\n+                            \"cache\",\n+                            \"hazelcast\",\n+                            \"map\"\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-                        \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\",\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+                        \"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\": \"2.0.0-M3\"\n                     },\n                     {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-standard-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-hazelcast-services-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\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-                        \"multiProcessorUseCases\": [],\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+                            \"hazelcast-cluster-name\": {\n+                                \"defaultValue\": \"nifi\",\n+                                \"description\": \"Name of the Hazelcast cluster.\",\n+                                \"displayName\": \"Hazelcast Cluster Name\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Number of Copies\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"hazelcast-cluster-name\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"hazelcast-clustering-strategy\": {\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+                                    },\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+                                    }\n+                                ],\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\": \"hazelcast-clustering-strategy\",\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"hazelcast-port\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"sideEffectFree\": false,\n-                        \"supportedRelationships\": [\n+                        \"providedApiImplementations\": [\n                             {\n-                                \"description\": \"The original FlowFile and all copies will be sent to this relationship\",\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\": \"2.0.0-M3\"\n                             }\n                         ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"duplicate\",\n-                            \"load\",\n-                            \"test\"\n+                            \"cache\",\n+                            \"hazelcast\"\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-                        \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\",\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.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\": \"2.0.0-M3\"\n                     },\n                     {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-standard-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-hazelcast-services-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\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-                        \"multiProcessorUseCases\": [],\n-                        \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Encoded Line Length\": {\n-                                \"defaultValue\": \"76\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"base32\",\n-                                            \"base64\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Encoding\",\n-                                        \"propertyName\": \"Encoding\"\n-                                    },\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"MULTIPLE_LINES\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Line Output Mode\",\n-                                        \"propertyName\": \"Line Output Mode\"\n-                                    },\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"Encode\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Mode\",\n-                                        \"propertyName\": \"Mode\"\n-                                    }\n-                                ],\n-                                \"description\": \"Each line of encoded data will contain up to the configured number of characters, rounded down to the nearest multiple of 4.\",\n-                                \"displayName\": \"Encoded Line Length\",\n+                            \"hazelcast-cluster-name\": {\n+                                \"defaultValue\": \"nifi\",\n+                                \"description\": \"Name of the Hazelcast cluster.\",\n+                                \"displayName\": \"Hazelcast Cluster Name\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Encoded Line Length\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"hazelcast-cluster-name\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Encoding\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Encode or decode using Base64 set of characters\",\n-                                        \"displayName\": \"Base64\",\n-                                        \"value\": \"base64\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Encode or decode using Base32 set of characters\",\n-                                        \"displayName\": \"Base32\",\n-                                        \"value\": \"base32\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Encode or decode using hexadecimal set of characters\",\n-                                        \"displayName\": \"Hexadecimal\",\n-                                        \"value\": \"hex\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"base64\",\n-                                \"description\": \"Specifies the type of encoding used.\",\n-                                \"displayName\": \"Encoding\",\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\": \"Encoding\",\n+                                \"name\": \"hazelcast-connection-timeout\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Line Output Mode\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"The encoded content will be written as a single line.\",\n-                                        \"displayName\": \"Single Line\",\n-                                        \"value\": \"SINGLE_LINE\"\n-                                    },\n-                                    {\n-                                        \"description\": \"The encoded content will be written as multiple lines.\",\n-                                        \"displayName\": \"Multiple Lines\",\n-                                        \"value\": \"MULTIPLE_LINES\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"SINGLE_LINE\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"Encode\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Mode\",\n-                                        \"propertyName\": \"Mode\"\n-                                    },\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"base32\",\n-                                            \"base64\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Encoding\",\n-                                        \"propertyName\": \"Encoding\"\n-                                    }\n-                                ],\n-                                \"description\": \"Controls the line formatting for encoded content based on selected property values.\",\n-                                \"displayName\": \"Line Output Mode\",\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\": \"Line Output Mode\",\n+                                \"name\": \"hazelcast-retry-backoff-initial\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Mode\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Transform original input to encoded representation\",\n-                                        \"displayName\": \"Encode\",\n-                                        \"value\": \"Encode\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Transform encoded input to original representation\",\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+                            \"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\": \"Mode\",\n+                                \"name\": \"hazelcast-retry-backoff-maximum\",\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"hazelcast-server-address\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"sideEffectFree\": true,\n-                        \"supportedRelationships\": [\n+                        \"providedApiImplementations\": [\n                             {\n-                                \"description\": \"Any FlowFile that is successfully encoded or decoded will be routed to success\",\n-                                \"name\": \"success\"\n-                            },\n+                                \"artifact\": \"nifi-hazelcast-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.hazelcast.services.cachemanager.HazelcastCacheManager\",\n+                                \"version\": \"2.0.0-M3\"\n+                            }\n+                        ],\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"cache\",\n+                            \"hazelcast\"\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\": \"2.0.0-M3\"\n+                    }\n+                ],\n+                \"processors\": [],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\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\": \"f2215c6\"\n+                        },\n+                        \"explicitRestrictions\": [\n                             {\n-                                \"description\": \"Any FlowFile that cannot be encoded or decoded will be routed to failure\",\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+                        \"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\": \"Environment variables 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+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.fileresource.service.api.FileResourceService\",\n+                                \"version\": \"2.0.0-M3\"\n+                            }\n                         ],\n-                        \"supportsBatching\": true,\n+                        \"restricted\": true,\n                         \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"base32\",\n-                            \"base64\",\n-                            \"decode\",\n-                            \"encode\",\n-                            \"hex\"\n+                            \"file\",\n+                            \"resource\"\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-                        \"useCases\": [],\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\": \"2.0.0-M3\"\n-                    },\n+                    }\n+                ],\n+                \"processors\": [],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"2.0.0-M3\"\n+        },\n+        {\n+            \"artifact\": \"nifi-airtable-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n+                \"processors\": [\n                     {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-standard-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-airtable-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\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+                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n                         \"multiProcessorUseCases\": [],\n-                        \"primaryNodeOnly\": false,\n+                        \"primaryNodeOnly\": true,\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+                            \"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\": \"batch-count\",\n+                                \"name\": \"api-key\",\n                                 \"required\": true,\n-                                \"sensitive\": false\n+                                \"sensitive\": true\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+                            \"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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"group-id\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"api-url\",\n                                 \"required\": true,\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+                            \"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\": \"inactive-timeout\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"base-id\",\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+                            \"custom-filter\": {\n+                                \"description\": \"Filter records by Airtable's formulas.\",\n+                                \"displayName\": \"Custom Filter\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"initial-order\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"custom-filter\",\n+                                \"required\": false,\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+                            \"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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"maximum-order\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"fields\",\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+                            \"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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"order-attribute\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"query-time-window-lag\",\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+                            \"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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"wait-timeout\",\n+                                \"name\": \"web-client-service-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.web.client.provider.api.WebClientServiceProvider\",\n+                                    \"version\": \"2.0.0-M3\"\n+                                }\n                             }\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+                            \"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-                                \"LOCAL\"\n+                                \"CLUSTER\"\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\": \"For FlowFiles created as a result of a successful query.\",\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                         ],\n                         \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"order\",\n-                            \"sort\"\n+                            \"airtable\",\n+                            \"database\",\n+                            \"query\"\n                         ],\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+                        \"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                         \"useCases\": [],\n                         \"version\": \"2.0.0-M3\",\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+                                \"description\": \"Sets the number of records in the FlowFile.\",\n+                                \"name\": \"record.count\"\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+                                \"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\": \"FlowFiles routed to 'failure' or 'skipped' relationship will have this attribute describing details.\",\n-                                \"name\": \"EnforceOrder.detail\"\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\": \"FlowFiles routed to 'wait' or 'skipped' relationship will have this attribute denoting expected order when the FlowFile was processed.\",\n-                                \"name\": \"EnforceOrder.expectedOrder\"\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\": \"2.0.0-M3\"\n+        },\n+        {\n+            \"artifact\": \"nifi-elasticsearch-restapi-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n+                \"processors\": [\n                     {\n                         \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-standard-nar\",\n+                        \"artifact\": \"nifi-elasticsearch-restapi-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\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\": \"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+                                \"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\": \"ENVIRONMENT\",\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_FORBIDDEN\",\n                         \"multiProcessorUseCases\": [],\n-                        \"primaryNodeOnly\": false,\n+                        \"primaryNodeOnly\": true,\n                         \"propertyDescriptors\": {\n-                            \"Destination\": {\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\": \"Environment variables 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\": \"2.0.0-M3\"\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\": \"Environment variables 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\": \"flowfile-content\",\n-                                        \"value\": \"flowfile-content\"\n+                                        \"description\": \"Contains full Elasticsearch Aggregation, including Buckets and Metadata.\",\n+                                        \"displayName\": \"FULL\",\n+                                        \"value\": \"FULL\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"flowfile-attribute\",\n-                                        \"value\": \"flowfile-attribute\"\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\": \"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+                                \"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\": \"Destination\",\n+                                \"name\": \"el-rest-format-aggregations\",\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+                            \"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\": \"Max String Length\",\n+                                \"name\": \"el-rest-format-hits\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Null Value Representation\": {\n+                            \"el-rest-output-no-hits\": {\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\": \"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\": \"Null Value Representation\",\n+                                \"name\": \"el-rest-output-no-hits\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Path Not Found Behavior\": {\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\": \"warn\",\n-                                        \"value\": \"warn\"\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\": \"ignore\",\n-                                        \"value\": \"ignore\"\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\": \"skip\",\n-                                        \"value\": \"skip\"\n+                                        \"description\": \"Use Elasticsearch (7.10+ with XPack) \\\"point in time\\\" _search API to page sorted results. Not available for use with AWS OpenSearch.\",\n+                                        \"displayName\": \"POINT_IN_TIME\",\n+                                        \"value\": \"pagination-pit\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"ignore\",\n-                                \"dependencies\": [\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-split-up-aggregations\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"flowfile-attribute\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Destination\",\n-                                        \"propertyName\": \"Destination\"\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\": \"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\": \"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\": \"Path Not Found Behavior\",\n+                                \"name\": \"el-rest-split-up-aggregations\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Return Type\": {\n+                            \"el-rest-split-up-hits\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"auto-detect\",\n-                                        \"value\": \"auto-detect\"\n+                                        \"description\": \"Flowfile per hit.\",\n+                                        \"displayName\": \"PER_HIT\",\n+                                        \"value\": \"splitUp-yes\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"json\",\n-                                        \"value\": \"json\"\n+                                        \"description\": \"Flowfile per response.\",\n+                                        \"displayName\": \"PER_RESPONSE\",\n+                                        \"value\": \"splitUp-no\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"scalar\",\n-                                        \"value\": \"scalar\"\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\": \"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\": \"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\": \"Return Type\",\n+                                \"name\": \"el-rest-split-up-hits\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n-                            }\n-                        },\n-                        \"sideEffectFree\": true,\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                             },\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+                            \"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\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"el-rest-type\",\n+                                \"required\": false,\n+                                \"sensitive\": false\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-                            }\n-                        ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": true,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"JSON\",\n-                            \"JsonPath\",\n-                            \"evaluate\"\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-                        \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\"\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-standard-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"f2215c6\"\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\": \"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+                            \"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-                                \"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-                        \"multiProcessorUseCases\": [],\n-                        \"primaryNodeOnly\": false,\n-                        \"propertyDescriptors\": {\n-                            \"Destination\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"flowfile-content\",\n-                                        \"value\": \"flowfile-content\"\n-                                    },\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\": \"Environment variables 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\": \"Environment variables 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\": \"Environment variables 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\": \"Environment variables 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\": \"flowfile-attribute\",\n-                                        \"value\": \"flowfile-attribute\"\n+                                        \"propertyDisplayName\": \"Initial Value\",\n+                                        \"propertyName\": \"es-rest-range-initial-value\"\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+                                \"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\": \"Destination\",\n-                                \"required\": true,\n+                                \"name\": \"es-rest-range-format\",\n+                                \"required\": false,\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+                            \"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-                                        \"description\": \"\",\n-                                        \"displayName\": \"string\",\n-                                        \"value\": \"string\"\n+                                        \"propertyDisplayName\": \"Initial Value\",\n+                                        \"propertyName\": \"es-rest-range-initial-value\"\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+                                \"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\": \"Return Type\",\n-                                \"required\": true,\n+                                \"name\": \"es-rest-range-time-zone\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Validate DTD\": {\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\": \"Environment variables 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\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"displayName\": \"asc\",\n+                                        \"value\": \"asc\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"displayName\": \"desc\",\n+                                        \"value\": \"desc\"\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\": \"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\": \"Validate DTD\",\n+                                \"name\": \"es-rest-sort-order\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"sideEffectFree\": true,\n+                        \"seeAlso\": [\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\": \"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+                                \"description\": \"Search hits are routed to this relationship.\",\n+                                \"name\": \"hits\"\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\": \"Aggregations are routed to this relationship.\",\n+                                \"name\": \"aggregations\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": true,\n+                        \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": true,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"systemResourceConsiderations\": [\n                             {\n-                                \"description\": \"Processing requires reading the entire FlowFile into memory\",\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-                            \"XML\",\n-                            \"XPath\",\n-                            \"evaluate\"\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.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+                        \"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                         \"useCases\": [],\n                         \"version\": \"2.0.0-M3\",\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\": \"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                     },\n                     {\n                         \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-standard-nar\",\n+                        \"artifact\": \"nifi-elasticsearch-restapi-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -38344,174 +46564,187 @@\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+                                \"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                         \"multiProcessorUseCases\": [],\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 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+                            \"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\": \"Destination\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"el-query-attribute\",\n+                                \"required\": false,\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+                            \"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\": \"Output: Indent\",\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\": \"2.0.0-M3\"\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\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"el-rest-fetch-index\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Output: Method\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"xml\",\n-                                        \"value\": \"xml\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"html\",\n-                                        \"value\": \"html\"\n-                                    },\n+                            \"el-rest-query\": {\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"text\",\n-                                        \"value\": \"text\"\n+                                        \"dependentValues\": [\n+                                            \"full\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Query Definition Style\",\n+                                        \"propertyName\": \"el-rest-query-definition-style\"\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\": \"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\": \"Output: Method\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"el-rest-query\",\n+                                \"required\": false,\n                                 \"sensitive\": false\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+                            \"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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Output: Omit XML Declaration\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"el-rest-query-clause\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Validate DTD\": {\n+                            \"el-rest-query-definition-style\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"description\": \"Provide the full Query.\",\n+                                        \"displayName\": \"FULL_QUERY\",\n+                                        \"value\": \"full\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"description\": \"Build the Query from separate JSON objects.\",\n+                                        \"displayName\": \"BUILD_QUERY\",\n+                                        \"value\": \"build\"\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\": \"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\": \"Validate DTD\",\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\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"el-rest-type\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n                             }\n                         },\n-                        \"sideEffectFree\": true,\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+                                \"description\": \"All flowfiles that fail due to server/cluster availability go to this relationship.\",\n+                                \"name\": \"retry\"\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\": \"If the \\\"by query\\\" operation fails, and a flowfile was read, it will be sent to this relationship.\",\n+                                \"name\": \"failure\"\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\": \"If the \\\"by query\\\" operation succeeds, and a flowfile was read, it will be sent to this relationship.\",\n+                                \"name\": \"success\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": true,\n+                        \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": true,\n                         \"supportsDynamicRelationships\": 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+                            \"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.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.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                         \"useCases\": [],\n                         \"version\": \"2.0.0-M3\",\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\": \"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                     },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-standard-nar\",\n+                        \"artifact\": \"nifi-elasticsearch-restapi-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -38521,165 +46754,185 @@\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+                                \"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_FORBIDDEN\",\n+                        \"inputRequirement\": \"INPUT_ALLOWED\",\n                         \"multiProcessorUseCases\": [],\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+                            \"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\": \"Argument Delimiter\",\n+                                \"name\": \"el-rest-client-service\",\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+                                \"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\": \"2.0.0-M3\"\n+                                }\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+                            \"el-rest-fetch-index\": {\n+                                \"description\": \"The name of the index to use.\",\n+                                \"displayName\": \"Index\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Command\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"el-rest-fetch-index\",\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+                            \"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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Command Arguments\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"el-rest-type\",\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 'Batch Duration' is set.\",\n-                                \"displayName\": \"Output MIME Type\",\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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Output MIME type\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"get-es-attribute-name\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Redirect Error Stream\": {\n+                            \"get-es-destination\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"description\": \"Output the retrieved document as the FlowFile content.\",\n+                                        \"displayName\": \"FlowFile Content\",\n+                                        \"value\": \"flowfile-content\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\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\": \"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+                                \"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\": \"Redirect Error Stream\",\n-                                \"required\": false,\n+                                \"name\": \"get-es-destination\",\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+                            \"get-es-id\": {\n+                                \"description\": \"The _id of the document to retrieve.\",\n+                                \"displayName\": \"Document Id\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Working Directory\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"get-es-id\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"restricted\": true,\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.elasticsearch.JsonQueryElasticsearch\"\n+                        ],\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"All created FlowFiles are routed to this relationship\",\n-                                \"name\": \"success\"\n+                                \"description\": \"Fetched documents are routed to this relationship.\",\n+                                \"name\": \"document\"\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 flowfiles that fail due to server/cluster availability go to this relationship.\",\n+                                \"name\": \"retry\"\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                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": true,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"command\",\n-                            \"external\",\n-                            \"invoke\",\n-                            \"process\",\n-                            \"script\",\n-                            \"source\"\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.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+                        \"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                         \"useCases\": [],\n                         \"version\": \"2.0.0-M3\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"Executed command\",\n-                                \"name\": \"command\"\n+                                \"description\": \"The filename attribute is set to the document identifier\",\n+                                \"name\": \"filename\"\n                             },\n                             {\n-                                \"description\": \"Arguments of the command\",\n-                                \"name\": \"command.arguments\"\n+                                \"description\": \"The Elasticsearch index containing the document\",\n+                                \"name\": \"elasticsearch.index\"\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+                                \"description\": \"The Elasticsearch document type\",\n+                                \"name\": \"elasticsearch.type\"\n+                            },\n+                            {\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-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-standard-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-elasticsearch-restapi-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -38689,350 +46942,427 @@\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+                                \"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                         \"multiProcessorUseCases\": [],\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+                            \"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\": \"Environment variables 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\": \"Database Connection Pooling 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.dbcp.DBCPService\",\n+                                    \"type\": \"org.apache.nifi.elasticsearch.ElasticSearchClientService\",\n                                     \"version\": \"2.0.0-M3\"\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+                            \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Max Wait Time\",\n+                                \"name\": \"el-rest-fetch-index\",\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+                            \"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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"SQL select query\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"el-rest-format-aggregations\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"compression-format\": {\n+                            \"el-rest-format-hits\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"BZIP2\",\n-                                        \"value\": \"BZIP2\"\n+                                        \"description\": \"Contains full Elasticsearch Hit, including Document Source and Metadata.\",\n+                                        \"displayName\": \"FULL\",\n+                                        \"value\": \"FULL\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"DEFLATE\",\n-                                        \"value\": \"DEFLATE\"\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-                                    },\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\": \"\",\n-                                        \"displayName\": \"SNAPPY\",\n-                                        \"value\": \"SNAPPY\"\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"LZO\",\n-                                        \"value\": \"LZO\"\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"NONE\",\n-                                \"description\": \"Compression type to use when writing Avro files. Default is None.\",\n-                                \"displayName\": \"Compression 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\": \"compression-format\",\n+                                \"name\": \"el-rest-output-no-hits\",\n                                 \"required\": true,\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+                            \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"dbf-default-precision\",\n-                                \"required\": true,\n+                                \"name\": \"el-rest-query\",\n+                                \"required\": false,\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-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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"dbf-default-scale\",\n-                                \"required\": true,\n+                                \"name\": \"el-rest-query-clause\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"dbf-normalize\": {\n+                            \"el-rest-query-definition-style\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"description\": \"Provide the full Query.\",\n+                                        \"displayName\": \"FULL_QUERY\",\n+                                        \"value\": \"full\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"description\": \"Build the Query from separate JSON objects.\",\n+                                        \"displayName\": \"BUILD_QUERY\",\n+                                        \"value\": \"build\"\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\": \"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\": \"dbf-normalize\",\n+                                \"name\": \"el-rest-query-definition-style\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"dbf-user-logical-types\": {\n+                            \"el-rest-split-up-aggregations\": {\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+                                        \"description\": \"Flowfile per response.\",\n+                                        \"displayName\": \"PER_RESPONSE\",\n+                                        \"value\": \"splitUp-no\"\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\": \"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\": \"dbf-user-logical-types\",\n+                                \"name\": \"el-rest-split-up-aggregations\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"esql-auto-commit\": {\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+                                        \"description\": \"Flowfile per response.\",\n+                                        \"displayName\": \"PER_RESPONSE\",\n+                                        \"value\": \"splitUp-no\"\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\": \"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\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"esql-auto-commit\",\n+                                \"name\": \"el-rest-split-up-hits\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\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+                            \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"esql-fetch-size\",\n-                                \"required\": true,\n+                                \"name\": \"el-rest-type\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\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+                            \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"esql-max-rows\",\n-                                \"required\": true,\n+                                \"name\": \"es-rest-query-aggs\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\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+                            \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"esql-output-batch-size\",\n-                                \"required\": true,\n+                                \"name\": \"es-rest-query-fields\",\n+                                \"required\": false,\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+                            \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"sql-post-query\",\n+                                \"name\": \"es-rest-query-script-fields\",\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+                            \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"sql-pre-query\",\n+                                \"name\": \"es-rest-query-sort\",\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+                            \"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\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"es-rest-size\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n                             }\n+                        },\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.elasticsearch.PaginatedJsonQueryElasticsearch\"\n                         ],\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"Successfully created FlowFile from SQL query result set.\",\n-                                \"name\": \"success\"\n+                                \"description\": \"Aggregations are routed to this relationship.\",\n+                                \"name\": \"aggregations\"\n                             },\n                             {\n-                                \"description\": \"SQL query execution failed. Incoming FlowFile will be penalized and routed to this relationship\",\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                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": true,\n                         \"supportsDynamicRelationships\": false,\n-                        \"supportsSensitiveDynamicProperties\": true,\n+                        \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"database\",\n-                            \"jdbc\",\n+                            \"elasticsearch\",\n+                            \"elasticsearch5\",\n+                            \"elasticsearch6\",\n+                            \"elasticsearch7\",\n+                            \"elasticsearch8\",\n+                            \"get\",\n+                            \"json\",\n                             \"query\",\n-                            \"select\",\n-                            \"sql\"\n+                            \"read\"\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+                        \"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                         \"useCases\": [],\n                         \"version\": \"2.0.0-M3\",\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+                                \"description\": \"application/json\",\n+                                \"name\": \"mime.type\"\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 name of the aggregation whose results are in the output flowfile\",\n+                                \"name\": \"aggregation.name\"\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 number of the aggregation whose results are in the output flowfile\",\n+                                \"name\": \"aggregation.number\"\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 number of hits that are in the output flowfile\",\n+                                \"name\": \"hit.count\"\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\": \"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-standard-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-elasticsearch-restapi-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -39042,337 +47372,484 @@\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+                                \"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_ALLOWED\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"multiProcessorUseCases\": [],\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+                            \"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\": \"Environment variables 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\": \"Database Connection Pooling 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.dbcp.DBCPService\",\n+                                    \"type\": \"org.apache.nifi.elasticsearch.ElasticSearchClientService\",\n                                     \"version\": \"2.0.0-M3\"\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+                            \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Max Wait Time\",\n+                                \"name\": \"el-rest-fetch-index\",\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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"SQL select query\",\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+                            \"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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"dbf-default-precision\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"el-rest-format-aggregations\",\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-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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"dbf-default-scale\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"el-rest-format-hits\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"dbf-user-logical-types\": {\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\": \"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+                                \"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\": \"dbf-user-logical-types\",\n+                                \"name\": \"el-rest-output-no-hits\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"esql-auto-commit\": {\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\": \"true\",\n-                                        \"value\": \"true\"\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\": \"false\",\n-                                        \"value\": \"false\"\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. Not available for use with AWS OpenSearch.\",\n+                                        \"displayName\": \"POINT_IN_TIME\",\n+                                        \"value\": \"pagination-pit\"\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\": \"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\": \"esql-auto-commit\",\n+                                \"name\": \"el-rest-pagination-type\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\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+                            \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"esql-fetch-size\",\n-                                \"required\": true,\n+                                \"name\": \"el-rest-query\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\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+                            \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"esql-max-rows\",\n-                                \"required\": true,\n+                                \"name\": \"el-rest-query-clause\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\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+                            \"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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"esql-output-batch-size\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"el-rest-query-definition-style\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"esqlrecord-normalize\": {\n+                            \"el-rest-split-up-aggregations\": {\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+                                        \"description\": \"Flowfile per response.\",\n+                                        \"displayName\": \"PER_RESPONSE\",\n+                                        \"value\": \"splitUp-no\"\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-                                \"displayName\": \"Normalize Table/Column Names\",\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\": \"esqlrecord-normalize\",\n+                                \"name\": \"el-rest-split-up-aggregations\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\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+                            \"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+                                        \"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\": \"esqlrecord-record-writer\",\n+                                \"name\": \"el-rest-split-up-hits\",\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\": \"2.0.0-M3\"\n-                                }\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+                            \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"sql-post-query\",\n+                                \"name\": \"el-rest-type\",\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+                            \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"sql-pre-query\",\n+                                \"name\": \"es-rest-query-aggs\",\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+                            \"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\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"es-rest-query-fields\",\n+                                \"required\": false,\n+                                \"sensitive\": false\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+                            \"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\": \"Environment variables 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\": \"Environment variables 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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"es-rest-size\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n                             }\n+                        },\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-                                \"description\": \"Successfully created FlowFile from SQL query result set.\",\n-                                \"name\": \"success\"\n+                                \"description\": \"Aggregations are routed to this relationship.\",\n+                                \"name\": \"aggregations\"\n                             },\n                             {\n-                                \"description\": \"SQL query execution failed. Incoming FlowFile will be penalized and routed to this relationship\",\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                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": true,\n                         \"supportsDynamicRelationships\": false,\n-                        \"supportsSensitiveDynamicProperties\": 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-                            \"database\",\n-                            \"jdbc\",\n+                            \"elasticsearch\",\n+                            \"elasticsearch5\",\n+                            \"elasticsearch6\",\n+                            \"elasticsearch7\",\n+                            \"elasticsearch8\",\n+                            \"json\",\n+                            \"page\",\n                             \"query\",\n-                            \"record\",\n-                            \"select\",\n-                            \"sql\"\n+                            \"read\",\n+                            \"scroll\"\n                         ],\n                         \"triggerSerially\": false,\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.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                         \"useCases\": [],\n                         \"version\": \"2.0.0-M3\",\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-                            },\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+                                \"description\": \"application/json\",\n+                                \"name\": \"mime.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 name of the aggregation whose results are in the output flowfile\",\n+                                \"name\": \"aggregation.name\"\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 number of the aggregation whose results are in the output flowfile\",\n+                                \"name\": \"aggregation.number\"\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\": \"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\": \"Sets the mime.type attribute to the MIME Type specified by the Record Writer.\",\n-                                \"name\": \"mime.type\"\n+                                \"description\": \"The number of hits that are in the output flowfile\",\n+                                \"name\": \"hit.count\"\n                             },\n                             {\n-                                \"description\": \"The number of records output by the Record Writer.\",\n-                                \"name\": \"record.count\"\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\": true,\n-                        \"artifact\": \"nifi-standard-nar\",\n+                        \"artifact\": \"nifi-elasticsearch-restapi-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -39382,527 +47859,294 @@\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+                                \"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                             {\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\": \"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                         \"multiProcessorUseCases\": [],\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+                            \"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\": \"Argument Delimiter\",\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\": \"2.0.0-M3\"\n+                                }\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+                            \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Command Arguments\",\n-                                \"required\": false,\n+                                \"name\": \"el-rest-fetch-index\",\n+                                \"required\": true,\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+                            \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Command Path\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Ignore STDIN\": {\n-                                \"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+                                \"name\": \"el-rest-type\",\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+                            \"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\": \"Max Attribute Length\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"put-es-json-charset\",\n+                                \"required\": true,\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+                            \"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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Output Destination Attribute\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"put-es-json-dynamic_templates\",\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+                            \"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\": \"Output MIME Type\",\n+                                \"name\": \"put-es-json-id-attr\",\n                                 \"required\": false,\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+                            \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Working Directory\",\n+                                \"name\": \"put-es-json-script\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"argumentsStrategy\": {\n+                            \"put-es-json-scripted-upsert\": {\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+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\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+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\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+                                \"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\": \"argumentsStrategy\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"put-es-json-scripted-upsert\",\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-                        ],\n-                        \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": true,\n-                        \"supportsDynamicRelationships\": false,\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-                        \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\",\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\": \"f2215c6\"\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 can reference resources over HTTP\",\n-                                \"requiredPermission\": \"reference remote resources\"\n-                            }\n-                        ],\n-                        \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n-                        \"multiProcessorUseCases\": [],\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+                            \"put-es-not_found-is-error\": {\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 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-                                \"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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Grok Expression\",\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+                                \"defaultValue\": \"true\",\n+                                \"description\": \"If true, \\\"not_found\\\" Elasticsearch Document associated Records will be routed to the \\\"successful\\\" 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\": \"Grok Pattern file\",\n+                                \"name\": \"put-es-not_found-is-error\",\n                                 \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\",\n-                                        \"TEXT\",\n-                                        \"URL\"\n-                                    ]\n-                                },\n                                 \"sensitive\": false\n                             },\n-                            \"Keep Empty Captures\": {\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\": \"If true, then empty capture values will be included in the returned capture map.\",\n-                                \"displayName\": \"Keep Empty Captures\",\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 \\\"successful\\\" or \\\"errors\\\" relationships\",\n+                                \"displayName\": \"Output Error Responses\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Keep Empty Captures\",\n+                                \"name\": \"put-es-output-error-responses\",\n+                                \"required\": false,\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"put-es-record-batch-size\",\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+                            \"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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Maximum Buffer Size\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"put-es-record-index-op\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Named captures only\": {\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\": \"Only store named captures from grok\",\n-                                \"displayName\": \"Named captures only\",\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\": \"Named captures only\",\n-                                \"required\": true,\n+                                \"name\": \"put-es-record-log-error-responses\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"restricted\": true,\n-                        \"sideEffectFree\": true,\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.elasticsearch.PutElasticsearchRecord\"\n+                        ],\n+                        \"sideEffectFree\": false,\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\": \"All flowfiles that fail due to server/cluster availability go to this relationship.\",\n+                                \"name\": \"retry\"\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-                            }\n-                        ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\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.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-                        \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\",\n-                        \"writesAttributes\": [\n+                                \"description\": \"Record(s)/Flowfile(s) corresponding to Elasticsearch document(s) that resulted in an \\\"error\\\" (within Elasticsearch) will be routed here.\",\n+                                \"name\": \"errors\"\n+                            },\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-                            }\n-                        ]\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-standard-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"f2215c6\"\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-                        \"multiProcessorUseCases\": [],\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+                                \"description\": \"Record(s)/Flowfile(s) corresponding to Elasticsearch document(s) that did not result in an \\\"error\\\" (within Elasticsearch) will be routed here.\",\n+                                \"name\": \"successful\"\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\": \"2.0.0-M3\"\n-                                }\n-                            }\n-                        },\n-                        \"sideEffectFree\": true,\n-                        \"supportedRelationships\": [\n                             {\n-                                \"description\": \"FlowFiles whose record schemas are successfully extracted will be routed to this relationship\",\n-                                \"name\": \"success\"\n+                                \"description\": \"All flowfiles that are sent to Elasticsearch without request failures go to this relationship.\",\n+                                \"name\": \"original\"\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\": \"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\": true,\n-                        \"supportsDynamicProperties\": false,\n+                        \"supportsBatching\": false,\n+                        \"supportsDynamicProperties\": true,\n                         \"supportsDynamicRelationships\": false,\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-                            \"avro\",\n-                            \"csv\",\n-                            \"freeform\",\n-                            \"generic\",\n+                            \"elasticsearch\",\n+                            \"elasticsearch5\",\n+                            \"elasticsearch6\",\n+                            \"elasticsearch7\",\n+                            \"elasticsearch8\",\n+                            \"index\",\n                             \"json\",\n-                            \"record\",\n-                            \"schema\",\n-                            \"text\",\n-                            \"xml\"\n+                            \"put\"\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.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                         \"useCases\": [],\n                         \"version\": \"2.0.0-M3\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"This attribute provides on failure the error message encountered by the Reader.\",\n-                                \"name\": \"record.error.message\"\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-                                \"description\": \"This attribute provides the schema extracted from the input FlowFile using the provided RecordReader.\",\n-                                \"name\": \"avro.schema\"\n+                                \"description\": \"The _bulk response if there was an error during processing the document within Elasticsearch.\",\n+                                \"name\": \"elasticsearch.bulk.error\"\n                             }\n                         ]\n                     },\n                     {\n                         \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-standard-nar\",\n+                        \"artifact\": \"nifi-elasticsearch-restapi-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -39912,999 +48156,962 @@\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+                                \"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+                                \"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                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"multiProcessorUseCases\": [],\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+                            \"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\": \"Character Set\",\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\": \"2.0.0-M3\"\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\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"el-rest-fetch-index\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Enable Canonical Equivalence\": {\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\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"el-rest-type\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"put-es-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\": \"false\",\n-                                \"description\": \"Indicates that two characters match only when their full canonical decompositions match.\",\n-                                \"displayName\": \"Enable Canonical Equivalence\",\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"If true, \\\"not_found\\\" Elasticsearch Document associated Records will be routed to the \\\"successful\\\" 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\": \"Enable Canonical Equivalence\",\n-                                \"required\": true,\n+                                \"name\": \"put-es-not_found-is-error\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Enable Case-insensitive Matching\": {\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\": \"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+                                \"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 \\\"successful\\\" or \\\"errors\\\" relationships\",\n+                                \"displayName\": \"Output Error Responses\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Enable Case-insensitive Matching\",\n-                                \"required\": true,\n+                                \"name\": \"put-es-output-error-responses\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\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+                            \"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\": \"Enable DOTALL Mode\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables 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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"put-es-record-at-timestamp-path\",\n+                                \"required\": false,\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"put-es-record-at-timestamp-time-format\",\n+                                \"required\": false,\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"put-es-record-batch-size\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Enable Literal Parsing of the Pattern\": {\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\": \"false\",\n-                                \"description\": \"Indicates that Metacharacters and escape characters should be given no special meaning.\",\n-                                \"displayName\": \"Enable Literal Parsing of the Pattern\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"propertyDisplayName\": \"Result Record Writer\",\n+                                        \"propertyName\": \"put-es-record-error-writer\"\n+                                    }\n+                                ],\n+                                \"description\": \"The errored 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\": \"Enable Literal Parsing of the Pattern\",\n-                                \"required\": true,\n+                                \"name\": \"put-es-record-bulk-error-groups\",\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+                            \"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\": \"Environment variables 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\": \"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\\\" relationship.\",\n+                                \"displayName\": \"Result Record Writer\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Enable Multiline Mode\",\n+                                \"name\": \"put-es-record-error-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\": \"2.0.0-M3\"\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\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"put-es-record-id-path\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\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+                            \"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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Enable Unicode Predefined Character Classes\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"put-es-record-index-op\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Enable Unicode-aware Case Folding\": {\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\": \"Environment variables 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\": \"Environment variables 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                                 \"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+                                \"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\": \"Enable Unicode-aware Case Folding\",\n-                                \"required\": true,\n+                                \"name\": \"put-es-record-log-error-responses\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\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+                            \"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\": \"Enable Unix Lines Mode\",\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\": \"2.0.0-M3\"\n+                                }\n                             },\n-                            \"Enable named group support\": {\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\": \"If set to true, when named groups are present in the regular expression, the name of the\\ngroup will be used in the attribute name as opposed to the group index.  All capturing groups\\nmust be named, if the number of groups (not including capture group 0) does not equal the\\nnumber of named groups validation will fail.\",\n-                                \"displayName\": \"Enable named group support\",\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\": \"Enable named group support\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"put-es-record-retain-at-timestamp-field\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Enable repeating capture group\": {\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\": \"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\": \"Enable repeating capture group\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Include Capture Group 0\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"propertyDisplayName\": \"ID Record Path\",\n+                                        \"propertyName\": \"put-es-record-id-path\"\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+                                \"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\": \"Include Capture Group 0\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"put-es-record-retain-id-field\",\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 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+                            \"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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Maximum Buffer Size\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"put-es-record-script-path\",\n+                                \"required\": false,\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+                            \"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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Maximum Capture Group Length\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"put-es-record-scripted-upsert-path\",\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-                                    {\n-                                        \"description\": \"\",\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+                            \"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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Permit Whitespace and Comments in Pattern\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"put-es-record-type-record-path\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"sideEffectFree\": true,\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.elasticsearch.PutElasticsearchJson\"\n+                        ],\n+                        \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\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\": \"All flowfiles that fail due to server/cluster availability go to this relationship.\",\n+                                \"name\": \"retry\"\n                             },\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\": \"Record(s)/Flowfile(s) corresponding to Elasticsearch document(s) that did not result in an \\\"error\\\" (within Elasticsearch) will be routed here.\",\n+                                \"name\": \"successful\"\n+                            },\n+                            {\n+                                \"description\": \"Record(s)/Flowfile(s) corresponding to Elasticsearch document(s) that resulted in an \\\"error\\\" (within Elasticsearch) will be routed here.\",\n+                                \"name\": \"errors\"\n+                            },\n+                            {\n+                                \"description\": \"All flowfiles that are sent to Elasticsearch without request failures go to this relationship.\",\n+                                \"name\": \"original\"\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\": true,\n+                        \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": true,\n                         \"supportsDynamicRelationships\": 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-                            \"Regular Expression\",\n-                            \"Text\",\n-                            \"evaluate\",\n-                            \"extract\",\n-                            \"regex\"\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.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.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                         \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\"\n+                        \"version\": \"2.0.0-M3\",\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                     },\n                     {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-standard-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-elasticsearch-restapi-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\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\": \"ENVIRONMENT\",\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_FORBIDDEN\",\n                         \"multiProcessorUseCases\": [],\n-                        \"primaryNodeOnly\": false,\n+                        \"primaryNodeOnly\": true,\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+                            \"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\": \"Environment variables 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-                                \"displayName\": \"Character Set\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Character Set\",\n+                                \"name\": \"el-query-attribute\",\n                                 \"required\": false,\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+                            \"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\": \"Distributed Cache 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.distributed.cache.client.DistributedMapCacheClient\",\n+                                    \"type\": \"org.apache.nifi.elasticsearch.ElasticSearchClientService\",\n                                     \"version\": \"2.0.0-M3\"\n                                 }\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-                                \"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-                            \"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+                            \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Put Cache Value In Attribute\",\n-                                \"required\": false,\n+                                \"name\": \"el-rest-fetch-index\",\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-                        \"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-                        ],\n-                        \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"cache\",\n-                            \"distributed\",\n-                            \"fetch\",\n-                            \"map\"\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-                        \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\",\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-standard-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"f2215c6\"\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-                        \"multiProcessorUseCases\": [\n-                            {\n-                                \"configurations\": [\n-                                    {\n-                                        \"configuration\": \"The \\\"Hostname\\\" property should be set to the fully qualified hostname of the FTP Server. It's a good idea to parameterize     this property by setting it to something like `#{FTP_SERVER}`.\\nThe \\\"Remote Path\\\" property must be set to the directory on the FTP Server where the files reside. If the flow being built is to be reused elsewhere,     it's a good idea to parameterize this property by setting it to something like `#{FTP_REMOTE_PATH}`.\\nConfigure the \\\"Username\\\" property to the appropriate username for logging into the FTP Server. It's usually a good idea to parameterize this property     by setting it to something like `#{FTP_USERNAME}`.\\nConfigure the \\\"Password\\\" property to the appropriate password for the provided username. It's usually a good idea to parameterize this property     by setting it to something like `#{FTP_PASSWORD}`.\\n\\nThe 'success' Relationship of this Processor is then connected to FetchFTP.\\n\",\n-                                        \"processorClassName\": \"org.apache.nifi.processors.standard.ListFTP\"\n-                                    },\n-                                    {\n-                                        \"configuration\": \"\\\"Hostname\\\" = \\\"${ftp.remote.host}\\\"\\n\\\"Remote File\\\" = \\\"${path}/${filename}\\\"\\n\\\"Username\\\" = \\\"${ftp.listing.user}\\\"\\n\\\"Password\\\" = \\\"#{FTP_PASSWORD}\\\"\\n\",\n-                                        \"processorClassName\": \"org.apache.nifi.processors.standard.FetchFTP\"\n-                                    }\n-                                ],\n-                                \"description\": \"Retrieve all files in a directory of an FTP Server\",\n-                                \"keywords\": [\n-                                    \"ftp\",\n-                                    \"file\",\n-                                    \"transform\",\n-                                    \"state\",\n-                                    \"retrieve\",\n-                                    \"fetch\",\n-                                    \"all\",\n-                                    \"stream\"\n-                                ],\n-                                \"notes\": \"\"\n-                            }\n-                        ],\n-                        \"primaryNodeOnly\": false,\n-                        \"propertyDescriptors\": {\n-                            \"Completion Strategy\": {\n+                            \"el-rest-format-aggregations\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Leave the file as-is\",\n-                                        \"displayName\": \"None\",\n-                                        \"value\": \"None\"\n+                                        \"description\": \"Contains full Elasticsearch Aggregation, including Buckets and Metadata.\",\n+                                        \"displayName\": \"FULL\",\n+                                        \"value\": \"FULL\"\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+                                        \"description\": \"Bucket Content only.\",\n+                                        \"displayName\": \"BUCKETS_ONLY\",\n+                                        \"value\": \"BUCKETS_ONLY\"\n                                     },\n                                     {\n-                                        \"description\": \"Deletes the original file from the remote system\",\n-                                        \"displayName\": \"Delete File\",\n-                                        \"value\": \"Delete File\"\n+                                        \"description\": \"Aggregation Metadata only.\",\n+                                        \"displayName\": \"METADATA_ONLY\",\n+                                        \"value\": \"METADATA_ONLY\"\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+                                \"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\": \"Completion Strategy\",\n+                                \"name\": \"el-rest-format-aggregations\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Connection Mode\": {\n+                            \"el-rest-format-hits\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Active\",\n-                                        \"value\": \"Active\"\n+                                        \"description\": \"Contains full Elasticsearch Hit, including Document Source and Metadata.\",\n+                                        \"displayName\": \"FULL\",\n+                                        \"value\": \"FULL\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Passive\",\n-                                        \"value\": \"Passive\"\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\": \"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+                                \"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\": \"Connection Timeout\",\n+                                \"name\": \"el-rest-format-hits\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Create Directory\": {\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\": \"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+                                \"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\": \"Create Directory\",\n-                                \"required\": false,\n+                                \"name\": \"el-rest-output-no-hits\",\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+                            \"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\": \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Hostname\",\n+                                \"name\": \"el-rest-pagination-keep-alive\",\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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+                            \"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. Not available for use with AWS OpenSearch.\",\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\": \"Internal Buffer Size\",\n-                                \"required\": false,\n+                                \"name\": \"el-rest-pagination-type\",\n+                                \"required\": true,\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+                            \"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 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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Move Destination Directory\",\n+                                \"name\": \"el-rest-query\",\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\": \"Environment variables 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+                            \"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\": \"Environment variables 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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Proxy Port\",\n+                                \"name\": \"el-rest-query-clause\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Proxy Type\": {\n+                            \"el-rest-query-definition-style\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"DIRECT\",\n-                                        \"value\": \"DIRECT\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"HTTP\",\n-                                        \"value\": \"HTTP\"\n+                                        \"description\": \"Provide the full Query.\",\n+                                        \"displayName\": \"FULL_QUERY\",\n+                                        \"value\": \"full\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SOCKS\",\n-                                        \"value\": \"SOCKS\"\n+                                        \"description\": \"Build the Query from separate JSON objects.\",\n+                                        \"displayName\": \"BUILD_QUERY\",\n+                                        \"value\": \"build\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"DIRECT\",\n-                                \"description\": \"Proxy type used for file transfers\",\n-                                \"displayName\": \"Proxy Type\",\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\": \"Proxy Type\",\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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Remote File\",\n+                                \"name\": \"el-rest-query-definition-style\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Transfer Mode\": {\n+                            \"el-rest-split-up-aggregations\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Binary\",\n-                                        \"value\": \"Binary\"\n+                                        \"description\": \"Flowfile per hit.\",\n+                                        \"displayName\": \"PER_HIT\",\n+                                        \"value\": \"splitUp-yes\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"ASCII\",\n-                                        \"value\": \"ASCII\"\n+                                        \"description\": \"Flowfile per response.\",\n+                                        \"displayName\": \"PER_RESPONSE\",\n+                                        \"value\": \"splitUp-no\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"Binary\",\n-                                \"description\": \"The FTP Transfer Mode\",\n-                                \"displayName\": \"Transfer 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\": \"Transfer Mode\",\n-                                \"required\": false,\n+                                \"name\": \"el-rest-split-up-aggregations\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Use Compression\": {\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+                                        \"description\": \"Flowfile per response.\",\n+                                        \"displayName\": \"PER_RESPONSE\",\n+                                        \"value\": \"splitUp-no\"\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                                     }\n                                 ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Indicates whether or not ZLIB compression should be used when transferring files\",\n-                                \"displayName\": \"Use Compression\",\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\": \"Use Compression\",\n+                                \"name\": \"el-rest-split-up-hits\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Username\": {\n-                                \"description\": \"Username\",\n-                                \"displayName\": \"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\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Username\",\n-                                \"required\": true,\n+                                \"name\": \"el-rest-type\",\n+                                \"required\": false,\n                                 \"sensitive\": false\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+                            \"es-rest-query-aggs\": {\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"FATAL\",\n-                                        \"value\": \"FATAL\"\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\": \"Environment variables 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-                                        \"description\": \"\",\n-                                        \"displayName\": \"NONE\",\n-                                        \"value\": \"NONE\"\n+                                        \"dependentValues\": [\n+                                            \"build\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Query Definition Style\",\n+                                        \"propertyName\": \"el-rest-query-definition-style\"\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\": \"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\": \"fetchfiletransfer-notfound-loglevel\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"es-rest-query-fields\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"ftp-use-utf8\": {\n-                                \"allowableValues\": [\n+                            \"es-rest-query-script-fields\": {\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\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\": \"Environment variables 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-                                        \"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\": \"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\": \"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\": \"ftp-use-utf8\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"es-rest-query-sort\",\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, SOCKS + AuthN\",\n-                                \"displayName\": \"Proxy Configuration 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\": \"proxy-configuration-service\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables 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.proxy.ProxyConfigurationService\",\n-                                    \"version\": \"2.0.0-M3\"\n-                                }\n+                                \"sensitive\": false\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.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\": \"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\": \"Search hits are routed to this relationship.\",\n+                                \"name\": \"hits\"\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\": \"Aggregations are routed to this relationship.\",\n+                                \"name\": \"aggregations\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicProperties\": true,\n                         \"supportsDynamicRelationships\": 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-                            \"fetch\",\n-                            \"files\",\n-                            \"ftp\",\n-                            \"get\",\n-                            \"ingest\",\n-                            \"input\",\n-                            \"remote\",\n-                            \"retrieve\",\n-                            \"source\"\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.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.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                         \"useCases\": [],\n                         \"version\": \"2.0.0-M3\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"The hostname or IP address from which the file was pulled\",\n-                                \"name\": \"ftp.remote.host\"\n+                                \"description\": \"application/json\",\n+                                \"name\": \"mime.type\"\n                             },\n                             {\n-                                \"description\": \"The port that was used to communicate with the remote FTP server\",\n-                                \"name\": \"ftp.remote.port\"\n+                                \"description\": \"The name of the aggregation whose results are in the output flowfile\",\n+                                \"name\": \"aggregation.name\"\n                             },\n                             {\n-                                \"description\": \"The name of the remote file that was pulled\",\n-                                \"name\": \"ftp.remote.filename\"\n+                                \"description\": \"The number of the aggregation whose results are in the output flowfile\",\n+                                \"name\": \"aggregation.number\"\n                             },\n                             {\n-                                \"description\": \"The filename is updated to point to the filename fo the remote file\",\n-                                \"name\": \"filename\"\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\": \"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 number of hits that are in the output flowfile\",\n+                                \"name\": \"hit.count\"\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 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-standard-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-elasticsearch-restapi-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -40912,315 +49119,219 @@\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\": \"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-                        \"multiProcessorUseCases\": [\n-                            {\n-                                \"configurations\": [\n-                                    {\n-                                        \"configuration\": \"Configure the \\\"Input Directory\\\" property to point to the directory that you want to ingest files from.\\nSet the \\\"Input Directory Location\\\" property to \\\"Local\\\"\\nOptionally, set \\\"Minimum File Age\\\" to a small value such as \\\"1 min\\\" to avoid ingesting files that are still being written to.\\n\\nConnect the 'success' Relationship to the FetchFile processor.\\n\",\n-                                        \"processorClassName\": \"org.apache.nifi.processors.standard.ListFile\"\n-                                    },\n-                                    {\n-                                        \"configuration\": \"Set the \\\"File to Fetch\\\" property to `${absolute.path}/${filename}`\\nSet the \\\"Completion Strategy\\\" property to `None`\\n\",\n-                                        \"processorClassName\": \"org.apache.nifi.processors.standard.FetchFile\"\n-                                    }\n-                                ],\n-                                \"description\": \"Ingest all files from a directory into NiFi\",\n-                                \"keywords\": [\n-                                    \"local\",\n-                                    \"files\",\n-                                    \"filesystem\",\n-                                    \"ingest\",\n-                                    \"ingress\",\n-                                    \"get\",\n-                                    \"source\",\n-                                    \"input\",\n-                                    \"fetch\"\n-                                ],\n-                                \"notes\": \"\"\n-                            },\n-                            {\n-                                \"configurations\": [\n-                                    {\n-                                        \"configuration\": \"Configure the \\\"Input Directory\\\" property to point to the directory that you want to ingest files from.\\nSet the \\\"Input Directory Location\\\" property to \\\"Local\\\"\\nSet the \\\"File Filter\\\" property to a Regular Expression that matches the filename (without path) of the files that you want to ingest. For example, to ingest all .jpg files, set the value to `.*\\\\.jpg`\\nOptionally, set \\\"Minimum File Age\\\" to a small value such as \\\"1 min\\\" to avoid ingesting files that are still being written to.\\n\\nConnect the 'success' Relationship to the FetchFile processor.\\n\",\n-                                        \"processorClassName\": \"org.apache.nifi.processors.standard.ListFile\"\n-                                    },\n-                                    {\n-                                        \"configuration\": \"Set the \\\"File to Fetch\\\" property to `${absolute.path}/${filename}`\\nSet the \\\"Completion Strategy\\\" property to `None`\\n\",\n-                                        \"processorClassName\": \"org.apache.nifi.processors.standard.FetchFile\"\n-                                    }\n-                                ],\n-                                \"description\": \"Ingest specific files from a directory into NiFi, filtering on filename\",\n-                                \"keywords\": [\n-                                    \"local\",\n-                                    \"files\",\n-                                    \"filesystem\",\n-                                    \"ingest\",\n-                                    \"ingress\",\n-                                    \"get\",\n-                                    \"source\",\n-                                    \"input\",\n-                                    \"fetch\",\n-                                    \"filter\"\n-                                ],\n-                                \"notes\": \"\"\n-                            }\n-                        ],\n+                        \"inputRequirement\": \"INPUT_ALLOWED\",\n+                        \"multiProcessorUseCases\": [],\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-                                    {\n-                                        \"description\": \"Deletes the original file from the file 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 file system once it has been pulled into NiFi\",\n-                                \"displayName\": \"Completion Strategy\",\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\": \"Environment variables 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\": \"Completion Strategy\",\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\": \"2.0.0-M3\"\n+                                }\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+                            \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"File to Fetch\",\n+                                \"name\": \"el-rest-fetch-index\",\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+                            \"el-rest-query\": {\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"FATAL\",\n-                                        \"value\": \"FATAL\"\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\": \"Environment variables 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\": \"NONE\",\n-                                        \"value\": \"NONE\"\n+                                        \"dependentValues\": [\n+                                            \"build\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Query Definition Style\",\n+                                        \"propertyName\": \"el-rest-query-definition-style\"\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\": \"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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Log level when file not found\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"el-rest-query-clause\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Log level when permission denied\": {\n+                            \"el-rest-query-definition-style\": {\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+                                        \"description\": \"Provide the full Query.\",\n+                                        \"displayName\": \"FULL_QUERY\",\n+                                        \"value\": \"full\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"NONE\",\n-                                        \"value\": \"NONE\"\n+                                        \"description\": \"Build the Query from separate JSON objects.\",\n+                                        \"displayName\": \"BUILD_QUERY\",\n+                                        \"value\": \"build\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"ERROR\",\n-                                \"description\": \"Log level to use in case user exceptionfactory does not have sufficient permissions to read the file\",\n-                                \"displayName\": \"Log level when permission denied\",\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\": \"Log level when permission denied\",\n+                                \"name\": \"el-rest-query-definition-style\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Move Conflict 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-                                    },\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+                            \"el-rest-script\": {\n+                                \"dependencies\": [\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+                                        \"dependentValues\": [\n+                                            \"build\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Query Definition Style\",\n+                                        \"propertyName\": \"el-rest-query-definition-style\"\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+                                \"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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Move Conflict Strategy\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"el-rest-script\",\n+                                \"required\": false,\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+                            \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Move Destination Directory\",\n+                                \"name\": \"el-rest-type\",\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                         \"supportedRelationships\": [\n                             {\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\": \"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+                                \"description\": \"All flowfiles that fail due to server/cluster availability go to this relationship.\",\n+                                \"name\": \"retry\"\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 the \\\"by query\\\" operation fails, and a flowfile was read, it will be sent 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\": \"If the \\\"by query\\\" operation succeeds, and a flowfile was read, it will be sent to this relationship.\",\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                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"fetch\",\n-                            \"files\",\n-                            \"filesystem\",\n-                            \"get\",\n-                            \"ingest\",\n-                            \"ingress\",\n-                            \"input\",\n-                            \"local\",\n-                            \"source\"\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.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+                        \"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                         \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\"\n-                    },\n+                        \"version\": \"2.0.0-M3\",\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\": \"2.0.0-M3\"\n+        },\n+        {\n+            \"artifact\": \"nifi-enrich-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n+                \"processors\": [\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-standard-nar\",\n+                        \"artifact\": \"nifi-enrich-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -41230,565 +49341,466 @@\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-                        \"multiProcessorUseCases\": [\n-                            {\n-                                \"configurations\": [\n-                                    {\n-                                        \"configuration\": \"The \\\"Hostname\\\" property should be set to the fully qualified hostname of the FTP Server. It's a good idea to parameterize     this property by setting it to something like `#{SFTP_SERVER}`.\\nThe \\\"Remote Path\\\" property must be set to the directory on the FTP Server where the files reside. If the flow being built is to be reused elsewhere,     it's a good idea to parameterize this property by setting it to something like `#{SFTP_REMOTE_PATH}`.\\nConfigure the \\\"Username\\\" property to the appropriate username for logging into the FTP Server. It's usually a good idea to parameterize this property     by setting it to something like `#{SFTP_USERNAME}`.\\nConfigure the \\\"Password\\\" property to the appropriate password for the provided username. It's usually a good idea to parameterize this property     by setting it to something like `#{SFTP_PASSWORD}`.\\n\\nThe 'success' Relationship of this Processor is then connected to FetchSFTP.\\n\",\n-                                        \"processorClassName\": \"org.apache.nifi.processors.standard.ListSFTP\"\n-                                    },\n-                                    {\n-                                        \"configuration\": \"\\\"Hostname\\\" = \\\"${sftp.remote.host}\\\"\\n\\\"Remote File\\\" = \\\"${path}/${filename}\\\"\\n\\\"Username\\\" = \\\"${sftp.listing.user}\\\"\\n\\\"Password\\\" = \\\"#{SFTP_PASSWORD}\\\"\\n\",\n-                                        \"processorClassName\": \"org.apache.nifi.processors.standard.FetchSFTP\"\n-                                    }\n-                                ],\n-                                \"description\": \"Retrieve all files in a directory of an SFTP Server\",\n-                                \"keywords\": [\n-                                    \"sftp\",\n-                                    \"secure\",\n-                                    \"file\",\n-                                    \"transform\",\n-                                    \"state\",\n-                                    \"retrieve\",\n-                                    \"fetch\",\n-                                    \"all\",\n-                                    \"stream\"\n-                                ],\n-                                \"notes\": \"\"\n-                            }\n-                        ],\n+                        \"multiProcessorUseCases\": [],\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+                            \"Geo Database File\": {\n+                                \"description\": \"Path to Maxmind IP Enrichment Database File\",\n+                                \"displayName\": \"MaxMind Database File\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Ciphers Allowed\",\n-                                \"required\": false,\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-                            \"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+                            \"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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Completion Strategy\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"IP Address Attribute\",\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+                            \"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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Connection Timeout\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables 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-                            \"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+                                \"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\": true,\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\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+                        \"useCases\": [],\n+                        \"version\": \"2.0.0-M3\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"The number of microseconds that the geo lookup took\",\n+                                \"name\": \"X.geo.lookup.micros\"\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+                                \"description\": \"The city identified for the IP address\",\n+                                \"name\": \"X.geo.city\"\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+                                \"description\": \"The accuracy radius if provided by the database (in Kilometers)\",\n+                                \"name\": \"X.geo.accuracy\"\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+                                \"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+                            },\n+                            {\n+                                \"description\": \"The postal code for the country identified\",\n+                                \"name\": \"X.geo.postalcode\"\n+                            }\n+                        ]\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-enrich-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"f2215c6\"\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+                        \"multiProcessorUseCases\": [],\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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Host Key File\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Geo Database File\",\n+                                \"required\": true,\n                                 \"resourceDefinition\": {\n                                     \"cardinality\": \"SINGLE\",\n                                     \"resourceTypes\": [\n-                                        \"FILE\"\n+                                        \"FILE\",\n+                                        \"DIRECTORY\"\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+                            \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Hostname\",\n+                                \"name\": \"Log Level\",\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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+                            \"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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Key Exchange Algorithms Allowed\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"geo-enrich-ip-city-record-path\",\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+                            \"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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Message Authentication Codes Allowed\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"geo-enrich-ip-country-iso-record-path\",\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+                            \"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\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Move Destination Directory\",\n+                                \"name\": \"geo-enrich-ip-country-postal-record-path\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Password\": {\n-                                \"description\": \"Password for the user account\",\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\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Password\",\n+                                \"name\": \"geo-enrich-ip-country-record-path\",\n                                 \"required\": false,\n-                                \"sensitive\": true\n+                                \"sensitive\": false\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+                            \"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\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Port\",\n+                                \"name\": \"geo-enrich-ip-ip-record-path\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Private Key Passphrase\": {\n-                                \"description\": \"Password for the private key\",\n-                                \"displayName\": \"Private Key Passphrase\",\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\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Private Key Passphrase\",\n+                                \"name\": \"geo-enrich-ip-latitude-record-path\",\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+                            \"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\": \"Environment variables 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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Proxy Port\",\n+                                \"name\": \"geo-enrich-ip-longitude-record-path\",\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+                            \"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\": \"Proxy Type\",\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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Remote File\",\n+                                \"name\": \"geo-enrich-ip-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\": \"2.0.0-M3\"\n+                                }\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+                            \"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\": \"Send Keep Alive On Timeout\",\n+                                \"name\": \"geo-enrich-ip-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\": \"2.0.0-M3\"\n+                                }\n                             },\n-                            \"Strict Host Key Checking\": {\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\": \"Indicates whether or not strict enforcement of hosts keys should be applied\",\n-                                \"displayName\": \"Strict Host Key Checking\",\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\": \"Strict Host Key Checking\",\n+                                \"name\": \"geo-enrich-ip-split-found-not-found\",\n                                 \"required\": true,\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                             },\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+                            {\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+                        \"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+                        \"useCases\": [],\n+                        \"version\": \"2.0.0-M3\"\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-enrich-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"f2215c6\"\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+                        \"multiProcessorUseCases\": [],\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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Use Compression\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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-                            \"Username\": {\n-                                \"description\": \"Username\",\n-                                \"displayName\": \"Username\",\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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Username\",\n+                                \"name\": \"IP Address Attribute\",\n                                 \"required\": true,\n                                 \"sensitive\": false\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+                            \"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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"fetchfiletransfer-notfound-loglevel\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Log Level\",\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\": \"2.0.0-M3\"\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\": \"Where to route flow files after unsuccessfully enriching attributes because no data was found\",\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+                                \"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+                        \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"fetch\",\n-                            \"files\",\n-                            \"get\",\n-                            \"ingest\",\n-                            \"input\",\n-                            \"remote\",\n-                            \"retrieve\",\n-                            \"sftp\",\n-                            \"source\"\n+                            \"ISP\",\n+                            \"enrich\",\n+                            \"ip\",\n+                            \"maxmind\"\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.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                         \"useCases\": [],\n                         \"version\": \"2.0.0-M3\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"The hostname or IP address from which the file was pulled\",\n-                                \"name\": \"sftp.remote.host\"\n-                            },\n-                            {\n-                                \"description\": \"The port that was used to communicate with the remote SFTP server\",\n-                                \"name\": \"sftp.remote.port\"\n+                                \"description\": \"The number of microseconds that the geo lookup took\",\n+                                \"name\": \"X.isp.lookup.micros\"\n                             },\n                             {\n-                                \"description\": \"The name of the remote file that was pulled\",\n-                                \"name\": \"sftp.remote.filename\"\n+                                \"description\": \"The Autonomous System Number (ASN) identified for the IP address\",\n+                                \"name\": \"X.isp.asn\"\n                             },\n                             {\n-                                \"description\": \"The filename is updated to point to the filename fo the remote file\",\n-                                \"name\": \"filename\"\n+                                \"description\": \"The Organization Associated with the ASN identified\",\n+                                \"name\": \"X.isp.asn.organization\"\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 ISP associated with the IP address provided\",\n+                                \"name\": \"X.isp.name\"\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 Organization associated with the IP address provided\",\n+                                \"name\": \"X.isp.organization\"\n                             }\n                         ]\n                     },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-standard-nar\",\n+                        \"artifact\": \"nifi-enrich-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -41801,149 +49813,147 @@\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"multiProcessorUseCases\": [],\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+                            \"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\": \"Attribute Matching Strategy\",\n+                                \"name\": \"DNS_QUERY_TYPE\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Filter Mode\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Retains only the attributes matching the filter, all other attributes are removed.\",\n-                                        \"displayName\": \"Retain\",\n-                                        \"value\": \"Retain\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Removes the attributes matching the filter, all other attributes are retained.\",\n-                                        \"displayName\": \"Remove\",\n-                                        \"value\": \"Remove\"\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+                            \"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\": \"Filter Mode\",\n+                                \"name\": \"DNS_RETRIES\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\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+                            \"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\": \"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+                            \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Filtered Attributes\",\n+                                \"name\": \"QUERY_INPUT\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Filtered Attributes Pattern\": {\n-                                \"dependencies\": [\n+                            \"QUERY_PARSER\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"Use regular expression\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Attribute Matching Strategy\",\n-                                        \"propertyName\": \"Attribute Matching Strategy\"\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-                                \"description\": \"A regular expression to match names of attributes to filter from FlowFiles.\",\n-                                \"displayName\": \"Filtered Attributes Pattern\",\n+                                \"defaultValue\": \"None\",\n+                                \"description\": \"The method used to slice the results into attribute groups\",\n+                                \"displayName\": \"Results Parser\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Filtered Attributes Pattern\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\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\": \"All successful FlowFiles are 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\": \"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                         ],\n                         \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": 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+                            \"dns\",\n+                            \"enrich\",\n+                            \"ip\"\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-                        \"useCases\": [\n-                            {\n-                                \"configuration\": \"Set \\\"Filter Mode\\\" to \\\"Retain\\\".\\nSet \\\"Attribute Matching Strategy\\\" to \\\"Use regular expression\\\".\\nSpecify the \\\"Filtered Attributes Pattern\\\", e.g. \\\"my-property|a-prefix[.].*\\\".\\n\",\n-                                \"description\": \"Retain all FlowFile attributes matching a regular expression\",\n-                                \"keywords\": [],\n-                                \"notes\": \"\"\n-                            },\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+                        \"useCases\": [],\n+                        \"version\": \"2.0.0-M3\",\n+                        \"writesAttributes\": [\n                             {\n-                                \"configuration\": \"Set \\\"Filter Mode\\\" to \\\"Remove\\\".\\nSet \\\"Attribute Matching Strategy\\\" to \\\"Enumerate attributes\\\".\\nSpecify the set of \\\"Filtered Attributes\\\" using the delimiter comma ',', e.g. \\\"my-property,other,filename\\\".\\n\",\n-                                \"description\": \"Remove only a specified set of FlowFile attributes\",\n-                                \"keywords\": [],\n-                                \"notes\": \"\"\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-                        \"version\": \"2.0.0-M3\"\n+                        ]\n                     },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-standard-nar\",\n+                        \"artifact\": \"nifi-enrich-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -41956,242 +49966,433 @@\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"multiProcessorUseCases\": [],\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+                            \"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\": \"flatten-json-character-set\",\n+                                \"name\": \"BATCH_SIZE\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"flatten-json-pretty-print-json\": {\n+                            \"BULK_PROTOCOL\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\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\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"description\": \"Queries are made without any particular dialect\",\n+                                        \"displayName\": \"None\",\n+                                        \"value\": \"None\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Specifies whether or not resulted json should be pretty printed\",\n-                                \"displayName\": \"Pretty Print JSON\",\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\": \"flatten-json-pretty-print-json\",\n+                                \"name\": \"BULK_PROTOCOL\",\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+                            \"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\": \"flatten-json-return-type\",\n-                                \"required\": true,\n+                                \"name\": \"KEY_GROUP\",\n+                                \"required\": false,\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+                            \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"flatten-json-separator\",\n-                                \"required\": false,\n+                                \"name\": \"QUERY_INPUT\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"flatten-mode\": {\n+                            \"QUERY_PARSER\": {\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+                                        \"description\": \"Use a delimiter character or RegEx  to split the results into attributes\",\n+                                        \"displayName\": \"Split\",\n+                                        \"value\": \"Split\"\n                                     },\n                                     {\n-                                        \"description\": \"Conforms to MongoDB dot notation to update also nested documents\",\n-                                        \"displayName\": \"dot notation\",\n-                                        \"value\": \"dot notation\"\n+                                        \"description\": \"Use a regular expression to split the results into attributes \",\n+                                        \"displayName\": \"RegEx\",\n+                                        \"value\": \"RegEx\"\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+                                        \"description\": \"Do not split results\",\n+                                        \"displayName\": \"None\",\n+                                        \"value\": \"None\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"keep arrays\",\n-                                \"description\": \"Specifies how json should be flattened/unflattened\",\n-                                \"displayName\": \"Flatten Mode\",\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\": \"flatten-mode\",\n+                                \"name\": \"QUERY_PARSER\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"ignore-reserved-characters\": {\n-                                \"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, reserved characters in keys will be ignored\",\n-                                \"displayName\": \"Ignore Reserved Characters\",\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\": \"ignore-reserved-characters\",\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"WHOIS_QUERY_TYPE\",\n+                                \"required\": false,\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                         \"sideEffectFree\": true,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"Successfully flattened/unflattened files go 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\": \"Files that cannot be flattened/unflattened go 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                         ],\n                         \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"flatten\",\n-                            \"json\",\n-                            \"unflatten\"\n+                            \"enrich\",\n+                            \"ip\",\n+                            \"whois\"\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+                        \"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                         \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\"\n-                    },\n+                        \"version\": \"2.0.0-M3\",\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\": \"2.0.0-M3\"\n+        },\n+        {\n+            \"artifact\": \"nifi-protobuf-services-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [\n                     {\n                         \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-standard-nar\",\n+                        \"artifact\": \"nifi-protobuf-services-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\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-                        \"multiProcessorUseCases\": [],\n-                        \"primaryNodeOnly\": false,\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.standard.JoinEnrichment\"\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+                        \"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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Message Type\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Proto Directory\": {\n+                                \"description\": \"Directory containing Protocol Buffers message definition (.proto) file(s).\",\n+                                \"displayName\": \"Proto Directory\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Proto Directory\",\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 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 schema reference information will be provided through a configured Schema Reference Reader service implementation.\",\n+                                        \"displayName\": \"Schema Reference Reader\",\n+                                        \"value\": \"schema-reference-reader\"\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\": \"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+                                \"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\": \"Environment variables 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\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"schema-name\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"schema-reference-reader\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"schema-reference-reader\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"Service implementation responsible for reading FlowFile attributes or content to determine the Schema Reference Identifier\",\n+                                \"displayName\": \"Schema Reference Reader\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"schema-reference-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.schemaregistry.services.SchemaReferenceReader\",\n+                                    \"version\": \"2.0.0-M3\"\n+                                }\n+                            },\n+                            \"schema-registry\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"schema-reference-reader\",\n+                                            \"schema-name\"\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\": \"2.0.0-M3\"\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\": \"Environment variables 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\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"schema-version\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            }\n+                        },\n+                        \"providedApiImplementations\": [\n                             {\n-                                \"description\": \"The incoming FlowFile will be routed to this relationship, after adding appropriate attributes.\",\n-                                \"name\": \"original\"\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n+                                \"version\": \"2.0.0-M3\"\n                             }\n                         ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"enrich\",\n-                            \"fork\",\n-                            \"join\",\n+                            \"parser\",\n+                            \"protobuf\",\n+                            \"reader\",\n                             \"record\"\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-                        \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\",\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-                            },\n-                            {\n-                                \"description\": \"The role to use for enrichment. This will either be ORIGINAL or ENRICHMENT.\",\n-                                \"name\": \"enrichment.role\"\n-                            }\n-                        ]\n-                    },\n+                        \"type\": \"org.apache.nifi.services.protobuf.ProtobufReader\",\n+                        \"typeDescription\": \"Parses a Protocol Buffers message from binary format.\",\n+                        \"version\": \"2.0.0-M3\"\n+                    }\n+                ],\n+                \"processors\": [],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"2.0.0-M3\"\n+        },\n+        {\n+            \"artifact\": \"nifi-server-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n+                \"processors\": [],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"2.0.0-M3\"\n+        },\n+        {\n+            \"artifact\": \"nifi-cipher-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n+                \"processors\": [\n                     {\n                         \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-standard-nar\",\n+                        \"artifact\": \"nifi-cipher-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -42199,328 +50400,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-                        \"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                         \"multiProcessorUseCases\": [],\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"fork-mode\": {\n+                            \"cipher-algorithm-mode\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Generated records will be the elements of the array\",\n-                                        \"displayName\": \"Extract\",\n-                                        \"value\": \"extract\"\n+                                        \"description\": \"Cipher Blocking Chaining Mode\",\n+                                        \"displayName\": \"CBC\",\n+                                        \"value\": \"CBC\"\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+                                        \"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\": \"split\",\n-                                \"description\": \"Specifies the forking mode of the processor\",\n-                                \"displayName\": \"Mode\",\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\": \"fork-mode\",\n+                                \"name\": \"cipher-algorithm-mode\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"include-parent-fields\": {\n+                            \"cipher-algorithm-padding\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"description\": \"NoPadding\",\n+                                        \"displayName\": \"NoPadding\",\n+                                        \"value\": \"NoPadding\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"description\": \"PKCS5Padding\",\n+                                        \"displayName\": \"PKCS5Padding\",\n+                                        \"value\": \"PKCS5Padding\"\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\": \"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\": \"include-parent-fields\",\n+                                \"name\": \"cipher-algorithm-padding\",\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+                            \"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\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"record-reader\",\n+                                \"name\": \"key-specification\",\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\": \"2.0.0-M3\"\n-                                }\n+                                \"sensitive\": true\n                             },\n-                            \"record-writer\": {\n-                                \"description\": \"Specifies the Controller Service to use for writing out the records\",\n-                                \"displayName\": \"Record Writer\",\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\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"record-writer\",\n+                                \"name\": \"key-specification-format\",\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\": \"2.0.0-M3\"\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-                                \"name\": \"failure\"\n-                            },\n-                            {\n-                                \"description\": \"The original FlowFiles will be routed to this relationship\",\n-                                \"name\": \"original\"\n+                                \"description\": \"Decryption succeeded\",\n+                                \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"The FlowFiles containing the forked records will be routed to this relationship\",\n-                                \"name\": \"fork\"\n+                                \"description\": \"Decryption failed\",\n+                                \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": true,\n+                        \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"array\",\n-                            \"content\",\n-                            \"event\",\n-                            \"fork\",\n-                            \"record\",\n-                            \"stream\"\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.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.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                         \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\",\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+                        \"version\": \"2.0.0-M3\"\n                     },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-standard-nar\",\n+                        \"artifact\": \"nifi-cipher-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\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\": \"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\": \"ENVIRONMENT\",\n-                                \"name\": \"Generated FlowFile attribute name\",\n-                                \"value\": \"Generated FlowFile attribute value\"\n-                            }\n-                        ],\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"multiProcessorUseCases\": [],\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\": \"Batch Size\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Data Format\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Binary\",\n-                                        \"value\": \"Binary\"\n-                                    },\n+                            \"Private Key Identities\": {\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Text\",\n-                                        \"value\": \"Text\"\n+                                        \"dependentValues\": [\n+                                            \"PROPERTIES\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Private Key Source\",\n+                                        \"propertyName\": \"Private Key Source\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"Text\",\n-                                \"description\": \"Specifies whether the data should be Text or Binary\",\n-                                \"displayName\": \"Data Format\",\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\": \"Data Format\",\n+                                \"name\": \"Private Key Identities\",\n                                 \"required\": true,\n-                                \"sensitive\": false\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"SINGLE\",\n+                                    \"resourceTypes\": [\n+                                        \"TEXT\"\n+                                    ]\n+                                },\n+                                \"sensitive\": true\n                             },\n-                            \"File Size\": {\n-                                \"defaultValue\": \"0B\",\n-                                \"description\": \"The size of the file that will be used\",\n-                                \"displayName\": \"File Size\",\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\": \"File Size\",\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-                            \"Unique FlowFiles\": {\n+                            \"Private Key Source\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"description\": \"Load one or more keys from configured properties\",\n+                                        \"displayName\": \"PROPERTIES\",\n+                                        \"value\": \"PROPERTIES\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"description\": \"Load one or more keys from files or URLs\",\n+                                        \"displayName\": \"RESOURCES\",\n+                                        \"value\": \"RESOURCES\"\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Unique FlowFiles\",\n-                                \"required\": true,\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+                                \"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\": \"character-set\",\n+                                \"name\": \"Private Key Source\",\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"generate-ff-custom-text\",\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"mime-type\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n                             }\n                         },\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.cipher.EncryptContentAge\"\n+                        ],\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"\",\n+                                \"description\": \"Decryption Completed\",\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\": true,\n+                        \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"generate\",\n-                            \"load\",\n-                            \"random\",\n-                            \"test\"\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.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.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                         \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\",\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+                        \"version\": \"2.0.0-M3\"\n                     },\n                     {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-standard-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-cipher-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -42528,150 +50680,217 @@\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+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"multiProcessorUseCases\": [],\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"null-percentage\": {\n-                                \"defaultValue\": \"0\",\n-                                \"dependencies\": [\n+                            \"encryption-scheme\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"true\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Nullable Fields\",\n-                                        \"propertyName\": \"nullable-fields\"\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\": \"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+                                \"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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"null-percentage\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"encryption-scheme\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"nullable-fields\": {\n+                            \"key-derivation-strategy\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\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\": \"\",\n-                                        \"displayName\": \"false\",\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\": \"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\": \"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\": \"nullable-fields\",\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"number-of-records\",\n+                                \"name\": \"key-derivation-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-                                \"displayName\": \"Record Writer\",\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\": \"record-writer\",\n+                                \"name\": \"password\",\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\": \"2.0.0-M3\"\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"schema-text\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n+                                \"sensitive\": true\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\": \"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\": true,\n+                        \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"fake\",\n-                            \"generate\",\n-                            \"random\",\n-                            \"test\"\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.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+                        \"type\": \"org.apache.nifi.processors.cipher.DecryptContentCompatibility\",\n+                        \"typeDescription\": \"Decrypt content using password-based encryption schemes with legacy algorithms supporting historical compatibility modes.\",\n                         \"useCases\": [],\n                         \"version\": \"2.0.0-M3\",\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\": \"Password-Based Encryption Scheme\",\n+                                \"name\": \"pbe.scheme\"\n                             },\n                             {\n-                                \"description\": \"The number of records in the FlowFile\",\n-                                \"name\": \"record.count\"\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-standard-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-cipher-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -42679,294 +50898,157 @@\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                         \"multiProcessorUseCases\": [],\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\": \"Environment variables 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-                                \"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\": \"2.0.0-M3\"\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\": \"Environment variables 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\": \"Environment variables 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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Table Name\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"db-fetch-db-type\": {\n+                            \"File Encoding\": {\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\": \"Binary encoding\",\n+                                        \"displayName\": \"BINARY\",\n+                                        \"value\": \"BINARY\"\n                                     },\n                                     {\n-                                        \"description\": \"Generates Phoenix compliant SQL\",\n-                                        \"displayName\": \"Phoenix\",\n-                                        \"value\": \"Phoenix\"\n+                                        \"description\": \"ASCII Armor encoding\",\n+                                        \"displayName\": \"ASCII\",\n+                                        \"value\": \"ASCII\"\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\": \"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\": \"db-fetch-db-type\",\n+                                \"name\": \"File Encoding\",\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\": \"Environment variables 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\": \"Environment variables 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+                            \"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                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"gen-table-custom-orderby-column\",\n-                                \"required\": 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                             },\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+                            \"Public Key Recipients\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"PROPERTIES\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Public Key Source\",\n+                                        \"propertyName\": \"Public Key Source\"\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                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"gen-table-fetch-partition-size\",\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-                            \"gen-table-output-flowfile-on-zero-results\": {\n+                            \"Public Key Source\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"description\": \"Load one or more keys from configured properties\",\n+                                        \"displayName\": \"PROPERTIES\",\n+                                        \"value\": \"PROPERTIES\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"description\": \"Load one or more keys from files or URLs\",\n+                                        \"displayName\": \"RESOURCES\",\n+                                        \"value\": \"RESOURCES\"\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+                                \"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\": \"gen-table-output-flowfile-on-zero-results\",\n+                                \"name\": \"Public Key Source\",\n                                 \"required\": true,\n                                 \"sensitive\": false\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.cipher.DecryptContentAge\"\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\": \"Encryption Completed\",\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\": \"Encryption 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                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"database\",\n-                            \"fetch\",\n-                            \"generate\",\n-                            \"jdbc\",\n-                            \"query\",\n-                            \"select\",\n-                            \"sql\"\n+                            \"ChaCha20-Poly1305\",\n+                            \"X25519\",\n+                            \"age\",\n+                            \"age-encryption.org\",\n+                            \"encryption\"\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 Environment/System properties.\\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.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                         \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\",\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+                        \"version\": \"2.0.0-M3\"\n                     },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-standard-nar\",\n+                        \"artifact\": \"nifi-cipher-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -42975,498 +51057,671 @@\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                         \"multiProcessorUseCases\": [],\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Connection Mode\": {\n+                            \"mac-algorithm\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"Active\",\n-                                        \"value\": \"Active\"\n+                                        \"displayName\": \"HmacSHA256\",\n+                                        \"value\": \"HmacSHA256\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"Passive\",\n-                                        \"value\": \"Passive\"\n+                                        \"displayName\": \"HmacSHA512\",\n+                                        \"value\": \"HmacSHA512\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"Passive\",\n-                                \"description\": \"The FTP Connection Mode\",\n-                                \"displayName\": \"Connection Mode\",\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\": \"Connection Mode\",\n-                                \"required\": false,\n+                                \"name\": \"mac-algorithm\",\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+                            \"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\": \"Environment variables 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+                                    },\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\": \"Connection Timeout\",\n+                                \"name\": \"message-authentication-code-encoding\",\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+                            \"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\": \"Data Timeout\",\n+                                \"name\": \"secret-key\",\n                                 \"required\": true,\n-                                \"sensitive\": false\n+                                \"sensitive\": true\n                             },\n-                            \"Delete Original\": {\n+                            \"secret-key-encoding\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"displayName\": \"UTF8\",\n+                                        \"value\": \"UTF8\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"displayName\": \"HEXADECIMAL\",\n+                                        \"value\": \"HEXADECIMAL\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"BASE64\",\n+                                        \"value\": \"BASE64\"\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\": \"HEXADECIMAL\",\n+                                \"description\": \"Encoding of the Secret Key\",\n+                                \"displayName\": \"Secret Key Encoding\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Delete Original\",\n+                                \"name\": \"secret-key-encoding\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n+                            }\n+                        },\n+                        \"sideEffectFree\": false,\n+                        \"supportedRelationships\": [\n+                            {\n+                                \"description\": \"Signature Verification Succeeded\",\n+                                \"name\": \"success\"\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+                            {\n+                                \"description\": \"Signature Verification 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+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"Authentication\",\n+                            \"HMAC\",\n+                            \"MAC\",\n+                            \"Signing\"\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+                        \"useCases\": [],\n+                        \"version\": \"2.0.0-M3\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"Calculated Message Authentication Code encoded by the selected encoding\",\n+                                \"name\": \"mac.calculated\"\n+                            },\n+                            {\n+                                \"description\": \"The Encoding of the Hashed Message Authentication Code\",\n+                                \"name\": \"mac.encoding\"\n+                            },\n+                            {\n+                                \"description\": \"Hashed Message Authentication Code Algorithm\",\n+                                \"name\": \"mac.algorithm\"\n+                            }\n+                        ]\n+                    }\n+                ],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"2.0.0-M3\"\n+        },\n+        {\n+            \"artifact\": \"nifi-apicurio-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-apicurio-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"f2215c6\"\n+                        },\n+                        \"group\": \"org.apache.nifi\",\n+                        \"propertyDescriptors\": {\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\": \"File Filter Regex\",\n-                                \"required\": false,\n+                                \"name\": \"Cache Expiration\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Hostname\": {\n-                                \"description\": \"The fully qualified hostname or IP address of the remote system\",\n-                                \"displayName\": \"Hostname\",\n+                            \"Cache Size\": {\n+                                \"defaultValue\": \"1000\",\n+                                \"description\": \"Specifies how many Schemas should be cached from the Schema Registry. The cache size must be a non-negative integer. When it is set to 0, the cache is effectively disabled.\",\n+                                \"displayName\": \"Cache Size\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Hostname\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Cache Size\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Http Proxy Password\": {\n-                                \"description\": \"Http Proxy Password\",\n-                                \"displayName\": \"Http Proxy Password\",\n+                            \"Schema Group ID\": {\n+                                \"defaultValue\": \"default\",\n+                                \"description\": \"The artifact Group ID for the schemas\",\n+                                \"displayName\": \"Schema Group ID\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Http Proxy Password\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n+                                \"name\": \"Schema Group ID\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             },\n-                            \"Http Proxy Username\": {\n-                                \"description\": \"Http Proxy Username\",\n-                                \"displayName\": \"Http Proxy Username\",\n+                            \"Schema Registry URL\": {\n+                                \"description\": \"The URL of the Schema Registry e.g. http://localhost:8080\",\n+                                \"displayName\": \"Schema Registry URL\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Http Proxy Username\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Schema Registry URL\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Ignore Dotted Files\": {\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\": \"2.0.0-M3\"\n+                                }\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\": \"2.0.0-M3\"\n+                            }\n+                        ],\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"apicurio\",\n+                            \"avro\",\n+                            \"registry\",\n+                            \"schema\"\n+                        ],\n+                        \"type\": \"org.apache.nifi.apicurio.schemaregistry.ApicurioSchemaRegistry\",\n+                        \"typeDescription\": \"Provides a Schema Registry that interacts with the Apicurio Schema Registry so that those Schemas that are stored in the Apicurio Schema Registry can be used in NiFi. When a Schema is looked up by name by this registry, it will find a Schema in the Apicurio Schema Registry with their artifact identifiers.\",\n+                        \"version\": \"2.0.0-M3\"\n+                    }\n+                ],\n+                \"processors\": [],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"2.0.0-M3\"\n+        },\n+        {\n+            \"artifact\": \"nifi-amqp-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n+                \"processors\": [\n+                    {\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-amqp-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"f2215c6\"\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+                        \"multiProcessorUseCases\": [],\n+                        \"primaryNodeOnly\": false,\n+                        \"propertyDescriptors\": {\n+                            \"AMQP Version\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"displayName\": \"0.9.1\",\n+                                        \"value\": \"0.9.1\"\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\": \"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\": \"Ignore Dotted Files\",\n+                                \"name\": \"AMQP Version\",\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+                            \"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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Internal Buffer Size\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Brokers\",\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+                            \"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\": \"Max Selects\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Host Name\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n                             \"Password\": {\n-                                \"description\": \"Password for the user account\",\n+                                \"description\": \"Password used for authentication and authorization.\",\n                                 \"displayName\": \"Password\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\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+                            \"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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Path Filter Regex\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Port\",\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+                            \"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\": \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Port\",\n+                                \"name\": \"Queue\",\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+                            \"User Name\": {\n+                                \"description\": \"User Name used for authentication and authorization.\",\n+                                \"displayName\": \"User Name\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Proxy Host\",\n+                                \"name\": \"User Name\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Proxy Port\": {\n-                                \"description\": \"The port of the proxy server\",\n-                                \"displayName\": \"Proxy Port\",\n+                            \"Virtual Host\": {\n+                                \"description\": \"Virtual Host name which segregates AMQP system for enhanced security.\",\n+                                \"displayName\": \"Virtual Host\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Proxy Port\",\n+                                \"name\": \"Virtual Host\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Proxy Type\": {\n+                            \"auto.acknowledge\": {\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\": \" 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\": \"Proxy Type\",\n-                                \"required\": false,\n+                                \"name\": \"auto.acknowledge\",\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+                            \"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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Remote Path\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"batch.size\",\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-                                \"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+                            \"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\": \"If true, will pull files from arbitrarily nested subdirectories; otherwise, will not traverse subdirectories\",\n-                                \"displayName\": \"Search Recursively\",\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\": \"Search Recursively\",\n-                                \"required\": true,\n+                                \"name\": \"cert-authentication\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Transfer Mode\": {\n+                            \"header.format\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Binary\",\n-                                        \"value\": \"Binary\"\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\": \"ASCII\",\n-                                        \"value\": \"ASCII\"\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\": \"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\": \"Binary\",\n-                                \"description\": \"The FTP Transfer Mode\",\n-                                \"displayName\": \"Transfer Mode\",\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\": \"Transfer Mode\",\n-                                \"required\": false,\n+                                \"name\": \"header.format\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Use Natural Ordering\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n+                            \"header.key.prefix\": {\n+                                \"defaultValue\": \"consume.amqp\",\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"dependentValues\": [\n+                                            \"FlowFile Attributes\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Header Output Format\",\n+                                        \"propertyName\": \"header.format\"\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\": \"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\": \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Username\",\n+                                \"name\": \"header.key.prefix\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"follow-symlink\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\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\": \"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+                                \"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\": \"follow-symlink\",\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-                            \"ftp-use-utf8\": {\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\": \"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\": \"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\": \"ftp-use-utf8\",\n-                                \"required\": true,\n+                                \"name\": \"remove.curly.braces\",\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, SOCKS + AuthN\",\n-                                \"displayName\": \"Proxy Configuration Service\",\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\": \"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\": \"2.0.0-M3\"\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\": \"All FlowFiles that are received from the AMQP queue 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                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"FTP\",\n-                            \"fetch\",\n-                            \"files\",\n+                            \"amqp\",\n+                            \"consume\",\n                             \"get\",\n-                            \"ingest\",\n-                            \"input\",\n-                            \"remote\",\n-                            \"retrieve\",\n-                            \"source\"\n+                            \"message\",\n+                            \"rabbit\",\n+                            \"receive\"\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.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                         \"useCases\": [],\n                         \"version\": \"2.0.0-M3\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"The filename is set to the name of the file on the remote server\",\n-                                \"name\": \"filename\"\n+                                \"description\": \"The App ID field from the AMQP Message\",\n+                                \"name\": \"amqp$appId\"\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+                                \"description\": \"The Content Encoding reported by the AMQP Message\",\n+                                \"name\": \"amqp$contentEncoding\"\n                             },\n                             {\n-                                \"description\": \"The date and time that the source file was last modified\",\n-                                \"name\": \"file.lastModifiedTime\"\n+                                \"description\": \"The Content Type reported by the AMQP Message\",\n+                                \"name\": \"amqp$contentType\"\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\": \"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\": \"The numeric owner id of the source file\",\n-                                \"name\": \"file.owner\"\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 group id of the source file\",\n-                                \"name\": \"file.group\"\n+                                \"description\": \"The numeric indicator for the Message's Delivery Mode\",\n+                                \"name\": \"amqp$deliveryMode\"\n                             },\n                             {\n-                                \"description\": \"The read/write/execute permissions of the source file\",\n-                                \"name\": \"file.permissions\"\n+                                \"description\": \"The Message priority\",\n+                                \"name\": \"amqp$priority\"\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 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-standard-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-amqp-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -43474,273 +51729,284 @@\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_FORBIDDEN\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"multiProcessorUseCases\": [],\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-                            \"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-                            \"Ignore Hidden Files\": {\n+                            \"AMQP Version\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"displayName\": \"0.9.1\",\n+                                        \"value\": \"0.9.1\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"Indicates whether or not hidden files should be ignored\",\n-                                \"displayName\": \"Ignore Hidden Files\",\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\": \"Ignore Hidden Files\",\n+                                \"name\": \"AMQP Version\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Input Directory\": {\n-                                \"description\": \"The input directory from which to pull files\",\n-                                \"displayName\": \"Input Directory\",\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\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Input Directory\",\n-                                \"required\": true,\n+                                \"name\": \"Brokers\",\n+                                \"required\": false,\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\": \"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+                            \"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\": \"Keep Source File\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Exchange Name\",\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+                            \"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\": \"Maximum File Age\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Host 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+                            \"Password\": {\n+                                \"description\": \"Password used for authentication and authorization.\",\n+                                \"displayName\": \"Password\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Maximum File Size\",\n+                                \"name\": \"Password\",\n                                 \"required\": false,\n-                                \"sensitive\": false\n+                                \"sensitive\": true\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+                            \"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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Minimum File Age\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Port\",\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+                            \"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\": \"Minimum File Size\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Routing Key\",\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+                            \"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\": \"Path Filter\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"User Name\",\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+                            \"Virtual Host\": {\n+                                \"description\": \"Virtual Host name which segregates AMQP system for enhanced security.\",\n+                                \"displayName\": \"Virtual Host\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Polling Interval\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Virtual Host\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Recurse Subdirectories\": {\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\": \"true\",\n-                                \"description\": \"Indicates whether or not to pull files from subdirectories\",\n-                                \"displayName\": \"Recurse Subdirectories\",\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\": \"Recurse Subdirectories\",\n-                                \"required\": true,\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-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\": \"2.0.0-M3\"\n+                                }\n                             }\n                         },\n-                        \"restricted\": true,\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.standard.FetchFile\",\n-                            \"org.apache.nifi.processors.standard.PutFile\"\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                         ],\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"All files are routed to success\",\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                         \"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-                            \"files\",\n-                            \"filesystem\",\n-                            \"get\",\n-                            \"ingest\",\n-                            \"ingress\",\n-                            \"input\",\n-                            \"local\",\n-                            \"source\"\n+                            \"amqp\",\n+                            \"message\",\n+                            \"publish\",\n+                            \"put\",\n+                            \"rabbit\",\n+                            \"send\"\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.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                         \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\",\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-                            },\n-                            {\n-                                \"description\": \"The group owner of the file. May not work on all file systems\",\n-                                \"name\": \"file.group\"\n-                            },\n-                            {\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\": \"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+                        \"version\": \"2.0.0-M3\"\n+                    }\n+                ],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"2.0.0-M3\"\n+        },\n+        {\n+            \"artifact\": \"nifi-mqtt-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n+                \"processors\": [\n                     {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-standard-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-mqtt-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -43753,561 +52019,466 @@\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_FORBIDDEN\",\n                         \"multiProcessorUseCases\": [],\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+                            \"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\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Ciphers Allowed\",\n-                                \"required\": false,\n+                                \"name\": \"Broker URI\",\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+                            \"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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Connection Timeout\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Client ID\",\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+                            \"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\": \"Data Timeout\",\n-                                \"required\": true,\n+                                \"name\": \"Connection Timeout (seconds)\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\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+                            \"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\": \"Delete Original\",\n-                                \"required\": true,\n+                                \"name\": \"Group ID\",\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+                            \"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\": \"File Filter Regex\",\n+                                \"name\": \"Keep Alive Interval (seconds)\",\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+                            \"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\": \"Host Key File\",\n+                                \"name\": \"Last Will Message\",\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+                            \"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                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Hostname\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Last Will QoS Level\",\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Http Proxy Username\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Ignore Dotted Files\": {\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\": \"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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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+                                \"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\": \"Max Selects\",\n+                                \"name\": \"Last Will Retain\",\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"Environment variables 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+                            \"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\": \"Polling Interval\",\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Port\",\n+                                \"name\": \"Last Will Topic\",\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\": \"Environment variables 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\": \"Environment variables 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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Proxy Port\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Proxy Type\": {\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\": \"DIRECT\",\n-                                        \"value\": \"DIRECT\"\n+                                        \"displayName\": \"v5.0\",\n+                                        \"value\": \"5\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"HTTP\",\n-                                        \"value\": \"HTTP\"\n+                                        \"displayName\": \"v3.1.1\",\n+                                        \"value\": \"4\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"SOCKS\",\n-                                        \"value\": \"SOCKS\"\n+                                        \"displayName\": \"v3.1.0\",\n+                                        \"value\": \"3\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"DIRECT\",\n-                                \"description\": \"Proxy type used for file transfers\",\n-                                \"displayName\": \"Proxy Type\",\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\": \"Proxy Type\",\n-                                \"required\": false,\n+                                \"name\": \"MQTT Specification Version\",\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+                            \"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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Remote Path\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Max Queue Size\",\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+                            \"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\": \"Remote Poll Batch Size\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n+                                \"name\": \"Password\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n                             },\n-                            \"Search Recursively\": {\n+                            \"Quality of Service(QoS)\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\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\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\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\": \"false\",\n-                                \"description\": \"If true, will pull files from arbitrarily nested subdirectories; otherwise, will not traverse subdirectories\",\n-                                \"displayName\": \"Search Recursively\",\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\": \"Search Recursively\",\n+                                \"name\": \"Quality of Service(QoS)\",\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+                            \"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\": \"Send Keep Alive On Timeout\",\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\": \"2.0.0-M3\"\n+                                }\n                             },\n-                            \"Strict Host Key Checking\": {\n-                                \"allowableValues\": [\n+                            \"Session Expiry Interval\": {\n+                                \"defaultValue\": \"24 hrs\",\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"dependentValues\": [\n+                                            \"5\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"MQTT Specification Version\",\n+                                        \"propertyName\": \"MQTT Specification Version\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"dependentValues\": [\n+                                            \"false\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Session state\",\n+                                        \"propertyName\": \"Session state\"\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\": \"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\": \"Strict Host Key Checking\",\n-                                \"required\": true,\n+                                \"name\": \"Session Expiry Interval\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Use Compression\": {\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-                                \"description\": \"Indicates whether or not ZLIB compression should be used when transferring files\",\n-                                \"displayName\": \"Use Compression\",\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\": \"Use Compression\",\n+                                \"name\": \"Session state\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\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+                            \"Topic Filter\": {\n+                                \"description\": \"The MQTT topic filter to designate the topics to subscribe to.\",\n+                                \"displayName\": \"Topic Filter\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Use Natural Ordering\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Topic Filter\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n                             \"Username\": {\n-                                \"description\": \"Username\",\n+                                \"description\": \"Username to use when connecting to the broker\",\n                                 \"displayName\": \"Username\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n                                 \"name\": \"Username\",\n-                                \"required\": true,\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"follow-symlink\": {\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-                                \"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+                                \"dependencies\": [\n+                                    {\n+                                        \"propertyDisplayName\": \"Record Reader\",\n+                                        \"propertyName\": \"record-reader\"\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                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"follow-symlink\",\n+                                \"name\": \"add-attributes-as-fields\",\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+                            \"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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"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\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\n                                 }\n                             }\n                         },\n                         \"seeAlso\": [\n-                            \"org.apache.nifi.processors.standard.PutSFTP\"\n+                            \"org.apache.nifi.processors.mqtt.PublishMQTT\"\n                         ],\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"All FlowFiles that are received are routed to success\",\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\": \"The MQTT message output\",\n+                                \"name\": \"Message\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": 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-                            \"fetch\",\n-                            \"files\",\n-                            \"get\",\n-                            \"ingest\",\n-                            \"input\",\n-                            \"remote\",\n-                            \"retrieve\",\n-                            \"sftp\",\n-                            \"source\"\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.standard.GetSFTP\",\n-                        \"typeDescription\": \"Fetches files from an SFTP Server and creates FlowFiles from them\",\n+                        \"type\": \"org.apache.nifi.processors.mqtt.ConsumeMQTT\",\n+                        \"typeDescription\": \"Subscribes to a topic and receives messages from an MQTT broker\",\n                         \"useCases\": [],\n                         \"version\": \"2.0.0-M3\",\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+                                \"description\": \"The number of records received\",\n+                                \"name\": \"record.count\"\n                             },\n                             {\n-                                \"description\": \"The date and time that the source file was last modified\",\n-                                \"name\": \"file.lastModifiedTime\"\n+                                \"description\": \"MQTT broker that was the message source\",\n+                                \"name\": \"mqtt.broker\"\n                             },\n                             {\n-                                \"description\": \"The numeric owner id of the source file\",\n-                                \"name\": \"file.owner\"\n+                                \"description\": \"MQTT topic on which message was received\",\n+                                \"name\": \"mqtt.topic\"\n                             },\n                             {\n-                                \"description\": \"The numeric group id of the source file\",\n-                                \"name\": \"file.group\"\n+                                \"description\": \"The quality of service for this message.\",\n+                                \"name\": \"mqtt.qos\"\n                             },\n                             {\n-                                \"description\": \"The read/write/execute permissions of the source file\",\n-                                \"name\": \"file.permissions\"\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\": \"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\": \"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-standard-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-mqtt-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -44316,512 +52487,396 @@\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                         \"multiProcessorUseCases\": [],\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+                            \"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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"Additional HTTP Methods\",\n+                                \"name\": \"Connection Timeout (seconds)\",\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+                            \"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\": \"Allow DELETE\",\n-                                \"required\": true,\n+                                \"name\": \"Keep Alive Interval (seconds)\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\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\": \"Allow HTTP GET Method\",\n-                                \"displayName\": \"Allow GET\",\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\": \"Allow GET\",\n-                                \"required\": true,\n+                                \"name\": \"Last Will Message\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Allow HEAD\": {\n+                            \"Last Will QoS Level\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\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\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\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\": \"false\",\n-                                \"description\": \"Allow HTTP HEAD Method\",\n-                                \"displayName\": \"Allow HEAD\",\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                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Allow HEAD\",\n+                                \"name\": \"Last Will QoS Level\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Allow OPTIONS\": {\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-                                \"description\": \"Allow HTTP OPTIONS Method\",\n-                                \"displayName\": \"Allow OPTIONS\",\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\": \"Allow OPTIONS\",\n+                                \"name\": \"Last Will Retain\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Allow POST\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n+                            \"Last Will Topic\": {\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"propertyDisplayName\": \"Last Will Message\",\n+                                        \"propertyName\": \"Last Will Message\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"Allow HTTP POST Method\",\n-                                \"displayName\": \"Allow POST\",\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\": \"Allow POST\",\n+                                \"name\": \"Last Will Topic\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Allow PUT\": {\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\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"displayName\": \"v5.0\",\n+                                        \"value\": \"5\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"displayName\": \"v3.1.1\",\n+                                        \"value\": \"4\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"v3.1.0\",\n+                                        \"value\": \"3\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"Allow HTTP PUT Method\",\n-                                \"displayName\": \"Allow PUT\",\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\": \"Allow PUT\",\n+                                \"name\": \"MQTT Specification Version\",\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+                            \"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\": \"Allowed Paths\",\n+                                \"name\": \"Password\",\n                                 \"required\": false,\n-                                \"sensitive\": false\n+                                \"sensitive\": true\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+                            \"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\": \"Client Authentication\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Quality of Service(QoS)\",\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+                            \"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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Default URL Character Set\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Retain Message\",\n                                 \"required\": true,\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+                            \"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\": \"HTTP Context Map\",\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.http.HttpContextMap\",\n+                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n                                     \"version\": \"2.0.0-M3\"\n                                 }\n                             },\n-                            \"HTTP Protocols\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"HTTP/1.1\",\n-                                        \"displayName\": \"http/1.1\",\n-                                        \"value\": \"HTTP_1_1\"\n-                                    },\n+                            \"Session Expiry Interval\": {\n+                                \"defaultValue\": \"24 hrs\",\n+                                \"dependencies\": [\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+                                        \"dependentValues\": [\n+                                            \"5\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"MQTT Specification Version\",\n+                                        \"propertyName\": \"MQTT Specification Version\"\n                                     },\n                                     {\n-                                        \"description\": \"HTTP/2\",\n-                                        \"displayName\": \"h2\",\n-                                        \"value\": \"H2\"\n+                                        \"dependentValues\": [\n+                                            \"false\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Session state\",\n+                                        \"propertyName\": \"Session state\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"HTTP_1_1\",\n-                                \"dependencies\": [\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\": \"Session Expiry Interval\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Session state\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"propertyDisplayName\": \"SSL Context Service\",\n-                                        \"propertyName\": \"SSL Context Service\"\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\": \"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-                                \"description\": \"HTTP Protocols supported for Application Layer Protocol Negotiation with TLS\",\n-                                \"displayName\": \"HTTP Protocols\",\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\": \"HTTP Protocols\",\n+                                \"name\": \"Session state\",\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+                            \"Topic\": {\n+                                \"description\": \"The topic to publish the message to.\",\n+                                \"displayName\": \"Topic\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Hostname\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Topic\",\n+                                \"required\": true,\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+                            \"Username\": {\n+                                \"description\": \"Username to use when connecting to the broker\",\n+                                \"displayName\": \"Username\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Listening Port\",\n-                                \"required\": true,\n+                                \"name\": \"Username\",\n+                                \"required\": false,\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+                            \"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\": \"Maximum Threads\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"message-demarcator\",\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 HTTPS requests; otherwise, the server will accept only HTTP requests\",\n-                                \"displayName\": \"SSL Context 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\": \"SSL Context 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.ssl.RestrictedSSLContextService\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n                                     \"version\": \"2.0.0-M3\"\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+                            \"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\": \"parameters-to-attributes\",\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\": \"2.0.0-M3\"\n+                                }\n                             }\n                         },\n                         \"seeAlso\": [\n-                            \"org.apache.nifi.processors.standard.HandleHttpResponse\"\n+                            \"org.apache.nifi.processors.mqtt.ConsumeMQTT\"\n                         ],\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"All content that is received is routed to the 'success' relationship\",\n+                                \"description\": \"FlowFiles that are sent successfully to the destination are transferred to this relationship.\",\n                                 \"name\": \"success\"\n+                            },\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\": false,\n+                        \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": 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-                            \"https\",\n-                            \"ingress\",\n-                            \"listen\",\n-                            \"request\",\n-                            \"web service\"\n+                            \"IOT\",\n+                            \"MQTT\",\n+                            \"publish\"\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+                        \"type\": \"org.apache.nifi.processors.mqtt.PublishMQTT\",\n+                        \"typeDescription\": \"Publishes a message to an MQTT topic\",\n                         \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\",\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+                        \"version\": \"2.0.0-M3\"\n+                    }\n+                ],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"2.0.0-M3\"\n+        },\n+        {\n+            \"artifact\": \"nifi-box-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n+                \"processors\": [\n                     {\n                         \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-standard-nar\",\n+                        \"artifact\": \"nifi-box-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -44829,293 +52884,391 @@\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_REQUIRED\",\n                         \"multiProcessorUseCases\": [],\n                         \"primaryNodeOnly\": false,\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Attributes to add to the HTTP Response (Regex)\",\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+                            \"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\": \"HTTP Context Map\",\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.http.HttpContextMap\",\n+                                    \"type\": \"org.apache.nifi.box.controllerservices.BoxClientService\",\n                                     \"version\": \"2.0.0-M3\"\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+                            \"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\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"HTTP Status Code\",\n+                                \"name\": \"box-file-id\",\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+                                \"description\": \"The id of the file\",\n+                                \"name\": \"box.id\"\n                             }\n                         ],\n                         \"seeAlso\": [\n-                            \"org.apache.nifi.http.StandardHttpContextMap\",\n-                            \"org.apache.nifi.processors.standard.HandleHttpRequest\"\n+                            \"org.apache.nifi.processors.box.ListBoxFile\",\n+                            \"org.apache.nifi.processors.box.PutBoxFile\"\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+                                \"description\": \"A FlowFile will be routed here for each successfully fetched File.\",\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+                                \"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                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"egress\",\n-                            \"http\",\n-                            \"https\",\n-                            \"response\",\n-                            \"web service\"\n+                            \"box\",\n+                            \"fetch\",\n+                            \"storage\"\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+                        \"type\": \"org.apache.nifi.processors.box.FetchBoxFile\",\n+                        \"typeDescription\": \"Fetches files from a Box Folder. Designed to be used in tandem with ListBoxFile.\",\n                         \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\"\n+                        \"version\": \"2.0.0-M3\",\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                     },\n                     {\n                         \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-standard-nar\",\n+                        \"artifact\": \"nifi-box-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\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+                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n                         \"multiProcessorUseCases\": [],\n-                        \"primaryNodeOnly\": false,\n+                        \"primaryNodeOnly\": true,\n                         \"propertyDescriptors\": {\n-                            \"config-body\": {\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\": \"box-client-service\",\n+                                \"required\": true,\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\": \"2.0.0-M3\"\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"box-folder-id\",\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-                                            \"Replace\",\n-                                            \"Merge\"\n+                                            \"entities\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Config Strategy\",\n-                                        \"propertyName\": \"config-strategy\"\n+                                        \"propertyDisplayName\": \"Listing Strategy\",\n+                                        \"propertyName\": \"listing-strategy\"\n                                     }\n                                 ],\n-                                \"description\": \"Body of MIME type config file. Only one of Config File or Config Body may be used.\",\n-                                \"displayName\": \"Config Body\",\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\": \"config-body\",\n+                                \"name\": \"et-initial-listing-target\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"config-file\": {\n+                            \"et-state-cache\": {\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"Replace\",\n-                                            \"Merge\"\n+                                            \"entities\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Config Strategy\",\n-                                        \"propertyName\": \"config-strategy\"\n+                                        \"propertyDisplayName\": \"Listing Strategy\",\n+                                        \"propertyName\": \"listing-strategy\"\n                                     }\n                                 ],\n-                                \"description\": \"Path to MIME type config file. Only one of Config File or Config Body may be used.\",\n-                                \"displayName\": \"Config File\",\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\": \"2.0.0-M3\"\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\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"config-file\",\n+                                \"name\": \"et-time-window\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"config-strategy\": {\n+                            \"listing-strategy\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Use default NiFi MIME Types.\",\n-                                        \"displayName\": \"Preset\",\n-                                        \"value\": \"Preset\"\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\": \"Use config MIME Types only.\",\n-                                        \"displayName\": \"Replace\",\n-                                        \"value\": \"Replace\"\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\": \"Use config together with default NiFi MIME Types.\",\n-                                        \"displayName\": \"Merge\",\n-                                        \"value\": \"Merge\"\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\": \"Preset\",\n-                                \"description\": \"Select the loading strategy for MIME Type configuration to be used.\",\n-                                \"displayName\": \"Config Strategy\",\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\": \"config-strategy\",\n+                                \"name\": \"listing-strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"use-filename-in-detection\": {\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+                            \"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\": \"2.0.0-M3\"\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\": \"If true will pass the filename to Tika to aid in detection.\",\n-                                \"displayName\": \"Use Filename In Detection\",\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\": \"use-filename-in-detection\",\n+                                \"name\": \"recursive-search\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"sideEffectFree\": true,\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 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                         ],\n-                        \"supportsBatching\": true,\n+                        \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"MIME\",\n-                            \"bzip2\",\n-                            \"compression\",\n-                            \"file\",\n-                            \"gzip\",\n-                            \"identify\",\n-                            \"mime.type\",\n-                            \"zip\"\n+                            \"box\",\n+                            \"storage\"\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.\",\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                         \"useCases\": [],\n                         \"version\": \"2.0.0-M3\",\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 id of the file\",\n+                                \"name\": \"box.id\"\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 name of the file\",\n+                                \"name\": \"filename\"\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 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\": false,\n-                        \"artifact\": \"nifi-standard-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-box-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -45123,123 +53276,85 @@\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                         \"multiProcessorUseCases\": [],\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Connection Timeout\": {\n-                                \"defaultValue\": \"5 secs\",\n-                                \"description\": \"Maximum time to wait for initial socket connection to the HTTP URL.\",\n-                                \"displayName\": \"Connection Timeout\",\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\": \"Connection Timeout\",\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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"HTTP Method\",\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\": \"2.0.0-M3\"\n+                                }\n                             },\n-                            \"HTTP 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+                            \"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\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"HTTP URL\",\n+                                \"name\": \"box-folder-id\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"HTTP/2 Disabled\": {\n-                                \"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+                            \"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\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"HTTP/2 Disabled\",\n-                                \"required\": true,\n+                                \"name\": \"chunked-upload-threshold\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Request Body Enabled\": {\n+                            \"conflict-resolution-strategy\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"description\": \"Handle file conflict as failure.\",\n+                                        \"displayName\": \"fail\",\n+                                        \"value\": \"fail\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"true\",\n-                                \"dependencies\": [\n+                                        \"description\": \"Ignore conflict, do not change the original file.\",\n+                                        \"displayName\": \"ignore\",\n+                                        \"value\": \"ignore\"\n+                                    },\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"POST\",\n-                                            \"PATCH\",\n-                                            \"PUT\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"HTTP Method\",\n-                                        \"propertyName\": \"HTTP Method\"\n+                                        \"description\": \"Replace existing file in case of conflict.\",\n+                                        \"displayName\": \"replace\",\n+                                        \"value\": \"replace\"\n                                     }\n                                 ],\n-                                \"description\": \"Enable sending HTTP request body for PATCH, POST, or PUT methods.\",\n-                                \"displayName\": \"Request Body Enabled\",\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\": \"Request Body Enabled\",\n-                                \"required\": false,\n+                                \"name\": \"conflict-resolution-strategy\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Request Chunked Transfer-Encoding Enabled\": {\n+                            \"create-folder\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n@@ -45247,646 +53362,747 @@\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+                                        \"propertyDisplayName\": \"Subfolder Name\",\n+                                        \"propertyName\": \"subfolder-name\"\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\": \"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\": \"Request Chunked Transfer-Encoding Enabled\",\n+                                \"name\": \"create-folder\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Request 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+                            \"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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Request Content-Encoding\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"file-name\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Request 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+                            \"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\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Request Content-Type\",\n+                                \"name\": \"subfolder-name\",\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+                            },\n+                            {\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\": false,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"box\",\n+                            \"put\",\n+                            \"storage\"\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+                        \"useCases\": [],\n+                        \"version\": \"2.0.0-M3\",\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+                    }\n+                ],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"2.0.0-M3\"\n+        },\n+        {\n+            \"artifact\": \"nifi-mongodb-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n+                \"processors\": [\n+                    {\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-mongodb-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"f2215c6\"\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+                        \"multiProcessorUseCases\": [],\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\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Mongo Collection Name\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Request Date Header 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\": \"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+                            \"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\": \"Request Date Header Enabled\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Mongo Database Name\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Request Digest Authentication Enabled\": {\n+                            \"delete-mongo-delete-mode\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"description\": \"Delete only the first document that matches the query.\",\n+                                        \"displayName\": \"Delete One\",\n+                                        \"value\": \"one\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"dependencies\": [\n+                                        \"description\": \"Delete every document that matches the query.\",\n+                                        \"displayName\": \"Delete Many\",\n+                                        \"value\": \"many\"\n+                                    },\n                                     {\n-                                        \"propertyDisplayName\": \"Request Username\",\n-                                        \"propertyName\": \"Request Username\"\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-                                \"description\": \"Enable Digest Authentication on HTTP requests with Username and Password credentials as described in RFC 7616.\",\n-                                \"displayName\": \"Request Digest Authentication Enabled\",\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\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Request Digest Authentication Enabled\",\n+                                \"name\": \"delete-mongo-delete-mode\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Request Failure Penalization Enabled\": {\n+                            \"delete-mongo-fail-on-no-delete\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n+                                        \"description\": \"Fail when no documents are deleted.\",\n+                                        \"displayName\": \"True\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n+                                        \"description\": \"Do not fail when nothing is deleted.\",\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+                                \"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\": \"Request Failure Penalization Enabled\",\n+                                \"name\": \"delete-mongo-fail-on-no-delete\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Request Header Attributes Pattern\": {\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+                            \"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\": \"Request Header Attributes Pattern\",\n+                                \"name\": \"mongo-client-service\",\n                                 \"required\": false,\n-                                \"sensitive\": 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\": \"2.0.0-M3\"\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-                            \"Request Multipart Form-Data Filename 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-                                \"dependencies\": [\n-                                    {\n-                                        \"propertyDisplayName\": \"Request Multipart Form-Data Name\",\n-                                        \"propertyName\": \"Request Multipart Form-Data 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+                            {\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+                        ],\n+                        \"supportsBatching\": false,\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\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+                        \"useCases\": [],\n+                        \"version\": \"2.0.0-M3\"\n+                    },\n+                    {\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-mongodb-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"f2215c6\"\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+                        \"multiProcessorUseCases\": [],\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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Request Multipart Form-Data Filename Enabled\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Batch Size\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Request Multipart Form-Data Name\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"true\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Request Body Enabled\",\n-                                        \"propertyName\": \"Request Body Enabled\"\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+                            \"Limit\": {\n+                                \"description\": \"The maximum number of elements to return\",\n+                                \"displayName\": \"Limit\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Request Multipart Form-Data Name\",\n+                                \"name\": \"Limit\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Request 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\": \"Request 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\": \"2.0.0-M3\"\n-                                }\n-                            },\n-                            \"Request 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+                            \"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\": \"Request Password\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Mongo Collection Name\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             },\n-                            \"Request User-Agent\": {\n-                                \"description\": \"HTTP User-Agent Header applied to requests. RFC 7231 Section 5.5.3 describes recommend formatting.\",\n-                                \"displayName\": \"Request User-Agent\",\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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Request User-Agent\",\n-                                \"required\": false,\n+                                \"name\": \"Mongo Database Name\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Request 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+                            \"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\": \"Request Username\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Projection\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Response Body Attribute Name\": {\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+                            \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Response Body Attribute Name\",\n+                                \"name\": \"Query\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Response Body Attribute Size\": {\n-                                \"defaultValue\": \"256\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"propertyDisplayName\": \"Response Body Attribute Name\",\n-                                        \"propertyName\": \"Response Body Attribute Name\"\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+                            \"Sort\": {\n+                                \"description\": \"The fields by which to sort; must be a valid BSON document\",\n+                                \"displayName\": \"Sort\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Response Body Attribute Size\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Sort\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Response Body Ignored\": {\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-                                \"description\": \"Disable writing HTTP response FlowFiles to Response relationship\",\n-                                \"displayName\": \"Response Body Ignored\",\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\": \"Response Body Ignored\",\n-                                \"required\": true,\n+                                \"name\": \"get-mongo-send-empty\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Response Cache Enabled\": {\n+                            \"json-type\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\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\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\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\": \"false\",\n-                                \"description\": \"Enable HTTP response caching described in RFC 7234. Caching responses considers ETag and other headers.\",\n-                                \"displayName\": \"Response Cache Enabled\",\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\": \"Response Cache Enabled\",\n+                                \"name\": \"json-type\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Response Cache Size\": {\n-                                \"defaultValue\": \"10MB\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"true\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Response Cache Enabled\",\n-                                        \"propertyName\": \"Response Cache Enabled\"\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+                            \"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\": \"Response Cache Size\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"mongo-charset\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Response 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+                            \"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\": \"Response Cookie Strategy\",\n-                                \"required\": true,\n-                                \"sensitive\": false\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\": \"2.0.0-M3\"\n+                                }\n                             },\n-                            \"Response FlowFile 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+                            \"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.\",\n+                                \"displayName\": \"Date Format\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Response FlowFile Naming Strategy\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"mongo-date-format\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Response Generation Required\": {\n-                                \"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+                            \"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\": \"Response Generation Required\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"mongo-query-attribute\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Response Header Request Attributes 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\": \"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+                            \"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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Response Header Request Attributes Enabled\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"results-per-flowfile\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Response Redirects Enabled\": {\n+                            \"use-pretty-printing\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"True\",\n-                                        \"value\": \"True\"\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"False\",\n-                                        \"value\": \"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+                                \"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                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Response Redirects Enabled\",\n+                                \"name\": \"use-pretty-printing\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n+                            }\n+                        },\n+                        \"sideEffectFree\": false,\n+                        \"supportedRelationships\": [\n+                            {\n+                                \"description\": \"All FlowFiles that have the results of a successful query execution go here.\",\n+                                \"name\": \"success\"\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+                            {\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+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"get\",\n+                            \"mongodb\",\n+                            \"read\"\n+                        ],\n+                        \"triggerSerially\": false,\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+                        \"useCases\": [],\n+                        \"version\": \"2.0.0-M3\",\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-mongodb-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"f2215c6\"\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+                        \"multiProcessorUseCases\": [],\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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"SSL Context Service\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Batch 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\": \"2.0.0-M3\"\n-                                }\n+                                \"sensitive\": false\n                             },\n-                            \"Socket Idle Connections\": {\n-                                \"defaultValue\": \"5\",\n-                                \"description\": \"Maximum number of idle connections to the HTTP URL.\",\n-                                \"displayName\": \"Socket Idle Connections\",\n+                            \"Limit\": {\n+                                \"description\": \"The maximum number of elements to return\",\n+                                \"displayName\": \"Limit\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Socket Idle Connections\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Limit\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Socket 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+                            \"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\": \"Socket Idle Timeout\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Mongo Collection Name\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Socket 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+                            \"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\": \"Socket Read Timeout\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Mongo Database Name\",\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+                            \"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\": \"Environment variables 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\": \"Environment variables 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\": \"Environment variables 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\": \"Socket Write Timeout\",\n+                                \"name\": \"get-mongo-record-writer-factory\",\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\": \"2.0.0-M3\"\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, 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+                            \"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\": \"proxy-configuration-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.proxy.ProxyConfigurationService\",\n+                                    \"type\": \"org.apache.nifi.mongodb.MongoDBClientService\",\n                                     \"version\": \"2.0.0-M3\"\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\": \"Environment variables 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\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"mongodb-schema-name\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             }\n                         },\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\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\": \"Response FlowFiles transferred when receiving HTTP responses with a status code between 200 and 299.\",\n-                                \"name\": \"Response\"\n-                            },\n-                            {\n-                                \"description\": \"Request FlowFiles transferred when receiving HTTP responses with a status code between 500 and 599.\",\n-                                \"name\": \"Retry\"\n+                                \"description\": \"All FlowFiles that have the results of a successful query execution go here.\",\n+                                \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"Request FlowFiles transferred when receiving socket communication errors.\",\n-                                \"name\": \"Failure\"\n+                                \"description\": \"All input FlowFiles that are part of a failed query execution go here.\",\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+                                \"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\": true,\n-                        \"supportsDynamicProperties\": true,\n+                        \"supportsBatching\": false,\n+                        \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n-                        \"supportsSensitiveDynamicProperties\": true,\n+                        \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"client\",\n-                            \"http\",\n-                            \"https\",\n-                            \"rest\"\n+                            \"fetch\",\n+                            \"get\",\n+                            \"json\",\n+                            \"mongo\",\n+                            \"mongodb\",\n+                            \"record\"\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+                        \"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                         \"useCases\": [],\n                         \"version\": \"2.0.0-M3\",\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+                                \"description\": \"The database where the results came from.\",\n+                                \"name\": \"mongo.database.name\"\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+                                \"description\": \"The collection where the results came from.\",\n+                                \"name\": \"mongo.collection.name\"\n                             }\n                         ]\n                     },\n                     {\n                         \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-standard-nar\",\n+                        \"artifact\": \"nifi-mongodb-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -45899,2253 +54115,2025 @@\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"multiProcessorUseCases\": [],\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+                            \"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\": \"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\": \"2.0.0-M3\"\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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Insertion Record Path\",\n+                                \"name\": \"Character Set\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Join Strategy\": {\n+                            \"Mode\": {\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-                                    },\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\": \"\",\n+                                        \"displayName\": \"insert\",\n+                                        \"value\": \"insert\"\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\": \"update\",\n+                                        \"value\": \"update\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"Wrapper\",\n-                                \"description\": \"Specifies how to join the two FlowFiles into a single FlowFile\",\n-                                \"displayName\": \"Join Strategy\",\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\": \"Join Strategy\",\n+                                \"name\": \"Mode\",\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+                            \"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\": \"Maximum number of Bins\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Mongo Collection Name\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Original Record Reader\": {\n-                                \"description\": \"The Record Reader for reading the 'original' FlowFile\",\n-                                \"displayName\": \"Original Record Reader\",\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\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Mongo Database Name\",\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Update Query Key\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Upsert\": {\n+                                \"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 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\": \"Original Record Reader\",\n+                                \"name\": \"Upsert\",\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\": \"2.0.0-M3\"\n-                                }\n+                                \"sensitive\": false\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+                            \"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\": \"Record Writer\",\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.serialization.RecordSetWriterFactory\",\n+                                    \"type\": \"org.apache.nifi.mongodb.MongoDBClientService\",\n                                     \"version\": \"2.0.0-M3\"\n                                 }\n                             },\n-                            \"SQL\": {\n-                                \"defaultValue\": \"SELECT original.*, enrichment.* \\nFROM original \\nLEFT OUTER JOIN enrichment \\nON original.id = enrichment.id\",\n-                                \"dependencies\": [\n+                            \"put-mongo-update-mode\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"SQL\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Join Strategy\",\n-                                        \"propertyName\": \"Join Strategy\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"With whole document\",\n+                                        \"value\": \"doc\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"With operators enabled\",\n+                                        \"value\": \"operators\"\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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"SQL\",\n-                                \"required\": true,\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+                                \"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\": \"Timeout\",\n+                                \"name\": \"put-mongo-update-mode\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"dbf-default-precision\",\n-                                \"required\": false,\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+                            \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"dbf-default-scale\",\n+                                \"name\": \"putmongo-update-query\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.standard.ForkEnrichment\"\n-                        ],\n-                        \"sideEffectFree\": true,\n+                        \"sideEffectFree\": false,\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+                                \"description\": \"All FlowFiles that are written to MongoDB are routed to this relationship\",\n+                                \"name\": \"success\"\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+                                \"description\": \"All FlowFiles that cannot be written to MongoDB are 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                         \"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+                                \"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-                            \"combine\",\n-                            \"enrichment\",\n-                            \"fork\",\n-                            \"join\",\n-                            \"merge\",\n-                            \"record\",\n-                            \"recordpath\",\n-                            \"sql\",\n-                            \"streams\",\n-                            \"wrap\"\n+                            \"insert\",\n+                            \"mongodb\",\n+                            \"put\",\n+                            \"update\",\n+                            \"write\"\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+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.mongodb.PutMongo\",\n+                        \"typeDescription\": \"Writes the contents of a FlowFile to MongoDB\",\n                         \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\",\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+                        \"version\": \"2.0.0-M3\"\n                     },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-standard-nar\",\n+                        \"artifact\": \"nifi-mongodb-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\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-                        \"multiProcessorUseCases\": [\n-                            {\n-                                \"configurations\": [\n-                                    {\n-                                        \"configuration\": \"Configure the \\\"Database Connection Pooling Service\\\" property to specify a Connection Pool that is applicable for interacting with your database.\\nLeave the RecordWriter property unset.\\n\\nSet the \\\"Catalog\\\" property to the name of the database Catalog; leave it empty to include all catalogs.\\nSet the \\\"Schema Pattern\\\" property to a Java Regular Expression that matches all database Schemas that should be included; leave it empty to include all Schemas.\\nSet the \\\"Table Name Pattern\\\" property to a Java Regular Expression that matches the names of all tables that should be included; leave it empty to include all Tables.\\n\\nConnect the \\\"success\\\" relationship to GenerateTableFetch.\\n\",\n-                                        \"processorClassName\": \"org.apache.nifi.processors.standard.ListDatabaseTables\"\n-                                    },\n-                                    {\n-                                        \"configuration\": \"Configure the \\\"Database Connection Pooling Service\\\" property to specify the same Connection Pool that was used in ListDatabaseTables.\\nSet the \\\"Database Type\\\" property to match the appropriate value for your RDBMS vendor.\\nSet \\\"Table Name\\\" to `${db.table.fullname}`\\nLeave the RecordWriter property unset.\\n\\nConnect the \\\"success\\\" relationship to ExecuteSQLRecord.\\n\",\n-                                        \"processorClassName\": \"org.apache.nifi.processors.standard.GenerateTableFetch\"\n-                                    },\n-                                    {\n-                                        \"configuration\": \"Configure the \\\"Database Connection Pooling Service\\\" property to specify the same Connection Pool that was used in ListDatabaseTables.\\nConfigure the \\\"Record Writer\\\" property to specify a Record Writer that is appropriate for the desired output data type.\\nLeave the \\\"SQL select query\\\" unset.\\n\\nConnect the \\\"success\\\" relationship to the next Processor in the flow.\\n\",\n-                                        \"processorClassName\": \"org.apache.nifi.processors.standard.ExecuteSQLRecord\"\n-                                    }\n-                                ],\n-                                \"description\": \"Perform a full load of a database, retrieving all rows from all tables, or a specific set of tables.\",\n-                                \"keywords\": [\n-                                    \"full load\",\n-                                    \"rdbms\",\n-                                    \"jdbc\",\n-                                    \"database\"\n-                                ],\n-                                \"notes\": \"\"\n-                            }\n-                        ],\n-                        \"primaryNodeOnly\": true,\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"multiProcessorUseCases\": [],\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+                            \"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\": \"list-db-include-count\",\n+                                \"name\": \"Character Set\",\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+                            \"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\": \"list-db-refresh-interval\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Mongo Collection Name\",\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+                            \"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\": \"list-db-tables-db-connection\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Mongo Database Name\",\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\": \"2.0.0-M3\"\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+                            \"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\": \"true\",\n+                                \"description\": \"Ordered execution of bulk-writes and break on error - otherwise arbitrary order and continue on error\",\n+                                \"displayName\": \"Ordered\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"list-db-tables-types\",\n-                                \"required\": false,\n+                                \"name\": \"Ordered\",\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+                            \"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\": \"record-writer\",\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.serialization.RecordSetWriterFactory\",\n+                                    \"type\": \"org.apache.nifi.mongodb.MongoDBClientService\",\n                                     \"version\": \"2.0.0-M3\"\n                                 }\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\": \"All FlowFiles that are received are routed to success\",\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                         ],\n                         \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": 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-                            \"database\",\n-                            \"jdbc\",\n-                            \"list\",\n-                            \"sql\",\n-                            \"table\"\n+                            \"bulk\",\n+                            \"insert\",\n+                            \"mongodb\",\n+                            \"put\",\n+                            \"update\",\n+                            \"write\"\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.mongodb.PutMongoBulkOperations\",\n+                        \"typeDescription\": \"Writes the contents of a FlowFile to MongoDB as bulk-update\",\n                         \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\",\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+                        \"version\": \"2.0.0-M3\"\n                     },\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-standard-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-mongodb-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\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+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"multiProcessorUseCases\": [],\n-                        \"primaryNodeOnly\": true,\n+                        \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Connection Mode\": {\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\": \"Environment variables 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\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Mongo Database Name\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"bypass-validation\": {\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-                                \"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+                                \"defaultValue\": \"False\",\n+                                \"description\": \"        Enable or disable bypassing document schema validation during insert or update operations.\\n        Bypassing document validation is a Privilege Action in MongoDB.\\n        Enabling this property can result in authorization errors for users with limited privileges.\\n\",\n+                                \"displayName\": \"Bypass Validation\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Connection Timeout\",\n+                                \"name\": \"bypass-validation\",\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+                            \"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\": \"Data Timeout\",\n+                                \"name\": \"insert_count\",\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+                            \"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\": \"Distributed Cache 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.distributed.cache.client.DistributedMapCacheClient\",\n+                                    \"type\": \"org.apache.nifi.mongodb.MongoDBClientService\",\n                                     \"version\": \"2.0.0-M3\"\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Http Proxy Username\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Ignore Dotted Files\": {\n+                            \"ordered\": {\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\": \"If true, files whose names begin with a dot (\\\".\\\") will be ignored\",\n-                                \"displayName\": \"Ignore Dotted Files\",\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\": \"Ignore Dotted Files\",\n+                                \"name\": \"ordered\",\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+                            \"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\": \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Password\",\n-                                \"required\": false,\n-                                \"sensitive\": true\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\": \"2.0.0-M3\"\n+                                }\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+                            \"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\": \"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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Proxy Port\",\n+                                \"name\": \"update-key-fields\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Proxy Type\": {\n+                            \"update-mode\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"DIRECT\",\n-                                        \"value\": \"DIRECT\"\n+                                        \"description\": \"Updates only the first document that matches the query.\",\n+                                        \"displayName\": \"Update One\",\n+                                        \"value\": \"one\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"HTTP\",\n-                                        \"value\": \"HTTP\"\n+                                        \"description\": \"Updates every document that matches the query.\",\n+                                        \"displayName\": \"Update Many\",\n+                                        \"value\": \"many\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SOCKS\",\n-                                        \"value\": \"SOCKS\"\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\": \"DIRECT\",\n-                                \"description\": \"Proxy type used for file transfers\",\n-                                \"displayName\": \"Proxy Type\",\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                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Proxy Type\",\n+                                \"name\": \"update-mode\",\n                                 \"required\": false,\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+                        ],\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-                            \"Remote Path\": {\n-                                \"defaultValue\": \".\",\n-                                \"description\": \"The path on the remote system from which to pull or push files\",\n-                                \"displayName\": \"Remote Path\",\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+                        ],\n+                        \"supportsBatching\": false,\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"insert\",\n+                            \"mongodb\",\n+                            \"put\",\n+                            \"record\",\n+                            \"update\",\n+                            \"upsert\"\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+                        \"useCases\": [],\n+                        \"version\": \"2.0.0-M3\"\n+                    },\n+                    {\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-mongodb-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"f2215c6\"\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+                        \"multiProcessorUseCases\": [],\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                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Remote Path\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Batch Size\",\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+                            \"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\": \"Remote Poll Batch Size\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Mongo Collection Name\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Search Recursively\": {\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\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Mongo Database Name\",\n+                                \"required\": true,\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\": \"If true, will pull files from arbitrarily nested subdirectories; otherwise, will not traverse subdirectories\",\n-                                \"displayName\": \"Search Recursively\",\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\": \"Search Recursively\",\n+                                \"name\": \"allow-disk-use\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Transfer Mode\": {\n+                            \"json-type\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Binary\",\n-                                        \"value\": \"Binary\"\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\": \"\",\n-                                        \"displayName\": \"ASCII\",\n-                                        \"value\": \"ASCII\"\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\": \"Binary\",\n-                                \"description\": \"The FTP Transfer Mode\",\n-                                \"displayName\": \"Transfer Mode\",\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\": \"Transfer Mode\",\n-                                \"required\": false,\n+                                \"name\": \"json-type\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Username\": {\n-                                \"description\": \"Username\",\n-                                \"displayName\": \"Username\",\n+                            \"mongo-agg-query\": {\n+                                \"description\": \"The aggregation query to be executed.\",\n+                                \"displayName\": \"Query\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Username\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"mongo-agg-query\",\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+                            \"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\": \"et-initial-listing-target\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"mongo-charset\",\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+                            \"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\": \"et-state-cache\",\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.distributed.cache.client.DistributedMapCacheClient\",\n+                                    \"type\": \"org.apache.nifi.mongodb.MongoDBClientService\",\n                                     \"version\": \"2.0.0-M3\"\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+                            \"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.\",\n+                                \"displayName\": \"Date Format\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"et-time-window\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"mongo-date-format\",\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"ftp-use-utf8\",\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: HTTP + AuthN, SOCKS + AuthN\",\n-                                \"displayName\": \"Proxy Configuration 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\": \"proxy-configuration-service\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables 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.proxy.ProxyConfigurationService\",\n-                                    \"version\": \"2.0.0-M3\"\n-                                }\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+                            \"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\": \"record-writer\",\n+                                \"name\": \"results-per-flowfile\",\n                                 \"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\": \"2.0.0-M3\"\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.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\": \"All FlowFiles that are received are routed to success\",\n-                                \"name\": \"success\"\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                         ],\n                         \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"files\",\n-                            \"ftp\",\n-                            \"ingest\",\n-                            \"input\",\n-                            \"list\",\n-                            \"remote\",\n-                            \"source\"\n+                            \"aggregate\",\n+                            \"aggregation\",\n+                            \"mongo\"\n                         ],\n-                        \"triggerSerially\": true,\n+                        \"triggerSerially\": false,\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.mongodb.RunMongoAggregation\",\n+                        \"typeDescription\": \"A processor that runs an aggregation query whenever a flowfile is received.\",\n                         \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\",\n-                        \"writesAttributes\": [\n-                            {\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+                        \"version\": \"2.0.0-M3\"\n                     },\n                     {\n                         \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-standard-nar\",\n+                        \"artifact\": \"nifi-mongodb-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\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+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"multiProcessorUseCases\": [],\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+                            \"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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"File Filter\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"delete-gridfs-query\",\n+                                \"required\": false,\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\": \"true\",\n-                                \"description\": \"Indicates whether or not hidden files should be ignored\",\n-                                \"displayName\": \"Ignore Hidden Files\",\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\": \"Ignore Hidden Files\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"gridfs-bucket-name\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\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\": \"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+                            \"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\": \"Include File Attributes\",\n+                                \"name\": \"gridfs-client-service\",\n                                 \"required\": true,\n-                                \"sensitive\": 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\": \"2.0.0-M3\"\n+                                }\n                             },\n-                            \"Input Directory\": {\n-                                \"description\": \"The input directory from which files to pull files\",\n-                                \"displayName\": \"Input Directory\",\n+                            \"gridfs-database-name\": {\n+                                \"description\": \"The name of the database to use\",\n+                                \"displayName\": \"Mongo Database Name\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Input Directory\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"gridfs-database-name\",\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+                            \"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\": \"Input Directory Location\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"gridfs-file-name\",\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+                            \"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\": \"Maximum File Age\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\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-                            \"Maximum File Size\": {\n-                                \"description\": \"The maximum size that a file can be in order to be pulled\",\n-                                \"displayName\": \"Maximum File Size\",\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+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"delete\",\n+                            \"gridfs\",\n+                            \"mongodb\"\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+                        \"useCases\": [],\n+                        \"version\": \"2.0.0-M3\"\n+                    },\n+                    {\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-mongodb-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"f2215c6\"\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+                        \"multiProcessorUseCases\": [],\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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Maximum File Size\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"gridfs-bucket-name\",\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+                            \"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\": \"Minimum File Age\",\n+                                \"name\": \"gridfs-client-service\",\n                                 \"required\": true,\n-                                \"sensitive\": 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\": \"2.0.0-M3\"\n+                                }\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+                            \"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\": \"Minimum File Size\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"gridfs-database-name\",\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+                            \"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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Path Filter\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"gridfs-file-name\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Recurse Subdirectories\": {\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\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"gridfs-query\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"mongo-operation-mode\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\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\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\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\": \"true\",\n-                                \"description\": \"Indicates whether to list files from subdirectories of the directory\",\n-                                \"displayName\": \"Recurse Subdirectories\",\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\": \"Recurse Subdirectories\",\n+                                \"name\": \"mongo-operation-mode\",\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+                            \"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\": \"et-initial-listing-target\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\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-                            \"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+                            {\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+                        \"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+                        \"useCases\": [],\n+                        \"version\": \"2.0.0-M3\",\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\": \"f2215c6\"\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+                        \"multiProcessorUseCases\": [],\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"et-node-identifier\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"gridfs-bucket-name\",\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+                            \"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\": \"et-state-cache\",\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.distributed.cache.client.DistributedMapCacheClient\",\n+                                    \"type\": \"org.apache.nifi.mongodb.MongoDBClientService\",\n                                     \"version\": \"2.0.0-M3\"\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"et-time-window\",\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 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+                            \"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\": \"listing-strategy\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"gridfs-database-name\",\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"max-listing-time\",\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+                            \"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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"max-operation-time\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"gridfs-file-name\",\n+                                \"required\": true,\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+                            \"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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"max-performance-metrics\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"putgridfs-chunk-size\",\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-                                \"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\": \"2.0.0-M3\"\n-                                }\n-                            },\n-                            \"target-system-timestamp-precision\": {\n+                            \"putgridfs-enforce-uniqueness\": {\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\": \"No uniqueness will be enforced.\",\n+                                        \"displayName\": \"None\",\n+                                        \"value\": \"none\"\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\": \"Both the filename and hash must be unique.\",\n+                                        \"displayName\": \"Both\",\n+                                        \"value\": \"both\"\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\": \"Only the filename must be unique.\",\n+                                        \"displayName\": \"Name\",\n+                                        \"value\": \"name\"\n                                     },\n                                     {\n-                                        \"description\": \"For a target system that only supports precision in minutes.\",\n-                                        \"displayName\": \"Minutes\",\n-                                        \"value\": \"minutes\"\n+                                        \"description\": \"Only the file hash must be unique.\",\n+                                        \"displayName\": \"Hash\",\n+                                        \"value\": \"hash\"\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\": \"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\": \"target-system-timestamp-precision\",\n+                                \"name\": \"putgridfs-enforce-uniqueness\",\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+                            \"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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"track-performance\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"putgridfs-hash-attribute\",\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"putgridfs-properties-prefix\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"seeAlso\": [\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-                                \"LOCAL\",\n-                                \"CLUSTER\"\n-                            ]\n-                        },\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"All FlowFiles that are received are routed to success\",\n+                                \"description\": \"When the operation succeeds, the flowfile is sent to this relationship.\",\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+                                \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n                             \"file\",\n-                            \"filesystem\",\n-                            \"get\",\n-                            \"ingest\",\n-                            \"list\",\n-                            \"source\"\n+                            \"gridfs\",\n+                            \"mongo\",\n+                            \"put\",\n+                            \"store\"\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.processors.mongodb.gridfs.PutGridFS\",\n+                        \"typeDescription\": \"Writes a file to a GridFS bucket.\",\n                         \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"The name of the file that was read from filesystem.\",\n-                                \"name\": \"filename\"\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-                            },\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-                            },\n-                            {\n-                                \"description\": \"The user that owns the file in filesystem\",\n-                                \"name\": \"file.owner\"\n-                            },\n-                            {\n-                                \"description\": \"The group that owns the file in filesystem\",\n-                                \"name\": \"file.group\"\n-                            },\n-                            {\n-                                \"description\": \"The number of bytes in the file in filesystem\",\n-                                \"name\": \"file.size\"\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-                            },\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+                        \"version\": \"2.0.0-M3\"\n+                    }\n+                ],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\n+        },\n+        {\n+            \"artifact\": \"nifi-db-schema-registry-service-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-db-schema-registry-service-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"f2215c6\"\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Catalog Name\",\n+                                \"required\": false,\n+                                \"sensitive\": false\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+                            \"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\": \"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\": \"2.0.0-M3\"\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Schema Name\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            }\n+                        },\n+                        \"providedApiImplementations\": [\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+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.schemaregistry.services.SchemaRegistry\",\n+                                \"version\": \"2.0.0-M3\"\n                             }\n-                        ]\n-                    },\n+                        ],\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"database\",\n+                            \"registry\",\n+                            \"schema\",\n+                            \"table\"\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+                        \"version\": \"2.0.0-M3\"\n+                    }\n+                ],\n+                \"processors\": [],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"2.0.0-M3\"\n+        },\n+        {\n+            \"artifact\": \"nifi-social-media-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n+                \"processors\": [\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-standard-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-social-media-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\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                         \"multiProcessorUseCases\": [],\n                         \"primaryNodeOnly\": true,\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+                            \"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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Ciphers Allowed\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"backfill-minutes\",\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+                            \"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 Timeout\",\n+                                \"name\": \"backoff-attempts\",\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+                            \"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\": \"Data Timeout\",\n+                                \"name\": \"backoff-time\",\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+                            \"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\": \"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\": \"2.0.0-M3\"\n-                                }\n+                                \"name\": \"base-path\",\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+                            \"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\": \"File Filter Regex\",\n-                                \"required\": false,\n+                                \"name\": \"batch-size\",\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+                            \"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\": \"Host Key File\",\n-                                \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\"\n-                                    ]\n-                                },\n-                                \"sensitive\": false\n+                                \"name\": \"bearer-token\",\n+                                \"required\": true,\n+                                \"sensitive\": true\n                             },\n-                            \"Hostname\": {\n-                                \"description\": \"The fully qualified hostname or IP address of the remote system\",\n-                                \"displayName\": \"Hostname\",\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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Hostname\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"connect-timeout\",\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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+                            \"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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Http Proxy Username\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"expansions\",\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+                            \"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\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Ignore Dotted Files\",\n+                                \"name\": \"maximum-backoff-time\",\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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+                            \"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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Key Exchange Algorithms Allowed\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"media-fields\",\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+                            \"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\": \"Maximum File Age\",\n+                                \"name\": \"place-fields\",\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+                            \"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\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Maximum File Size\",\n+                                \"name\": \"poll-fields\",\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+                            \"queue-size\": {\n+                                \"defaultValue\": \"10000\",\n+                                \"description\": \"Maximum size of internal queue for streamed messages\",\n+                                \"displayName\": \"Queue Size\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Message Authentication Codes Allowed\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"queue-size\",\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+                            \"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\": \"Minimum File Age\",\n+                                \"name\": \"read-timeout\",\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+                            \"stream-endpoint\": {\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+                                    },\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+                                    }\n+                                ],\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\": \"Minimum File Size\",\n+                                \"name\": \"stream-endpoint\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Password\": {\n-                                \"description\": \"Password for the user account\",\n-                                \"displayName\": \"Password\",\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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Password\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"tweet-fields\",\n                                 \"required\": false,\n-                                \"sensitive\": true\n+                                \"sensitive\": false\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+                            \"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\": \"Path Filter Regex\",\n+                                \"name\": \"user-fields\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n+                            }\n+                        },\n+                        \"sideEffectFree\": false,\n+                        \"supportedRelationships\": [\n+                            {\n+                                \"description\": \"FlowFiles containing an array of one or more Tweets\",\n+                                \"name\": \"success\"\n+                            }\n+                        ],\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": 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.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+                        \"useCases\": [],\n+                        \"version\": \"2.0.0-M3\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"The MIME Type set to application/json\",\n+                                \"name\": \"mime.type\"\n                             },\n-                            \"Port\": {\n-                                \"defaultValue\": \"22\",\n-                                \"description\": \"The port that the remote system is listening on for file transfers\",\n-                                \"displayName\": \"Port\",\n+                            {\n+                                \"description\": \"The number of Tweets in the FlowFile\",\n+                                \"name\": \"tweets\"\n+                            }\n+                        ]\n+                    }\n+                ],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"2.0.0-M3\"\n+        },\n+        {\n+            \"artifact\": \"nifi-image-viewer-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n+                \"processors\": [],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"2.0.0-M3\"\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\": \"f2215c6\"\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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Port\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"asana-api-url\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Private Key Passphrase\": {\n-                                \"description\": \"Password for the private key\",\n-                                \"displayName\": \"Private Key Passphrase\",\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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Private Key Passphrase\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"asana-personal-access-token\",\n+                                \"required\": true,\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+                            \"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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Private Key Path\",\n-                                \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\"\n-                                    ]\n-                                },\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"asana-workspace-name\",\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+                            }\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\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\n+                    }\n+                ],\n+                \"processors\": [],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"2.0.0-M3\"\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\": \"f2215c6\"\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+                        \"multiProcessorUseCases\": [],\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Proxy Host\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"attribute-list\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Proxy Port\": {\n-                                \"description\": \"The port of the proxy server\",\n-                                \"displayName\": \"Proxy Port\",\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Proxy Port\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"attributes-regex\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Proxy Type\": {\n+                            \"destination\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"DIRECT\",\n-                                        \"value\": \"DIRECT\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"HTTP\",\n-                                        \"value\": \"HTTP\"\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\": \"\",\n-                                        \"displayName\": \"SOCKS\",\n-                                        \"value\": \"SOCKS\"\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\": \"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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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+                                \"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\": \"Remote Poll Batch Size\",\n+                                \"name\": \"destination\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Search Recursively\": {\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\": \"false\",\n-                                \"description\": \"If true, will pull files from arbitrarily nested subdirectories; otherwise, will not traverse subdirectories\",\n-                                \"displayName\": \"Search Recursively\",\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                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Search Recursively\",\n+                                \"name\": \"include-core-attributes\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Send Keep Alive On Timeout\": {\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\": \"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\": \"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                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Send Keep Alive On Timeout\",\n+                                \"name\": \"include-schema\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Strict Host Key Checking\": {\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\": \"Indicates whether or not strict enforcement of hosts keys should be applied\",\n-                                \"displayName\": \"Strict Host Key Checking\",\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\": \"Strict Host Key Checking\",\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-                            \"Use Compression\": {\n+                            {\n+                                \"description\": \"Failed to convert attributes to CSV\",\n+                                \"name\": \"failure\"\n+                            }\n+                        ],\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\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+                        \"useCases\": [],\n+                        \"version\": \"2.0.0-M3\",\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\": \"f2215c6\"\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+                        \"multiProcessorUseCases\": [],\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\": \"Indicates whether or not ZLIB compression should be used when transferring files\",\n-                                \"displayName\": \"Use Compression\",\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\": \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Username\",\n+                                \"name\": \"Destination\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"et-initial-listing-target\": {\n+                            \"Include Core 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+                                \"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\": \"et-initial-listing-target\",\n-                                \"required\": false,\n+                                \"name\": \"Include Core Attributes\",\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+                            \"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\": \"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\": \"2.0.0-M3\"\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"et-time-window\",\n-                                \"required\": false,\n+                                \"name\": \"JSON Handling Strategy\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"follow-symlink\": {\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\": \"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+                                \"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\": \"follow-symlink\",\n+                                \"name\": \"Null Value\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"listing-strategy\": {\n+                            \"Pretty Print\": {\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+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\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+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"false\",\n+                                \"dependencies\": [\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+                                        \"dependentValues\": [\n+                                            \"flowfile-content\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Destination\",\n+                                        \"propertyName\": \"Destination\"\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\": \"Apply pretty print formatting to the output.\",\n+                                \"displayName\": \"Pretty Print\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"listing-strategy\",\n+                                \"name\": \"Pretty Print\",\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\": \"2.0.0-M3\"\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+                            \"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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"record-writer\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"attributes-to-json-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.serialization.RecordSetWriterFactory\",\n-                                    \"version\": \"2.0.0-M3\"\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+                        \"sideEffectFree\": true,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"All FlowFiles that are received are routed to success\",\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                         ],\n-                        \"supportsBatching\": false,\n+                        \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"files\",\n-                            \"ingest\",\n-                            \"input\",\n-                            \"list\",\n-                            \"remote\",\n-                            \"sftp\",\n-                            \"source\"\n+                            \"attributes\",\n+                            \"flowfile\",\n+                            \"json\"\n                         ],\n-                        \"triggerSerially\": true,\n+                        \"triggerSerially\": false,\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+                        \"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                         \"useCases\": [],\n                         \"version\": \"2.0.0-M3\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"The hostname of the SFTP Server\",\n-                                \"name\": \"sftp.remote.host\"\n-                            },\n-                            {\n-                                \"description\": \"The port that was connected to on the SFTP Server\",\n-                                \"name\": \"sftp.remote.port\"\n-                            },\n-                            {\n-                                \"description\": \"The username of the user that performed the SFTP Listing\",\n-                                \"name\": \"sftp.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 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+                                \"description\": \"JSON representation of Attributes\",\n+                                \"name\": \"JSONAttributes\"\n                             }\n                         ]\n                     },\n                     {\n                         \"additionalDetails\": true,\n                         \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n@@ -48159,113 +56147,98 @@\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_FORBIDDEN\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"multiProcessorUseCases\": [],\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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+                            \"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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"listening-port\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"record-stats-limit\",\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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+                            \"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\": \"ssl-context-service\",\n-                                \"required\": false,\n+                                \"name\": \"record-stats-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\": \"2.0.0-M3\"\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"username\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n                             }\n                         },\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"Relationship for successfully received files.\",\n+                                \"description\": \"If a flowfile is successfully processed, it goes here.\",\n                                 \"name\": \"success\"\n+                            },\n+                            {\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\": false,\n+                        \"supportsDynamicProperties\": true,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"FTP\",\n-                            \"FTPS\",\n-                            \"ingest\",\n-                            \"listen\"\n+                            \"metrics\",\n+                            \"record\",\n+                            \"stats\"\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+                        \"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                         \"useCases\": [],\n                         \"version\": \"2.0.0-M3\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"The name of the file received via the FTP/FTPS connection.\",\n-                                \"name\": \"filename\"\n+                                \"description\": \"A count of the records in the record set in the FlowFile.\",\n+                                \"name\": \"record.count\"\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+                                \"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                         \"additionalDetails\": false,\n                         \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n@@ -48280,306 +56253,326 @@\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-                        \"multiProcessorUseCases\": [],\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"multiProcessorUseCases\": [\n+                            {\n+                                \"configurations\": [\n+                                    {\n+                                        \"configuration\": \"Default property values are sufficient.\\nConnect the 'success' relationship to CompressContent.\\n\",\n+                                        \"processorClassName\": \"org.apache.nifi.processors.standard.IdentifyMimeType\"\n+                                    },\n+                                    {\n+                                        \"configuration\": \"\\\"Mode\\\" = \\\"decompress\\\"\\n\\\"Compression Format\\\" = \\\"use mime.type attribute\\\"\\n\",\n+                                        \"processorClassName\": \"org.apache.nifi.processors.standard.CompressContent\"\n+                                    }\n+                                ],\n+                                \"description\": \"Check whether or not a FlowFile is compressed and if so, decompress it.\",\n+                                \"keywords\": [\n+                                    \"auto\",\n+                                    \"detect\",\n+                                    \"mime type\",\n+                                    \"compress\",\n+                                    \"decompress\",\n+                                    \"gzip\",\n+                                    \"bzip2\"\n+                                ],\n+                                \"notes\": \"If IdentifyMimeType determines that the content is not compressed, CompressContent will pass the FlowFile along to the 'success' relationship without attempting to decompress it.\"\n+                            }\n+                        ],\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-                                \"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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Base Path\",\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-                            },\n-                            \"HTTP Protocols\": {\n+                            \"Compression Format\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"HTTP/1.1\",\n-                                        \"displayName\": \"http/1.1\",\n-                                        \"value\": \"HTTP_1_1\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"use mime.type attribute\",\n+                                        \"value\": \"use mime.type attribute\"\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\": \"gzip\",\n+                                        \"value\": \"gzip\"\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\": \"deflate\",\n+                                        \"value\": \"deflate\"\n+                                    },\n                                     {\n-                                        \"propertyDisplayName\": \"SSL Context Service\",\n-                                        \"propertyName\": \"SSL Context Service\"\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-                                \"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-                            \"Listening Port\": {\n-                                \"description\": \"The Port to listen on for incoming connections\",\n-                                \"displayName\": \"Listening Port\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Listening Port\",\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Max Data to Receive per Second\",\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+                                \"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\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Max Unconfirmed Flowfile Time\",\n+                                \"name\": \"Compression Format\",\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Return Code\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\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\": \"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\": \"2.0.0-M3\"\n-                                }\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"authorized-issuer-dn-pattern\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"client-authentication\": {\n+                            \"Compression 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+                                        \"description\": \"\",\n+                                        \"displayName\": \"0\",\n+                                        \"value\": \"0\"\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\": \"\",\n+                                        \"displayName\": \"1\",\n+                                        \"value\": \"1\"\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\": \"\",\n+                                        \"displayName\": \"2\",\n+                                        \"value\": \"2\"\n                                     },\n                                     {\n-                                        \"description\": \"Does not request the client certificate on handshake\",\n-                                        \"displayName\": \"NONE\",\n-                                        \"value\": \"NONE\"\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\": \"AUTO\",\n+                                \"defaultValue\": \"1\",\n                                 \"dependencies\": [\n                                     {\n-                                        \"propertyDisplayName\": \"SSL Context Service\",\n-                                        \"propertyName\": \"SSL Context Service\"\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\": \"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\": \"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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"health-check-port\",\n-                                \"required\": false,\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"max-thread-pool-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+                                \"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\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"multipart-read-buffer-size\",\n+                                \"name\": \"Compression Level\",\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+                            \"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\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"multipart-request-max-size\",\n+                                \"name\": \"Mode\",\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-                                \"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\": \"2.0.0-M3\"\n-                                }\n-                            },\n-                            \"record-writer\": {\n-                                \"dependencies\": [\n+                            \"Update Filename\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"propertyDisplayName\": \"Record Reader\",\n-                                        \"propertyName\": \"record-reader\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"description\": \"The Record Writer to use for serializing Records after they have been transformed\",\n-                                \"displayName\": \"Record Writer\",\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                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"record-writer\",\n+                                \"name\": \"Update Filename\",\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\": \"2.0.0-M3\"\n-                                }\n+                                \"sensitive\": false\n                             }\n                         },\n-                        \"sideEffectFree\": false,\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\": \"Relationship for successfully received FlowFiles\",\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                         ],\n-                        \"supportsBatching\": false,\n+                        \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": 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-                            \"http\",\n-                            \"https\",\n-                            \"ingest\",\n-                            \"listen\",\n-                            \"rest\"\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.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-                        \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\"\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+                        \"useCases\": [\n+                            {\n+                                \"configuration\": \"\\\"Mode\\\" = \\\"compress\\\"\\n\\\"Compression Format\\\" should be set to whichever compression algorithm should be used.\",\n+                                \"description\": \"Compress the contents of a FlowFile\",\n+                                \"keywords\": [],\n+                                \"notes\": \"\"\n+                            },\n+                            {\n+                                \"configuration\": \"\\\"Mode\\\" = \\\"decompress\\\"\\n\\\"Compression Format\\\" should be set to whichever compression algorithm was used to compress the data previously.\",\n+                                \"description\": \"Decompress the contents of a FlowFile\",\n+                                \"keywords\": [],\n+                                \"notes\": \"\"\n+                            }\n+                        ],\n+                        \"version\": \"2.0.0-M3\",\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\": false,\n+                        \"additionalDetails\": true,\n                         \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n@@ -48589,213 +56582,251 @@\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                         \"multiProcessorUseCases\": [],\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+                            \"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\": \"Character Set\",\n-                                \"required\": true,\n+                                \"name\": \"Grouping Attribute\",\n+                                \"required\": false,\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+                            \"Maximum Data Rate\": {\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"NONE\",\n-                                        \"value\": \"NONE\"\n+                                        \"dependentValues\": [\n+                                            \"data rate or flowfile count\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Rate Control Criteria\",\n+                                        \"propertyName\": \"Rate Control Criteria\"\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+                                \"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\": \"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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Local Network Interface\",\n+                                \"name\": \"Maximum Data Rate\",\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+                            \"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\": \"Max Batch Size\",\n-                                \"required\": true,\n+                                \"name\": \"Maximum FlowFile Rate\",\n+                                \"required\": false,\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+                            \"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\": \"Max Number of TCP Connections\",\n-                                \"required\": true,\n+                                \"name\": \"Maximum Rate\",\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+                            \"Rate Control Criteria\": {\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+                                    },\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                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Max Size of Message Queue\",\n+                                \"name\": \"Rate Control Criteria\",\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+                            \"Rate Controlled Attribute\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"attribute value\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Rate Control Criteria\",\n+                                        \"propertyName\": \"Rate Control Criteria\"\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\": \"Max Size of Socket Buffer\",\n-                                \"required\": true,\n+                                \"name\": \"Rate Controlled Attribute\",\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+                            \"Rate Exceeded Strategy\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"The FlowFile will be held in its input queue until the rate of data has fallen below the configured maximum and will then be allowed through.\",\n+                                        \"displayName\": \"Hold FlowFile\",\n+                                        \"value\": \"Hold FlowFile\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The FlowFile will be routed to the 'rate exceeded' Relationship.\",\n+                                        \"displayName\": \"Route to 'rate exceeded'\",\n+                                        \"value\": \"Route to 'rate exceeded'\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"Hold FlowFile\",\n+                                \"description\": \"Specifies how to handle an incoming FlowFile when the maximum data rate has been exceeded.\",\n+                                \"displayName\": \"Rate Exceeded Strategy\",\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Port\",\n+                                \"name\": \"Rate Exceeded Strategy\",\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+                            \"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\": \"Receive Buffer Size\",\n+                                \"name\": \"Time Duration\",\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\": \"2.0.0-M3\"\n-                                }\n                             }\n                         },\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.standard.ParseSyslog\"\n-                        ],\n-                        \"sideEffectFree\": false,\n+                        \"sideEffectFree\": true,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"Messages received successfully will be sent out this relationship.\",\n+                                \"description\": \"FlowFiles are transferred to this relationship under normal conditions\",\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+                                \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"listen\",\n-                            \"logs\",\n-                            \"relp\",\n-                            \"tcp\"\n+                            \"rate\",\n+                            \"rate control\",\n+                            \"throttle\",\n+                            \"throughput\"\n                         ],\n-                        \"triggerSerially\": false,\n+                        \"triggerSerially\": true,\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-                        \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"The command of the RELP frames.\",\n-                                \"name\": \"relp.command\"\n-                            },\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+                        \"useCases\": [\n                             {\n-                                \"description\": \"The sending host of the messages.\",\n-                                \"name\": \"relp.sender\"\n+                                \"configuration\": \"Set the \\\"Rate Control Criteria\\\" to `data rate`.\\nSet the \\\"Time Duration\\\" property to `1 sec`.\\nConfigure the \\\"Maximum Rate\\\" property to specify how much data should be allowed through each second.\\n\\nFor example, to allow through 8 MB per second, set \\\"Maximum Rate\\\" to `8 MB`.\\n\",\n+                                \"description\": \"Limit the rate at which data is sent to a downstream system with little to no bursts\",\n+                                \"keywords\": [\n+                                    \"throttle\",\n+                                    \"limit\",\n+                                    \"slow down\",\n+                                    \"data rate\"\n+                                ],\n+                                \"notes\": \"\"\n                             },\n                             {\n-                                \"description\": \"The sending port the messages were received over.\",\n-                                \"name\": \"relp.port\"\n+                                \"configuration\": \"Set the \\\"Rate Control Criteria\\\" to `flowfile count`.\\nSet the \\\"Time Duration\\\" property to `1 sec`.\\nConfigure the \\\"Maximum Rate\\\" property to specify how many FlowFiles should be allowed through each second.\\n\\nFor example, to allow through 100 FlowFiles per second, set \\\"Maximum Rate\\\" to `100`.\\n\",\n+                                \"description\": \"Limit the rate at which FlowFiles are sent to a downstream system with little to no bursts\",\n+                                \"keywords\": [\n+                                    \"throttle\",\n+                                    \"limit\",\n+                                    \"slow down\",\n+                                    \"flowfile rate\"\n+                                ],\n+                                \"notes\": \"\"\n                             },\n                             {\n-                                \"description\": \"The transaction number of the message. Only included if <Batch Size> is 1.\",\n-                                \"name\": \"relp.txnr\"\n+                                \"configuration\": \"Set the \\\"Rate Control Criteria\\\" to `flowfile count`.\\nSet the \\\"Time Duration\\\" property to `1 sec`.\\nSet the \\\"Rate Exceeded Strategy\\\" property to `Route to 'rate exceeded'`.\\nConfigure the \\\"Maximum Rate\\\" property to specify how many requests should be allowed through each second.\\n\\nFor example, to allow through 100 requests per second, set \\\"Maximum Rate\\\" to `100`.\\nIf more than 100 requests come in during any one second, the additional requests will be routed to `rate exceeded` instead of `success`.\\n\",\n+                                \"description\": \"Reject requests that exceed a specific rate with little to no bursts\",\n+                                \"keywords\": [\n+                                    \"throttle\",\n+                                    \"limit\",\n+                                    \"slow down\",\n+                                    \"request rate\"\n+                                ],\n+                                \"notes\": \"\"\n                             },\n                             {\n-                                \"description\": \"The mime.type of the content which is text/plain\",\n-                                \"name\": \"mime.type\"\n+                                \"configuration\": \"Set the \\\"Rate Control Criteria\\\" to `flowfile count`.\\nSet the \\\"Time Duration\\\" property to `1 min`.\\nSet the \\\"Rate Exceeded Strategy\\\" property to `Route to 'rate exceeded'`.\\nConfigure the \\\"Maximum Rate\\\" property to specify how many requests should be allowed through each minute.\\n\\nFor example, to allow through 100 requests per second, set \\\"Maximum Rate\\\" to `6000`.\\nThis will allow through 6,000 FlowFiles per minute, which averages to 100 FlowFiles per second. However, those 6,000 FlowFiles may come all within the first couple of\\nseconds, or they may come in over a period of 60 seconds. As a result, this gives us an average rate of 100 FlowFiles per second but allows for bursts of data.\\nIf more than 6,000 requests come in during any one minute, the additional requests will be routed to `rate exceeded` instead of `success`.\\n\",\n+                                \"description\": \"Reject requests that exceed a specific rate, allowing for bursts\",\n+                                \"keywords\": [\n+                                    \"throttle\",\n+                                    \"limit\",\n+                                    \"slow down\",\n+                                    \"request rate\"\n+                                ],\n+                                \"notes\": \"\"\n                             }\n-                        ]\n+                        ],\n+                        \"version\": \"2.0.0-M3\"\n                     },\n                     {\n                         \"additionalDetails\": false,\n                         \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n@@ -48808,356 +56839,399 @@\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                         \"multiProcessorUseCases\": [],\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+                            \"Input Character Set\": {\n+                                \"description\": \"The name of the CharacterSet to expect for Input\",\n+                                \"displayName\": \"Input Character Set\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Character Set\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Input 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+                            \"Output Character Set\": {\n+                                \"description\": \"The name of the CharacterSet to convert to\",\n+                                \"displayName\": \"Output Character Set\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Client Auth\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Output 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+                            }\n+                        },\n+                        \"sideEffectFree\": true,\n+                        \"supportedRelationships\": [\n+                            {\n+                                \"description\": \"\",\n+                                \"name\": \"success\"\n+                            }\n+                        ],\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"character set\",\n+                            \"characterset\",\n+                            \"convert\",\n+                            \"text\"\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+                        \"useCases\": [],\n+                        \"version\": \"2.0.0-M3\"\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-standard-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"f2215c6\"\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+                        \"multiProcessorUseCases\": [],\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Local Network Interface\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Catalog Name\",\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-                            \"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+                            \"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 Number of TCP Connections\",\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\": \"2.0.0-M3\"\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+                            \"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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Max Size of Message Queue\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Schema Name\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Max Size of Socket Buffer\": {\n-                                \"defaultValue\": \"1 MB\",\n-                                \"dependencies\": [\n+                            \"Statement Type\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"TCP\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Protocol\",\n-                                        \"propertyName\": \"Protocol\"\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\": \"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\": \"Specifies the type of SQL Statement to generate\",\n+                                \"displayName\": \"Statement Type\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Max Size of Socket Buffer\",\n+                                \"name\": \"Statement Type\",\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+                            \"Table Name\": {\n+                                \"description\": \"The name of the table that the statement should update\",\n+                                \"displayName\": \"Table Name\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Message Delimiter\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Table Name\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Parse Messages\": {\n+                            \"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\": \"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\": \"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\": \"Parse Messages\",\n-                                \"required\": true,\n+                                \"name\": \"Translate Field Names\",\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+                            \"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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Port\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Unmatched Column Behavior\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Protocol\": {\n+                            \"Unmatched Field Behavior\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"TCP\",\n-                                        \"value\": \"TCP\"\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\": \"\",\n-                                        \"displayName\": \"UDP\",\n-                                        \"value\": \"UDP\"\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\": \"UDP\",\n-                                \"description\": \"The protocol for Syslog communication.\",\n-                                \"displayName\": \"Protocol\",\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\": \"Protocol\",\n-                                \"required\": true,\n+                                \"name\": \"Unmatched Field Behavior\",\n+                                \"required\": false,\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+                            \"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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Receive Buffer Size\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Update Keys\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"SSL Context Service\": {\n-                                \"dependencies\": [\n+                            \"jts-quoted-identifiers\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"TCP\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Protocol\",\n-                                        \"propertyName\": \"Protocol\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\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+                                \"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\": \"SSL Context Service\",\n+                                \"name\": \"jts-quoted-identifiers\",\n                                 \"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\": \"2.0.0-M3\"\n-                                }\n+                                \"sensitive\": false\n                             },\n-                            \"socket-keep-alive\": {\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-                                            \"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+                                \"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\": \"socket-keep-alive\",\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\": \"Environment variables 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+                                \"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.ParseSyslog\",\n-                            \"org.apache.nifi.processors.standard.PutSyslog\"\n+                            \"org.apache.nifi.processors.standard.PutDatabaseRecord\",\n+                            \"org.apache.nifi.processors.standard.PutSQL\"\n                         ],\n-                        \"sideEffectFree\": false,\n+                        \"sideEffectFree\": true,\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-                                \"name\": \"success\"\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\": \"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\": \"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                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"listen\",\n-                            \"logs\",\n-                            \"syslog\",\n-                            \"tcp\",\n-                            \"udp\"\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.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+                        \"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                         \"useCases\": [],\n                         \"version\": \"2.0.0-M3\",\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+                                \"description\": \"Sets mime.type of FlowFile that is routed to 'sql' to 'text/plain'.\",\n+                                \"name\": \"mime.type\"\n                             },\n                             {\n-                                \"description\": \"The hostname or IP address of the Syslog message.\",\n-                                \"name\": \"syslog.hostname\"\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\": \"The hostname of the Syslog server that sent the message.\",\n-                                \"name\": \"syslog.sender\"\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\": \"The body of the Syslog message, everything after the hostname.\",\n-                                \"name\": \"syslog.body\"\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\": \"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+                                \"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 protocol over which the Syslog message was received.\",\n-                                \"name\": \"syslog.protocol\"\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 port over which the Syslog message was received.\",\n-                                \"name\": \"syslog.port\"\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 mime.type of the FlowFile which will be text/plain for Syslog messages.\",\n-                                \"name\": \"mime.type\"\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@@ -49172,248 +57246,132 @@\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                         \"multiProcessorUseCases\": [],\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-                            \"Client Auth\": {\n+                            \"Include Zero Record FlowFiles\": {\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\": \"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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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-                            \"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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Max Number of TCP Connections\",\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-                                \"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+                                \"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\": \"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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Port\",\n+                                \"name\": \"Include Zero Record FlowFiles\",\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+                            \"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\": \"Receive Buffer Size\",\n+                                \"name\": \"Record Reader\",\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+                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n                                     \"version\": \"2.0.0-M3\"\n                                 }\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-                                \"dynamic\": false,\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+                            \"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\": \"pool-receive-buffers\",\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\": \"2.0.0-M3\"\n+                                }\n                             }\n                         },\n-                        \"sideEffectFree\": false,\n+                        \"sideEffectFree\": true,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"Messages received successfully will be sent out 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 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                         \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"listen\",\n-                            \"ssl\",\n-                            \"tcp\",\n-                            \"tls\"\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.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-                        \"useCases\": [],\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+                        \"useCases\": [\n+                            {\n+                                \"configuration\": \"The Record Reader should be configured according to the incoming data format.\\nThe Record Writer should be configured according to the desired output format.\",\n+                                \"description\": \"Convert data from one record-oriented format to another\",\n+                                \"keywords\": [],\n+                                \"notes\": \"\"\n+                            }\n+                        ],\n                         \"version\": \"2.0.0-M3\",\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+                                \"description\": \"Sets the mime.type attribute to the MIME Type specified by the Record Writer\",\n+                                \"name\": \"mime.type\"\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 number of records in the FlowFile\",\n+                                \"name\": \"record.count\"\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\": \"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@@ -49428,235 +57386,252 @@\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                         \"multiProcessorUseCases\": [],\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+                            \"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                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Local Network Interface\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"ajust-immediately\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"client-auth\": {\n+                            \"character-encoding\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"WANT\",\n-                                        \"value\": \"WANT\"\n+                                        \"displayName\": \"ISO-8859-1\",\n+                                        \"value\": \"ISO-8859-1\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"REQUIRED\",\n-                                        \"value\": \"REQUIRED\"\n+                                        \"displayName\": \"UTF-8\",\n+                                        \"value\": \"UTF-8\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"NONE\",\n-                                        \"value\": \"NONE\"\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\": \"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-                            \"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+                                \"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\": \"max-number-tcp-connections\",\n+                                \"name\": \"character-encoding\",\n                                 \"required\": true,\n                                 \"sensitive\": false\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+                            \"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                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"max-size-socket-buffer\",\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"port\",\n+                                \"name\": \"split-words-on-symbols\",\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+                            \"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                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"read-timeout\",\n+                                \"name\": \"text-character-count\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"reader-error-handling-strategy\": {\n+                            \"text-line-count\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Transfers any records already received and closes the connection.\",\n-                                        \"displayName\": \"Transfer\",\n-                                        \"value\": \"Transfer\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n-                                        \"description\": \"Discards any records already received and closes the connection.\",\n-                                        \"displayName\": \"Discard\",\n-                                        \"value\": \"Discard\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\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\": \"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\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"reader-error-handling-strategy\",\n+                                \"name\": \"text-line-count\",\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+                            \"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\": \"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\": \"record-batch-size\",\n+                                \"name\": \"text-line-nonempty-count\",\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-                                \"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\": \"2.0.0-M3\"\n-                                }\n-                            },\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+                            \"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\": \"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\": \"record-writer\",\n+                                \"name\": \"text-word-count\",\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\": \"2.0.0-M3\"\n-                                }\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\": \"2.0.0-M3\"\n-                                }\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\": \"Messages received successfully will be sent out this relationship.\",\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\": \"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                         ],\n                         \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"listen\",\n-                            \"record\",\n-                            \"ssl\",\n-                            \"tcp\",\n-                            \"tls\"\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.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+                        \"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                         \"useCases\": [],\n                         \"version\": \"2.0.0-M3\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"The host that sent the data.\",\n-                                \"name\": \"tcp.sender\"\n-                            },\n-                            {\n-                                \"description\": \"The port that the processor accepted the connection on.\",\n-                                \"name\": \"tcp.port\"\n-                            },\n-                            {\n-                                \"description\": \"The number of records written to the flow file.\",\n-                                \"name\": \"record.count\"\n+                                \"description\": \"The number of lines of text present in the FlowFile content\",\n+                                \"name\": \"text.line.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+                                \"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\": \"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 number of words present in the original FlowFile\",\n+                                \"name\": \"text.word.count\"\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 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-standard-nar\",\n                         \"buildInfo\": {\n@@ -49671,166 +57646,183 @@\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                         \"multiProcessorUseCases\": [],\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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-                            \"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\": \"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+                            \"fail_when_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+                                \"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\": \"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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Port\",\n+                                \"name\": \"fail_when_empty\",\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+                            \"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                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Receive Buffer Size\",\n+                                \"name\": \"hash_algorithm\",\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Sending Host Port\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n                             }\n                         },\n-                        \"sideEffectFree\": false,\n+                        \"sideEffectFree\": true,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"Messages received successfully will be sent out this relationship.\",\n+                                \"description\": \"Used for flowfiles that have a hash value added\",\n                                 \"name\": \"success\"\n+                            },\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                         ],\n                         \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"ingest\",\n-                            \"listen\",\n-                            \"source\",\n-                            \"udp\"\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.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+                        \"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                         \"useCases\": [],\n                         \"version\": \"2.0.0-M3\",\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+                                \"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\": false,\n+                        \"additionalDetails\": true,\n                         \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n@@ -49840,208 +57832,342 @@\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                         \"multiProcessorUseCases\": [],\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+                            \"@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\": \"Character Set\",\n+                                \"name\": \"@OnScheduled Pause Time\",\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+                            \"@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\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Local Network Interface\",\n-                                \"required\": false,\n+                                \"name\": \"@OnStopped Pause Time\",\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.\",\n-                                \"displayName\": \"Max Size of Message Queue\",\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\": \"Max Size of Message Queue\",\n+                                \"name\": \"@OnUnscheduled Pause Time\",\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+                            \"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\": \"Max Size of Socket Buffer\",\n+                                \"name\": \"Content Size\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Port\": {\n-                                \"description\": \"The port to listen on for communication.\",\n-                                \"displayName\": \"Port\",\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Port\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"CustomValidate Pause Time\",\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+                            \"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\": \"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\": \"Receive Buffer Size\",\n+                                \"name\": \"Fail When @OnScheduled called\",\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+                            \"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\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"batch-size\",\n+                                \"name\": \"Fail When @OnStopped called\",\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+                            \"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                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"poll-timeout\",\n+                                \"name\": \"Fail When @OnUnscheduled called\",\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+                            \"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\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"record-reader\",\n+                                \"name\": \"FlowFile Exception Class\",\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\": \"2.0.0-M3\"\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 flow file.\",\n-                                \"displayName\": \"Record Writer\",\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\": \"record-writer\",\n+                                \"name\": \"FlowFile Exception Iterations\",\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\": \"2.0.0-M3\"\n-                                }\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+                            \"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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"sending-host\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"FlowFile Failure Iterations\",\n+                                \"required\": true,\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+                            \"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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"sending-host-port\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"FlowFile Rollback Iterations\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n-                            }\n-                        },\n-                        \"sideEffectFree\": false,\n-                        \"supportedRelationships\": [\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+                                \"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\": \"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\": \"Ignore Interrupts When Paused\",\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+                                \"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\": \"Messages received successfully will be sent out this relationship.\",\n+                                \"description\": \"FlowFiles processed successfully.\",\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\": \"FlowFiles that failed to process.\",\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                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"ingest\",\n-                            \"listen\",\n-                            \"record\",\n-                            \"source\",\n-                            \"udp\"\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.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+                        \"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                         \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\",\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+                        \"version\": \"2.0.0-M3\"\n                     },\n                     {\n                         \"additionalDetails\": false,\n                         \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n@@ -50053,215 +58179,340 @@\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                         \"multiProcessorUseCases\": [],\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+                            \"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\": \"Attributes to Ignore\",\n+                                \"name\": \"bloom-filter-certainty\",\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+                            \"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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Attributes to Log\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"cache-identifier\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Log FlowFile Properties\": {\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+                                        \"displayName\": \"Multiple Files\",\n+                                        \"value\": \"multiple\"\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\": \"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\": \"Log FlowFile Properties\",\n+                                \"name\": \"deduplication-strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Log Level\": {\n+                            \"distributed-map-cache\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"multiple\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Deduplication Strategy\",\n+                                        \"propertyName\": \"deduplication-strategy\"\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+                                \"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\": \"2.0.0-M3\"\n+                                }\n+                            },\n+                            \"filter-capacity-hint\": {\n+                                \"defaultValue\": \"25000\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"bloom-filter\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Filter Type\",\n+                                        \"propertyName\": \"filter-type\"\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"filter-capacity-hint\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"filter-type\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"trace\",\n-                                        \"value\": \"trace\"\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\": \"\",\n-                                        \"displayName\": \"debug\",\n-                                        \"value\": \"debug\"\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-                                        \"description\": \"\",\n-                                        \"displayName\": \"info\",\n-                                        \"value\": \"info\"\n-                                    },\n+                                        \"dependentValues\": [\n+                                            \"single\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Deduplication Strategy\",\n+                                        \"propertyName\": \"deduplication-strategy\"\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"filter-type\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"include-zero-record-flowfiles\": {\n+                                \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"warn\",\n-                                        \"value\": \"warn\"\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"error\",\n-                                        \"value\": \"error\"\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"info\",\n-                                \"description\": \"The Log Level to use when logging the Attributes\",\n-                                \"displayName\": \"Log Level\",\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\": \"Log Level\",\n+                                \"name\": \"include-zero-record-flowfiles\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Log Payload\": {\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\": \"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+                                \"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\": \"Log Payload\",\n+                                \"name\": \"put-cache-identifier\",\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Log prefix\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Output Format\": {\n+                            \"record-hashing-algorithm\": {\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\": \"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\": \"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\": \"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\": \"Line per Attribute\",\n-                                \"description\": \"Specifies the format to use for logging FlowFile attributes\",\n-                                \"displayName\": \"Output Format\",\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\": \"Output Format\",\n+                                \"name\": \"record-hashing-algorithm\",\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+                            \"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\": \"attributes-to-ignore-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\": \"2.0.0-M3\"\n+                                }\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+                            \"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\": \"attributes-to-log-regex\",\n-                                \"required\": false,\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"character-set\",\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\": \"2.0.0-M3\"\n+                                }\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.DetectDuplicate\"\n+                        ],\n+                        \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"All FlowFiles are routed to this relationship\",\n-                                \"name\": \"success\"\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                         ],\n                         \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicProperties\": true,\n                         \"supportsDynamicRelationships\": 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-                            \"attributes\",\n-                            \"logging\"\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.LogAttribute\",\n-                        \"typeDescription\": \"Emits attributes of the FlowFile at the specified log level\",\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                         \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\"\n+                        \"version\": \"2.0.0-M3\",\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\": \"f2215c6\"\n                         },\n@@ -50278,72 +58529,132 @@\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"multiProcessorUseCases\": [],\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+                            \"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\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"log-level\",\n+                                \"name\": \"Cache Entry Identifier\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"log-message\": {\n-                                \"description\": \"The log message to emit\",\n-                                \"displayName\": \"Log message\",\n+                            \"Cache The Entry 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\": \"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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"log-message\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Cache The Entry Identifier\",\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+                            \"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\": \"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\": \"2.0.0-M3\"\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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"log-prefix\",\n-                                \"required\": false,\n+                                \"name\": \"FlowFile Description\",\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+                        ],\n+                        \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"All FlowFiles are routed to this relationship\",\n-                                \"name\": \"success\"\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                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"attributes\",\n-                            \"logging\"\n+                            \"dedupe\",\n+                            \"dupe\",\n+                            \"duplicate\",\n+                            \"hash\"\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+                        \"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                         \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\"\n+                        \"version\": \"2.0.0-M3\",\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\": false,\n                         \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n@@ -50357,106 +58668,107 @@\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+                                \"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                         ],\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                         \"multiProcessorUseCases\": [],\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"include-empty-values\": {\n+                            \"Distribution Strategy\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\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\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\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\": \"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\": \"true\",\n-                                \"description\": \"Include null or blank values for keys that are null or blank\",\n-                                \"displayName\": \"Include Empty Values\",\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\": \"include-empty-values\",\n+                                \"name\": \"Distribution Strategy\",\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+                            \"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\": \"lookup-service\",\n+                                \"name\": \"Number of Relationships\",\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\": \"2.0.0-M3\"\n-                                }\n+                                \"sensitive\": false\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+                                \"description\": \"Where to route flowfiles for this relationship index\",\n+                                \"name\": \"1\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": true,\n-                        \"supportsDynamicRelationships\": false,\n+                        \"supportsDynamicRelationships\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"Attribute Expression Language\",\n-                            \"attributes\",\n-                            \"cache\",\n-                            \"enrich\",\n-                            \"join\",\n-                            \"lookup\"\n+                            \"distribute\",\n+                            \"load balance\",\n+                            \"round robin\",\n+                            \"route\",\n+                            \"weighted\"\n                         ],\n                         \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenAnyDestinationAvailable\": true,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.LookupAttribute\",\n-                        \"typeDescription\": \"Lookup attributes from a lookup service\",\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                         \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\"\n+                        \"version\": \"2.0.0-M3\",\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\": true,\n+                        \"additionalDetails\": false,\n                         \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n@@ -50465,245 +58777,67 @@\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                         \"multiProcessorUseCases\": [],\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Root Record Path\": {\n-                                \"description\": \"A RecordPath that points to a child Record within each of the top-level Records in the FlowFile. If specified, the additional RecordPath properties will be evaluated against this child Record instead of the top-level Record. This allows for performing enrichment against multiple child Records within a single top-level Record.\",\n-                                \"displayName\": \"Root Record Path\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Root Record Path\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\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\": \"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.LookupService\",\n-                                    \"version\": \"2.0.0-M3\"\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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-                                \"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\": \"2.0.0-M3\"\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 \\\"Result RecordPath\\\" 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-                                \"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\": \"2.0.0-M3\"\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-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"use-property\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Record Update Strategy\",\n-                                        \"propertyName\": \"record-update-strategy\"\n-                                    }\n-                                ],\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+                            \"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\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\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. If the given Record Paths evaluate such that multiple sub-records are evaluated, the parent Record will be routed to 'unmatched' unless all sub-records match.\",\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+                                \"name\": \"Number of Copies\",\n                                 \"required\": true,\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                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"All records will be sent to this Relationship if configured to do so, unless a failure occurs\",\n+                                \"description\": \"The original FlowFile and all copies will be sent to this relationship\",\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                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": true,\n+                        \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": 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+                            \"duplicate\",\n+                            \"load\",\n+                            \"test\"\n                         ],\n                         \"triggerSerially\": false,\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.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                         \"useCases\": [],\n                         \"version\": \"2.0.0-M3\",\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+                                \"description\": \"A zero-based incrementing integer value based on which copy the FlowFile is.\",\n+                                \"name\": \"copy.index\"\n                             }\n                         ]\n                     },\n                     {\n-                        \"additionalDetails\": true,\n+                        \"additionalDetails\": false,\n                         \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n@@ -50717,668 +58851,338 @@\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"multiProcessorUseCases\": [],\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Attribute Strategy\",\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+                            \"Encoded Line Length\": {\n+                                \"defaultValue\": \"76\",\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"8\",\n-                                        \"value\": \"8\"\n+                                        \"dependentValues\": [\n+                                            \"base32\",\n+                                            \"base64\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Encoding\",\n+                                        \"propertyName\": \"Encoding\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"9\",\n-                                        \"value\": \"9\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"1\",\n-                                \"dependencies\": [\n-                                    {\n                                         \"dependentValues\": [\n-                                            \"ZIP\"\n+                                            \"MULTIPLE_LINES\"\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+                                        \"propertyDisplayName\": \"Line Output Mode\",\n+                                        \"propertyName\": \"Line Output Mode\"\n+                                    },\n                                     {\n                                         \"dependentValues\": [\n-                                            \"Bin-Packing Algorithm\"\n+                                            \"Encode\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Merge Strategy\",\n-                                        \"propertyName\": \"Merge Strategy\"\n+                                        \"propertyDisplayName\": \"Mode\",\n+                                        \"propertyName\": \"Mode\"\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+                                \"description\": \"Each line of encoded data will contain up to the configured number of characters, rounded down to the nearest multiple of 4.\",\n+                                \"displayName\": \"Encoded Line Length\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Correlation Attribute Name\",\n-                                \"required\": false,\n+                                \"name\": \"Encoded Line Length\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Delimiter Strategy\": {\n+                            \"Encoding\": {\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+                                        \"description\": \"Encode or decode using Base64 set of characters\",\n+                                        \"displayName\": \"Base64\",\n+                                        \"value\": \"base64\"\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+                                        \"description\": \"Encode or decode using Base32 set of characters\",\n+                                        \"displayName\": \"Base32\",\n+                                        \"value\": \"base32\"\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+                                        \"description\": \"Encode or decode using hexadecimal set of characters\",\n+                                        \"displayName\": \"Hexadecimal\",\n+                                        \"value\": \"hex\"\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+                                \"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\": \"Delimiter Strategy\",\n+                                \"name\": \"Encoding\",\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\": \"Environment variables 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+                            \"Line Output Mode\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"Filename\",\n-                                            \"Text\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Delimiter Strategy\",\n-                                        \"propertyName\": \"Delimiter Strategy\"\n+                                        \"description\": \"The encoded content will be written as a single line.\",\n+                                        \"displayName\": \"Single Line\",\n+                                        \"value\": \"SINGLE_LINE\"\n                                     },\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"Binary Concatenation\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Merge Format\",\n-                                        \"propertyName\": \"Merge Format\"\n+                                        \"description\": \"The encoded content will be written as multiple lines.\",\n+                                        \"displayName\": \"Multiple Lines\",\n+                                        \"value\": \"MULTIPLE_LINES\"\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\": \"Environment variables 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+                                \"defaultValue\": \"SINGLE_LINE\",\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"Filename\",\n-                                            \"Text\"\n+                                            \"Encode\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Delimiter Strategy\",\n-                                        \"propertyName\": \"Delimiter Strategy\"\n+                                        \"propertyDisplayName\": \"Mode\",\n+                                        \"propertyName\": \"Mode\"\n                                     },\n                                     {\n                                         \"dependentValues\": [\n-                                            \"Binary Concatenation\"\n+                                            \"base32\",\n+                                            \"base64\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Merge Format\",\n-                                        \"propertyName\": \"Merge Format\"\n+                                        \"propertyDisplayName\": \"Encoding\",\n+                                        \"propertyName\": \"Encoding\"\n                                     }\n                                 ],\n-                                \"description\": \"Filename or text specifying the header to use. If not specified, no header is supplied.\",\n-                                \"displayName\": \"Header\",\n+                                \"description\": \"Controls the line formatting for encoded content based on selected property values.\",\n+                                \"displayName\": \"Line Output Mode\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Header File\",\n-                                \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\",\n-                                        \"TEXT\"\n-                                    ]\n-                                },\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Line Output Mode\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Keep Path\": {\n+                            \"Mode\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"description\": \"Transform original input to encoded representation\",\n+                                        \"displayName\": \"Encode\",\n+                                        \"value\": \"Encode\"\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+                                        \"description\": \"Transform encoded input to original representation\",\n+                                        \"displayName\": \"Decode\",\n+                                        \"value\": \"Decode\"\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+                                \"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\": \"Keep Path\",\n+                                \"name\": \"Mode\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n+                            }\n+                        },\n+                        \"sideEffectFree\": true,\n+                        \"supportedRelationships\": [\n+                            {\n+                                \"description\": \"Any FlowFile that is successfully encoded or decoded will be routed to success\",\n+                                \"name\": \"success\"\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+                            {\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+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"base32\",\n+                            \"base64\",\n+                            \"decode\",\n+                            \"encode\",\n+                            \"hex\"\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+                        \"useCases\": [],\n+                        \"version\": \"2.0.0-M3\"\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-standard-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"f2215c6\"\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+                        \"multiProcessorUseCases\": [],\n+                        \"primaryNodeOnly\": false,\n+                        \"propertyDescriptors\": {\n+                            \"batch-count\": {\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+                                \"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\": \"Maximum Number of Entries\",\n+                                \"name\": \"batch-count\",\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+                            \"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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Maximum number of Bins\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"group-id\",\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+                            \"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\": \"Merge Format\",\n+                                \"name\": \"inactive-timeout\",\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>. 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+                            \"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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Merge Strategy\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"initial-order\",\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+                            \"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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Minimum Group Size\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"maximum-order\",\n+                                \"required\": false,\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+                            \"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\": \"Minimum Number of Entries\",\n+                                \"name\": \"order-attribute\",\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\": \"Environment variables 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+                            \"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\": \"mergecontent-metadata-strategy\",\n+                                \"name\": \"wait-timeout\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"readsAttributes\": [\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\": \"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+                                \"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\": \"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+                                \"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\": \"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+                                \"description\": \"A FlowFile with a matching order number will be routed to this relationship.\",\n+                                \"name\": \"success\"\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+                                \"description\": \"A FlowFile with non matching order will be routed to this relationship\",\n+                                \"name\": \"wait\"\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-                        ],\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+                                \"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-                                \"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                         \"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+                            \"order\",\n+                            \"sort\"\n                         ],\n-                        \"triggerSerially\": false,\n+                        \"triggerSerially\": true,\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-                        \"useCases\": [\n-                            {\n-                                \"configuration\": \"\\\"Merge Strategy\\\" = \\\"Bin Packing Algorithm\\\"\\n\\\"Merge Format\\\" = \\\"Binary Concatenation\\\"\\n\\\"Delimiter Strategy\\\" = \\\"Text\\\"\\n\\\"Demarcator\\\" = \\\"\\\\n\\\" (a newline can be inserted by pressing Shift + Enter)\\n\\\"Minimum Number of Entries\\\" = \\\"1\\\"\\n\\\"Maximum Number of Entries\\\" = \\\"500000000\\\"\\n\\\"Minimum Group Size\\\" = the minimum amount of data to write to an output FlowFile. A reasonable value might be \\\"128 MB\\\"\\n\\\"Maximum Group Size\\\" = the maximum amount of data to write to an output FlowFile. A reasonable value might be \\\"256 MB\\\"\\n\\\"Max Bin Age\\\" = the maximum amount of time to wait for incoming data before timing out and transferring the FlowFile along even though it is smaller than the Max Bin Age. A reasonable value might be \\\"5 mins\\\"\\n\",\n-                                \"description\": \"Concatenate FlowFiles with textual content together in order to create fewer, larger FlowFiles.\",\n-                                \"keywords\": [\n-                                    \"concatenate\",\n-                                    \"bundle\",\n-                                    \"aggregate\",\n-                                    \"bin\",\n-                                    \"merge\",\n-                                    \"combine\",\n-                                    \"smash\"\n-                                ],\n-                                \"notes\": \"\"\n-                            },\n-                            {\n-                                \"configuration\": \"\\\"Merge Strategy\\\" = \\\"Bin Packing Algorithm\\\"\\n\\\"Merge Format\\\" = \\\"Binary Concatenation\\\"\\n\\\"Delimiter Strategy\\\" = \\\"Text\\\"\\n\\\"Minimum Number of Entries\\\" = \\\"1\\\"\\n\\\"Maximum Number of Entries\\\" = \\\"500000000\\\"\\n\\\"Minimum Group Size\\\" = the minimum amount of data to write to an output FlowFile. A reasonable value might be \\\"128 MB\\\"\\n\\\"Maximum Group Size\\\" = the maximum amount of data to write to an output FlowFile. A reasonable value might be \\\"256 MB\\\"\\n\\\"Max Bin Age\\\" = the maximum amount of time to wait for incoming data before timing out and transferring the FlowFile along even though it is smaller than the Max Bin Age. A reasonable value might be \\\"5 mins\\\"\\n\",\n-                                \"description\": \"Concatenate FlowFiles with binary content together in order to create fewer, larger FlowFiles.\",\n-                                \"keywords\": [\n-                                    \"concatenate\",\n-                                    \"bundle\",\n-                                    \"aggregate\",\n-                                    \"bin\",\n-                                    \"merge\",\n-                                    \"combine\",\n-                                    \"smash\"\n-                                ],\n-                                \"notes\": \"Not all binary data can be concatenated together. Whether or not this configuration is valid depends on the type of your data.\"\n-                            },\n-                            {\n-                                \"configuration\": \"\\\"Merge Strategy\\\" = \\\"Defragment\\\"\\n\\\"Merge Format\\\" = the value of Merge Format depends on the desired output format. If the file was previously zipped together and was split apart by UnpackContent,\\n    a Merge Format of \\\"ZIP\\\" makes sense. If it was previously a .tar file, a Merge Format of \\\"TAR\\\" makes sense. If the data is textual, \\\"Binary Concatenation\\\" can be\\n    used to combine the text into a single document.\\n\\\"Delimiter Strategy\\\" = \\\"Text\\\"\\n\\\"Max Bin Age\\\" = the maximum amount of time to wait for incoming data before timing out and transferring the fragments to 'failure'. A reasonable value might be \\\"5 mins\\\"\\n\\nFor textual data, \\\"Demarcator\\\" should be set to a newline (\\\\n), set by pressing Shift+Enter in the UI. For binary data, \\\"Demarcator\\\" should be left blank.\\n\",\n-                                \"description\": \"Reassemble a FlowFile that was previously split apart into smaller FlowFiles by a processor such as SplitText, UnpackContext, SplitRecord, etc.\",\n-                                \"keywords\": [\n-                                    \"reassemble\",\n-                                    \"repack\",\n-                                    \"merge\",\n-                                    \"recombine\"\n-                                ],\n-                                \"notes\": \"\"\n-                            }\n-                        ],\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+                        \"useCases\": [],\n                         \"version\": \"2.0.0-M3\",\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-                            },\n-                            {\n-                                \"description\": \"The number of FlowFiles that were merged into this bundle\",\n-                                \"name\": \"merge.count\"\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\": \"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\": \"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\": \"UUID of the merged flow file that will be added to the original flow files attributes.\",\n-                                \"name\": \"merge.uuid\"\n+                                \"description\": \"FlowFiles routed to 'failure' or 'skipped' relationship will have this attribute describing details.\",\n+                                \"name\": \"EnforceOrder.detail\"\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\": \"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\": true,\n                         \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n@@ -51392,280 +59196,185 @@\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-                        \"multiProcessorUseCases\": [\n+                        \"dynamicProperties\": [\n                             {\n-                                \"configurations\": [\n-                                    {\n-                                        \"configuration\": \"Configure the \\\"Record Reader\\\" to specify a Record Reader that is appropriate for the incoming data type.\\nConfigure the \\\"Record Writer\\\" to specify a Record Writer that is appropriate for the desired output data type.\\n\\nAdd a single additional property. The name of the property should describe the field on which the data is being merged together.\\nThe property's value should be a RecordPath that specifies which output FlowFile the Record belongs to.\\n\\nFor example, to merge together data that has the same value for the \\\"productSku\\\" field, add a property named `productSku` with a value of `/productSku`.\\n\\nConnect the \\\"success\\\" Relationship to MergeRecord.\\nAuto-terminate the \\\"original\\\" Relationship.\\n\",\n-                                        \"processorClassName\": \"org.apache.nifi.processors.standard.PartitionRecord\"\n-                                    },\n-                                    {\n-                                        \"configuration\": \"Configure the \\\"Record Reader\\\" to specify a Record Reader that is appropriate for the incoming data type.\\nConfigure the \\\"Record Writer\\\" to specify a Record Writer that is appropriate for the desired output data type.\\nSet \\\"Merge Strategy\\\" to `Bin-Packing Algorithm`.\\nSet the \\\"Minimum Bin Size\\\" to desired file size of the merged output file. For example, a value of `1 MB` will result in not merging data until at least\\n    1 MB of data is available (unless the Max Bin Age is reached first). If there is no desired minimum file size, leave the default value of `0 B`.\\nSet the \\\"Minimum Number of Records\\\" property to the minimum number of Records that should be included in the merged output file. For example, setting the value\\n    to `10000` ensures that the output file will have at least 10,000 Records in it (unless the Max Bin Age is reached first).\\nSet the \\\"Maximum Number of Records\\\" property to a value at least as large as the \\\"Minimum Number of Records.\\\" If there is no need to limit the maximum number of\\n    records per file, this number can be set to a value that will never be reached such as `1000000000`.\\nSet the \\\"Max Bin Age\\\" to specify the maximum amount of time to hold data before merging. This can be thought of as a \\\"timeout\\\" at which time the Processor will\\n    merge whatever data it is, even if the \\\"Minimum Bin Size\\\" and \\\"Minimum Number of Records\\\" has not been reached. It is always recommended to set the value.\\n    A reasonable default might be `10 mins` if there is no other latency requirement.\\nSet the value of the \\\"Correlation Attribute Name\\\" property to the name of the property that you added in the PartitionRecord Processor. For example, if merging data\\n    based on the \\\"productSku\\\" field, the property in PartitionRecord was named `productSku` so the value of the \\\"Correlation Attribute Name\\\" property should\\n    be `productSku`.\\nSet the \\\"Maximum Number of Bins\\\" property to a value that is at least as large as the different number of values that will be present for the Correlation Attribute.\\n    For example, if you expect 1,000 different SKUs, set this value to at least `1001`. It is not advisable, though, to set the value above 10,000.\\n\\nConnect the 'merged' Relationship to the next component in the flow.\\nAuto-terminate the 'original' Relationship.\\n\",\n-                                        \"processorClassName\": \"org.apache.nifi.processors.standard.MergeRecord\"\n-                                    }\n-                                ],\n-                                \"description\": \"Combine together many Records that have the same value for a particular field in the data, in order to create a single, larger file\",\n-                                \"keywords\": [\n-                                    \"merge\",\n-                                    \"combine\",\n-                                    \"aggregate\",\n-                                    \"like records\",\n-                                    \"similar data\"\n-                                ],\n-                                \"notes\": \"\"\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+                        \"multiProcessorUseCases\": [],\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Attribute Strategy\": {\n+                            \"Destination\": {\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+                                        \"description\": \"\",\n+                                        \"displayName\": \"flowfile-content\",\n+                                        \"value\": \"flowfile-content\"\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+                                        \"description\": \"\",\n+                                        \"displayName\": \"flowfile-attribute\",\n+                                        \"value\": \"flowfile-attribute\"\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+                                \"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\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Attribute Strategy\",\n+                                \"name\": \"Destination\",\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-                            \"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-                            \"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\": \"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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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+                            \"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.bin.count\",\n+                                \"name\": \"Max String Length\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"merge-strategy\": {\n+                            \"Null Value Representation\": {\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\": \"\",\n+                                        \"displayName\": \"empty string\",\n+                                        \"value\": \"empty string\"\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\": \"\",\n+                                        \"displayName\": \"the string 'null'\",\n+                                        \"value\": \"the string 'null'\"\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\": \"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\": \"merge-strategy\",\n+                                \"name\": \"Null Value Representation\",\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+                            \"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\": \"min-bin-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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"min-records\",\n+                                \"name\": \"Path Not Found Behavior\",\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\": \"2.0.0-M3\"\n-                                }\n-                            },\n-                            \"record-writer\": {\n-                                \"description\": \"Specifies the Controller Service to use for writing out the records\",\n-                                \"displayName\": \"Record Writer\",\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\": \"record-writer\",\n+                                \"name\": \"Return 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.RecordSetWriterFactory\",\n-                                    \"version\": \"2.0.0-M3\"\n-                                }\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                         \"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+                                \"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\": \"The FlowFiles that were used to create the bundle\",\n-                                \"name\": \"original\"\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\": \"The FlowFile containing the merged records\",\n-                                \"name\": \"merged\"\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                         ],\n-                        \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": false,\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": true,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"content\",\n-                            \"correlation\",\n-                            \"event\",\n-                            \"merge\",\n-                            \"record\",\n-                            \"stream\"\n+                            \"JSON\",\n+                            \"JsonPath\",\n+                            \"evaluate\"\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-                        \"useCases\": [\n-                            {\n-                                \"configuration\": \"Configure the \\\"Record Reader\\\" to specify a Record Reader that is appropriate for the incoming data type.\\nConfigure the \\\"Record Writer\\\" to specify a Record Writer that is appropriate for the desired output data type.\\nSet \\\"Merge Strategy\\\" to `Bin-Packing Algorithm`.\\nSet the \\\"Minimum Bin Size\\\" to desired file size of the merged output file. For example, a value of `1 MB` will result in not merging data until at least\\n    1 MB of data is available (unless the Max Bin Age is reached first). If there is no desired minimum file size, leave the default value of `0 B`.\\nSet the \\\"Minimum Number of Records\\\" property to the minimum number of Records that should be included in the merged output file. For example, setting the value\\n    to `10000` ensures that the output file will have at least 10,000 Records in it (unless the Max Bin Age is reached first).\\nSet the \\\"Max Bin Age\\\" to specify the maximum amount of time to hold data before merging. This can be thought of as a \\\"timeout\\\" at which time the Processor will\\n    merge whatever data it is, even if the \\\"Minimum Bin Size\\\" and \\\"Minimum Number of Records\\\" has not been reached. It is always recommended to set the value.\\n    A reasonable default might be `10 mins` if there is no other latency requirement.\\n\\nConnect the 'merged' Relationship to the next component in the flow. Auto-terminate the 'original' Relationship.\\n\",\n-                                \"description\": \"Combine together many arbitrary Records in order to create a single, larger file\",\n-                                \"keywords\": [],\n-                                \"notes\": \"\"\n-                            }\n-                        ],\n-                        \"version\": \"2.0.0-M3\",\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.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+                        \"useCases\": [],\n+                        \"version\": \"2.0.0-M3\"\n                     },\n                     {\n                         \"additionalDetails\": false,\n                         \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n@@ -51677,95 +59386,152 @@\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                         \"multiProcessorUseCases\": [],\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+                            \"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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"End Offset\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Destination\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Remove All Content\": {\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\": \"Remove all content from the FlowFile superseding Start Offset and End Offset properties.\",\n-                                \"displayName\": \"Remove All Content\",\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\": \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Start Offset\",\n+                                \"name\": \"Validate DTD\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n                         \"sideEffectFree\": true,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"Processed flowfiles.\",\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                         ],\n                         \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicProperties\": true,\n                         \"supportsDynamicRelationships\": 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-                            \"binary\",\n-                            \"discard\",\n-                            \"keep\"\n+                            \"XML\",\n+                            \"XPath\",\n+                            \"evaluate\"\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.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                         \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\"\n+                        \"version\": \"2.0.0-M3\",\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                     },\n                     {\n-                        \"additionalDetails\": false,\n+                        \"additionalDetails\": true,\n                         \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n@@ -51774,253 +59540,170 @@\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                         \"multiProcessorUseCases\": [],\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Activity Restored Message\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Continually Send Messages\": {\n+                            \"Destination\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"displayName\": \"flowfile-content\",\n+                                        \"value\": \"flowfile-content\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"displayName\": \"flowfile-attribute\",\n+                                        \"value\": \"flowfile-attribute\"\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+                                \"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\": \"Continually Send Messages\",\n+                                \"name\": \"Destination\",\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+                            \"Output: Indent\": {\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+                                \"description\": \"Specifies whether the processor may add additional whitespace when outputting a result tree.\",\n+                                \"displayName\": \"Output: Indent\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Copy Attributes\",\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Inactivity Message\",\n+                                \"name\": \"Output: Indent\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Monitoring Scope\": {\n+                            \"Output: Method\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"node\",\n-                                        \"value\": \"node\"\n+                                        \"displayName\": \"xml\",\n+                                        \"value\": \"xml\"\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+                                        \"displayName\": \"html\",\n+                                        \"value\": \"html\"\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+                                        \"displayName\": \"text\",\n+                                        \"value\": \"text\"\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\": \"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\": \"Reporting Node\",\n+                                \"name\": \"Output: Method\",\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+                            \"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\": \"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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Threshold Duration\",\n+                                \"name\": \"Output: Omit XML Declaration\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Wait for Activity\": {\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\": \"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+                                \"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\": \"Wait for Activity\",\n+                                \"name\": \"Validate DTD\",\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-                                \"LOCAL\",\n-                                \"CLUSTER\"\n-                            ]\n-                        },\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+                                \"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\": \"All incoming FlowFiles are routed to success\",\n-                                \"name\": \"success\"\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\": \"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\": \"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                         ],\n-                        \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": false,\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": true,\n                         \"supportsDynamicRelationships\": 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-                            \"active\",\n-                            \"activity\",\n-                            \"detection\",\n-                            \"flow\",\n-                            \"inactive\",\n-                            \"monitor\"\n+                            \"XML\",\n+                            \"XPath\",\n+                            \"XQuery\",\n+                            \"evaluate\"\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+                        \"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                         \"useCases\": [],\n                         \"version\": \"2.0.0-M3\",\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+                                \"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-standard-nar\",\n                         \"buildInfo\": {\n@@ -52034,132 +59717,161 @@\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_REQUIRED\",\n+                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n                         \"multiProcessorUseCases\": [],\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+                            \"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\": \"attribute-cache-regex\",\n-                                \"required\": false,\n+                                \"name\": \"Argument Delimiter\",\n+                                \"required\": true,\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+                            \"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\": \"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\": \"2.0.0-M3\"\n-                                }\n+                                \"name\": \"Batch Duration\",\n+                                \"required\": false,\n+                                \"sensitive\": false\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+                            \"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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"release-signal-id\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Command\",\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+                            \"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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Command Arguments\",\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 'Batch Duration' is set.\",\n+                                \"displayName\": \"Output MIME Type\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"signal-buffer-count\",\n-                                \"required\": true,\n+                                \"name\": \"Output MIME type\",\n+                                \"required\": false,\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+                            \"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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"signal-counter-delta\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Redirect Error Stream\",\n+                                \"required\": false,\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+                            \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"signal-counter-name\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Working Directory\",\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.Wait\"\n-                        ],\n+                        \"restricted\": true,\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\": \"All created FlowFiles are routed 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-                                \"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                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"cache\",\n-                            \"distributed\",\n-                            \"map\",\n-                            \"notify\",\n-                            \"release\",\n-                            \"signal\"\n+                            \"command\",\n+                            \"external\",\n+                            \"invoke\",\n+                            \"process\",\n+                            \"script\",\n+                            \"source\"\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+                        \"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                         \"useCases\": [],\n                         \"version\": \"2.0.0-M3\",\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+                                \"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                     },\n                     {\n                         \"additionalDetails\": false,\n                         \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n@@ -52173,122 +59885,346 @@\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-                        \"multiProcessorUseCases\": [\n+                        \"dynamicProperties\": [\n                             {\n-                                \"configurations\": [\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+                        \"multiProcessorUseCases\": [],\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\": \"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\": \"2.0.0-M3\"\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\": \"Environment variables 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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"SQL select query\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"compression-format\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"configuration\": \"    \\\"Maximum Batch Size\\\" > 1 can help improve performance by batching many flowfiles together into 1 larger file that is transmitted by InvokeHTTP.\\n\\n    Connect the success relationship of PackageFlowFile to the input of InvokeHTTP.\\n\",\n-                                        \"processorClassName\": \"org.apache.nifi.processors.standard.PackageFlowFile\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"BZIP2\",\n+                                        \"value\": \"BZIP2\"\n                                     },\n                                     {\n-                                        \"configuration\": \"    \\\"HTTP Method\\\" = \\\"POST\\\" to send data to ListenHTTP.\\n    \\\"HTTP URL\\\" should include the hostname, port, and path to the ListenHTTP.\\n    \\\"Request Content-Type\\\" = \\\"${mime.type}\\\" because PackageFlowFile output files have attribute mime.type=application/flowfile-v3.\\n\",\n-                                        \"processorClassName\": \"org.apache.nifi.processors.standard.InvokeHTTP\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"DEFLATE\",\n+                                        \"value\": \"DEFLATE\"\n                                     },\n                                     {\n-                                        \"configuration\": \"    \\\"Listening Port\\\" = a unique port number.\\n\\n    ListenHTTP automatically unpacks files that have attribute mime.type=application/flowfile-v3.\\n    If PackageFlowFile batches 99 FlowFiles into 1 file that InvokeHTTP sends, then the original 99 FlowFiles will be output by ListenHTTP.\\n\",\n-                                        \"processorClassName\": \"org.apache.nifi.processors.standard.ListenHTTP\"\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-                                \"description\": \"Send FlowFile content and attributes from one NiFi instance to another NiFi instance.\",\n-                                \"keywords\": [\n-                                    \"flowfile\",\n-                                    \"attributes\",\n-                                    \"content\",\n-                                    \"ffv3\",\n-                                    \"flowfile-stream-v3\",\n-                                    \"transfer\"\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+                            \"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\": \"Environment variables 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\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"dbf-default-scale\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\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-                                \"notes\": \"A Remote Process Group is preferred to send FlowFiles between two NiFi instances, but an alternative is to use PackageFlowFile then InvokeHTTP sending to ListenHTTP.\"\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\": \"dbf-normalize\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             },\n-                            {\n-                                \"configurations\": [\n+                            \"dbf-user-logical-types\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"configuration\": \"    \\\"Maximum Batch Size\\\" > 1 can improve storage efficiency by batching many FlowFiles together into 1 larger file that is stored.\\n\\n    Connect the success relationship to the input of any NiFi egress processor for offline storage.\\n\",\n-                                        \"processorClassName\": \"org.apache.nifi.processors.standard.PackageFlowFile\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n-                                        \"configuration\": \"    \\\"Packaging Format\\\" = \\\"application/flowfile-v3\\\".\\n\\n    Connect the output of a NiFi ingress processor that reads files stored offline to the input of UnpackContent.\\n    If PackageFlowFile batches 99 FlowFiles into 1 file that is read from storage, then the original 99 FlowFiles will be output by UnpackContent.\\n\",\n-                                        \"processorClassName\": \"org.apache.nifi.processors.standard.UnpackContent\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"description\": \"Export FlowFile content and attributes from NiFi to external storage and reimport.\",\n-                                \"keywords\": [\n-                                    \"flowfile\",\n-                                    \"attributes\",\n-                                    \"content\",\n-                                    \"ffv3\",\n-                                    \"flowfile-stream-v3\",\n-                                    \"offline\",\n-                                    \"storage\"\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\": \"dbf-user-logical-types\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\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-                                \"notes\": \"\"\n-                            }\n-                        ],\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+                                \"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\": \"max-batch-size\",\n+                                \"name\": \"esql-auto-commit\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\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\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"esql-fetch-size\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\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\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"esql-max-rows\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\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\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables 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\": \"Environment variables 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\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"sql-pre-query\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n                             }\n                         },\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.standard.MergeContent\",\n-                            \"org.apache.nifi.processors.standard.UnpackContent\"\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                         ],\n-                        \"sideEffectFree\": true,\n+                        \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"The packaged FlowFile is sent to this relationship\",\n+                                \"description\": \"Successfully created FlowFile from SQL query result set.\",\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\": \"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                         ],\n-                        \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": false,\n+                        \"supportsBatching\": false,\n+                        \"supportsDynamicProperties\": true,\n                         \"supportsDynamicRelationships\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"supportsSensitiveDynamicProperties\": true,\n                         \"tags\": [\n-                            \"attributes\",\n-                            \"flowfile\",\n-                            \"flowfile-stream\",\n-                            \"flowfile-stream-v3\",\n-                            \"package\"\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.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.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                         \"useCases\": [],\n                         \"version\": \"2.0.0-M3\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"The mime.type will be changed to application/flowfile-v3\",\n-                                \"name\": \"mime.type\"\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@@ -52302,208 +60238,338 @@\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_REQUIRED\",\n+                        \"inputRequirement\": \"INPUT_ALLOWED\",\n                         \"multiProcessorUseCases\": [],\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\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+                            \"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\": \"ACCEPT_EMPTY_EXTENSIONS\",\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\": \"2.0.0-M3\"\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\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Max Wait Time\",\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+                            \"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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"APPEND_RAW_MESSAGE_TO_JSON\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"SQL select query\",\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\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"dbf-default-precision\",\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+                            \"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\": \"DATETIME_REPRESENTATION\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"dbf-default-scale\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"FIELDS_DESTINATION\": {\n+                            \"dbf-user-logical-types\": {\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 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\": \"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\": \"FIELDS_DESTINATION\",\n+                                \"name\": \"dbf-user-logical-types\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"INCLUDE_CUSTOM_EXTENSIONS\": {\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\": \"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+                                \"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\": \"INCLUDE_CUSTOM_EXTENSIONS\",\n+                                \"name\": \"esql-auto-commit\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"TIME_REPRESENTATION\": {\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\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"esql-fetch-size\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\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\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"esql-max-rows\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\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\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"esql-output-batch-size\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"esqlrecord-normalize\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"UTC\",\n-                                        \"value\": \"UTC\"\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"Local Timezone (system Default)\",\n-                                        \"value\": \"Local Timezone (system Default)\"\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\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+                                \"defaultValue\": \"false\",\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\": \"TIME_REPRESENTATION\",\n+                                \"name\": \"esqlrecord-normalize\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\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\": \"2.0.0-M3\"\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\": \"Environment variables 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\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"sql-pre-query\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.standard.ParseSyslog\"\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                         ],\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\": \"Successfully created FlowFile from SQL query result set.\",\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\": \"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                         ],\n-                        \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": false,\n+                        \"supportsBatching\": false,\n+                        \"supportsDynamicProperties\": true,\n                         \"supportsDynamicRelationships\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"supportsSensitiveDynamicProperties\": true,\n                         \"tags\": [\n-                            \"attributes\",\n-                            \"cef\",\n-                            \"event\",\n-                            \"logs\",\n-                            \"message\",\n-                            \"system\"\n+                            \"database\",\n+                            \"jdbc\",\n+                            \"query\",\n+                            \"record\",\n+                            \"select\",\n+                            \"sql\"\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.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                         \"useCases\": [],\n                         \"version\": \"2.0.0-M3\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"The version of the CEF message.\",\n-                                \"name\": \"cef.header.version\"\n+                                \"description\": \"Contains the number of rows returned in the select query\",\n+                                \"name\": \"executesql.row.count\"\n                             },\n                             {\n-                                \"description\": \"The Device Vendor of the CEF message.\",\n-                                \"name\": \"cef.header.deviceVendor\"\n+                                \"description\": \"Combined duration of the query execution time and fetch time in milliseconds\",\n+                                \"name\": \"executesql.query.duration\"\n                             },\n                             {\n-                                \"description\": \"The Device Product of the CEF message.\",\n-                                \"name\": \"cef.header.deviceProduct\"\n+                                \"description\": \"Duration of the query execution time in milliseconds\",\n+                                \"name\": \"executesql.query.executiontime\"\n                             },\n                             {\n-                                \"description\": \"The Device Version of the CEF message.\",\n-                                \"name\": \"cef.header.deviceVersion\"\n+                                \"description\": \"Duration of the result set fetch time in milliseconds\",\n+                                \"name\": \"executesql.query.fetchtime\"\n                             },\n                             {\n-                                \"description\": \"The Device Event Class ID of the CEF message.\",\n-                                \"name\": \"cef.header.deviceEventClassId\"\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\": \"The name of the CEF message.\",\n-                                \"name\": \"cef.header.name\"\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\": \"The severity of the CEF message.\",\n-                                \"name\": \"cef.header.severity\"\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\": \"The key and value generated by the parsing of the message.\",\n-                                \"name\": \"cef.extension.*\"\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-                        \"additionalDetails\": false,\n+                        \"additionalDetails\": true,\n                         \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n@@ -52512,101 +60578,233 @@\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+                                \"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                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"multiProcessorUseCases\": [],\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+                            \"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\": \"Character Set\",\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\": \"Environment variables 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\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Command Path\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n+                            },\n+                            \"Ignore STDIN\": {\n+                                \"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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Output MIME Type\",\n+                                \"required\": false,\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables 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-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.standard.ListenSyslog\",\n-                            \"org.apache.nifi.processors.standard.PutSyslog\"\n-                        ],\n-                        \"sideEffectFree\": true,\n+                        \"restricted\": 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-                                \"name\": \"success\"\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\": \"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+                                \"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                         ],\n                         \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicProperties\": true,\n                         \"supportsDynamicRelationships\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"supportsSensitiveDynamicProperties\": true,\n                         \"tags\": [\n-                            \"attributes\",\n-                            \"event\",\n-                            \"logs\",\n-                            \"message\",\n-                            \"syslog\",\n-                            \"system\"\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.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.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                         \"useCases\": [],\n                         \"version\": \"2.0.0-M3\",\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+                                \"description\": \"The name of the command executed\",\n+                                \"name\": \"execution.command\"\n                             },\n                             {\n-                                \"description\": \"The timestamp of the Syslog message.\",\n-                                \"name\": \"syslog.timestamp\"\n+                                \"description\": \"The semi-colon delimited list of arguments. Sensitive properties will be masked\",\n+                                \"name\": \"execution.command.args\"\n                             },\n                             {\n-                                \"description\": \"The hostname or IP address of the Syslog message.\",\n-                                \"name\": \"syslog.hostname\"\n+                                \"description\": \"The exit status code returned from executing the command\",\n+                                \"name\": \"execution.status\"\n                             },\n                             {\n-                                \"description\": \"The hostname of the Syslog server that sent the message.\",\n-                                \"name\": \"syslog.sender\"\n+                                \"description\": \"Any error messages returned from executing the command\",\n+                                \"name\": \"execution.error\"\n                             },\n                             {\n-                                \"description\": \"The body of the Syslog message, everything after the hostname.\",\n-                                \"name\": \"syslog.body\"\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@@ -52620,175 +60818,189 @@\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                         \"multiProcessorUseCases\": [],\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n                             \"Character Set\": {\n                                 \"defaultValue\": \"UTF-8\",\n-                                \"description\": \"Specifies which character set of the Syslog messages\",\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-                            \"include_policy\": {\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+                                \"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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Grok Expression\",\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+                                        \"TEXT\",\n+                                        \"FILE\",\n+                                        \"URL\"\n+                                    ]\n+                                },\n+                                \"sensitive\": false\n+                            },\n+                            \"Keep Empty Captures\": {\n                                 \"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 Syslog Message body will be included in the attributes.\",\n-                                \"displayName\": \"Include Message Body in Attributes\",\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\": \"include_policy\",\n-                                \"required\": false,\n+                                \"name\": \"Keep Empty Captures\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"nil_policy\": {\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\": \"Maximum Buffer Size\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Named captures only\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"The missing field will not have an attribute added.\",\n-                                        \"displayName\": \"OMIT\",\n-                                        \"value\": \"OMIT\"\n-                                    },\n-                                    {\n-                                        \"description\": \"The missing field will have an empty attribute added.\",\n-                                        \"displayName\": \"NULL\",\n-                                        \"value\": \"NULL\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n-                                        \"description\": \"The missing field will have an attribute added with the value of '-'.\",\n-                                        \"displayName\": \"DASH\",\n-                                        \"value\": \"DASH\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"NULL\",\n-                                \"description\": \"Defines how NIL values are handled for header fields.\",\n-                                \"displayName\": \"NIL Policy\",\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\": \"nil_policy\",\n+                                \"name\": \"Named captures only\",\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+                        \"restricted\": true,\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+                                \"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 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+                                \"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                         ],\n                         \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"attributes\",\n-                            \"event\",\n-                            \"logs\",\n-                            \"message\",\n-                            \"syslog\",\n-                            \"syslog5424\",\n-                            \"system\"\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.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+                        \"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                         \"useCases\": [],\n                         \"version\": \"2.0.0-M3\",\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-                            },\n-                            {\n-                                \"description\": \"The body of the Syslog message, everything after the hostname.\",\n-                                \"name\": \"syslog.body\"\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-                        \"additionalDetails\": true,\n+                        \"additionalDetails\": false,\n                         \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n@@ -52797,173 +61009,97 @@\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                         \"multiProcessorUseCases\": [],\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+                            \"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\": \"record-reader\",\n+                                \"name\": \"cache-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\": \"2.0.0-M3\"\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+                            \"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-writer\",\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.RecordSetWriterFactory\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n                                     \"version\": \"2.0.0-M3\"\n                                 }\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-                        ],\n-                        \"sideEffectFree\": false,\n+                        \"sideEffectFree\": true,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"FlowFiles that are successfully partitioned will be routed to this relationship\",\n+                                \"description\": \"FlowFiles whose record schemas are successfully extracted will be routed to this relationship\",\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+                                \"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-                                \"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                         ],\n                         \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": true,\n+                        \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"bin\",\n-                            \"group\",\n-                            \"organize\",\n-                            \"partition\",\n+                            \"avro\",\n+                            \"csv\",\n+                            \"freeform\",\n+                            \"generic\",\n+                            \"json\",\n                             \"record\",\n-                            \"recordpath\",\n-                            \"rpath\",\n-                            \"segment\",\n-                            \"split\"\n+                            \"schema\",\n+                            \"text\",\n+                            \"xml\"\n                         ],\n                         \"triggerSerially\": false,\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-                        \"useCases\": [\n-                            {\n-                                \"configuration\": \"Choose a RecordReader that is appropriate based on the format of the incoming data.\\nChoose a RecordWriter that writes the data in the desired output format.\\n\\nAdd a single additional property. The name of the property should describe the type of data that is being used to partition the data. The property's value should be a RecordPath that specifies which output FlowFile the Record belongs to.\\n\\nFor example, if we want to separate records based on their `transactionType` field, we could add a new property named `transactionType`. The value of the property might be `/transaction/type`. An input FlowFile will then be separated into as few FlowFiles as possible such that each output FlowFile has the same value for the `transactionType` field.\\n\",\n-                                \"description\": \"Separate records into separate FlowFiles so that all of the records in a FlowFile have the same value for a given field or set of fields.\",\n-                                \"keywords\": [\n-                                    \"separate\",\n-                                    \"split\",\n-                                    \"partition\",\n-                                    \"break apart\",\n-                                    \"colocate\",\n-                                    \"segregate\",\n-                                    \"record\",\n-                                    \"field\",\n-                                    \"recordpath\"\n-                                ],\n-                                \"notes\": \"\"\n-                            },\n-                            {\n-                                \"configuration\": \"Choose a RecordReader that is appropriate based on the format of the incoming data.\\nChoose a RecordWriter that writes the data in the desired output format.\\n\\nAdd a single additional property. The name of the property should describe the criteria. The property's value should be a RecordPath that returns `true` if the Record meets the criteria or `false` otherwise.\\n\\nFor example, if we want to separate records based on whether or not they have a transaction total of more than $1,000 we could add a new property named `largeTransaction` with a value of `/transaction/total > 1000`. This will create two FlowFiles. In the first, all records will have a total over `1000`. In the second, all records will have a transaction less than or equal to 1000. Each FlowFile will have an attribute named `largeTransaction` with a value of `true` or `false`.\\n\",\n-                                \"description\": \"Separate records based on whether or not they adhere to a specific criteria\",\n-                                \"keywords\": [\n-                                    \"separate\",\n-                                    \"split\",\n-                                    \"partition\",\n-                                    \"break apart\",\n-                                    \"segregate\",\n-                                    \"record\",\n-                                    \"field\",\n-                                    \"recordpath\",\n-                                    \"criteria\"\n-                                ],\n-                                \"notes\": \"\"\n-                            }\n-                        ],\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+                        \"useCases\": [],\n                         \"version\": \"2.0.0-M3\",\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-                                \"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\": \"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+                                \"description\": \"This attribute provides on failure the error message encountered by the Reader.\",\n+                                \"name\": \"record.error.message\"\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\": \"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+                        \"additionalDetails\": true,\n                         \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n@@ -52972,573 +61108,370 @@\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                         \"multiProcessorUseCases\": [],\n                         \"primaryNodeOnly\": false,\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+                            \"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\": \"Data Record Path\",\n-                                \"required\": false,\n+                                \"name\": \"Character Set\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Statement Type Record Path\": {\n-                                \"dependencies\": [\n+                            \"Enable Canonical Equivalence\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"Use Record Path\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Statement Type\",\n-                                        \"propertyName\": \"put-db-record-statement-type\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\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. (Debezium style operation types are also supported: \\\"r\\\" and \\\"c\\\" for INSERT, \\\"u\\\" for UPDATE, and \\\"d\\\" for DELETE)\",\n-                                \"displayName\": \"Statement Type Record Path\",\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\": \"Statement Type Record Path\",\n+                                \"name\": \"Enable Canonical Equivalence\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"database-session-autocommit\": {\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\": \"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.\",\n-                                \"displayName\": \"Database Session AutoCommit\",\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\": \"database-session-autocommit\",\n-                                \"required\": false,\n+                                \"name\": \"Enable Case-insensitive Matching\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"db-type\": {\n+                            \"Enable DOTALL Mode\": {\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\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n-                                        \"description\": \"Generates Phoenix compliant SQL\",\n-                                        \"displayName\": \"Phoenix\",\n-                                        \"value\": \"Phoenix\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\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\": \"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\": \"db-type\",\n-                                \"required\": false,\n+                                \"name\": \"Enable DOTALL Mode\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"put-db-record-allow-multiple-statements\": {\n+                            \"Enable Literal Parsing of the Pattern\": {\n                                 \"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+                                \"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\": \"put-db-record-allow-multiple-statements\",\n+                                \"name\": \"Enable Literal Parsing of the Pattern\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"put-db-record-binary-format\": {\n+                            \"Enable Multiline Mode\": {\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+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n-                                        \"description\": \"String values for binary columns contain the original value in Base64 encoded format\",\n-                                        \"displayName\": \"Base64\",\n-                                        \"value\": \"Base64\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"put-db-record-binary-format\",\n-                                \"required\": true,\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\": \"Environment variables 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+                                \"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\": \"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\": \"2.0.0-M3\"\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\": \"Environment variables 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\": \"Environment variables 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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"put-db-record-query-timeout\",\n+                                \"name\": \"Enable Multiline Mode\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"put-db-record-quoted-identifiers\": {\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\": \"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+                                \"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\": \"put-db-record-quoted-identifiers\",\n-                                \"required\": false,\n+                                \"name\": \"Enable Unicode Predefined Character Classes\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"put-db-record-quoted-table-identifiers\": {\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\": \"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+                                \"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\": \"put-db-record-record-reader\",\n+                                \"name\": \"Enable Unicode-aware Case Folding\",\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\": \"2.0.0-M3\"\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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"put-db-record-schema-name\",\n-                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"put-db-record-statement-type\": {\n+                            \"Enable Unix Lines Mode\": {\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+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"Use Record Path\",\n-                                        \"value\": \"Use Record Path\"\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\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+                                \"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\": \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"put-db-record-table-name\",\n+                                \"name\": \"Enable Unix Lines Mode\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"put-db-record-translate-field-names\": {\n+                            \"Enable named group support\": {\n                                 \"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\": \"If set to true, when named groups are present in the regular expression, the name of the\\ngroup will be used in the attribute name as opposed to the group index.  All capturing groups\\nmust be named, if the number of groups (not including capture group 0) does not equal the\\nnumber of named groups validation will fail.\",\n+                                \"displayName\": \"Enable named group support\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"put-db-record-translate-field-names\",\n+                                \"name\": \"Enable named group support\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"put-db-record-unmatched-column-behavior\": {\n+                            \"Enable repeating capture group\": {\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+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\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\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\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\": \"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\": \"put-db-record-unmatched-column-behavior\",\n-                                \"required\": false,\n+                                \"name\": \"Enable repeating capture group\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"put-db-record-unmatched-field-behavior\": {\n+                            \"Include Capture Group 0\": {\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+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\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+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\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+                                \"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\": \"put-db-record-unmatched-field-behavior\",\n-                                \"required\": false,\n+                                \"name\": \"Include Capture Group 0\",\n+                                \"required\": true,\n                                 \"sensitive\": false\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+                            \"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                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"put-db-record-update-keys\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\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-                            \"rollback-on-failure\": {\n+                            \"Permit Whitespace and Comments in Pattern\": {\n                                 \"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+                                \"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\": \"table-schema-cache-size\",\n+                                \"name\": \"Permit Whitespace and Comments in Pattern\",\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-                        ],\n-                        \"sideEffectFree\": false,\n+                        \"sideEffectFree\": true,\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-                                \"name\": \"success\"\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-                                \"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+                                \"description\": \"FlowFiles are routed to this relationship when no provided Regular Expression matches the content of the FlowFile\",\n+                                \"name\": \"unmatched\"\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                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"database\",\n-                            \"delete\",\n-                            \"insert\",\n-                            \"jdbc\",\n-                            \"put\",\n-                            \"record\",\n-                            \"sql\",\n-                            \"update\"\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.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-                        \"useCases\": [\n-                            {\n-                                \"configuration\": \"\",\n-                                \"description\": \"Insert records into a database\",\n-                                \"keywords\": [],\n-                                \"notes\": \"\"\n-                            }\n-                        ],\n-                        \"version\": \"2.0.0-M3\",\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-                            }\n-                        ]\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+                        \"useCases\": [],\n+                        \"version\": \"2.0.0-M3\"\n                     },\n                     {\n                         \"additionalDetails\": false,\n                         \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n@@ -53556,120 +61489,123 @@\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"multiProcessorUseCases\": [],\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+                                \"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\": \"Environment variables and FlowFile Attributes\",\n                                 \"name\": \"Cache Entry Identifier\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Cache update 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-                                        \"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-                                    }\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+                            \"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\": \"Cache update strategy\",\n-                                \"required\": true,\n+                                \"name\": \"Character Set\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n                             \"Distributed Cache Service\": {\n-                                \"description\": \"The Controller Service that is used to cache flow files\",\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 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\": \"2.0.0-M3\"\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+                            \"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\": \"Max cache entry 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\": \"Environment variables 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.distributed.cache.server.map.DistributedMapCacheServer\",\n-                            \"org.apache.nifi.processors.standard.FetchDistributedMapCache\"\n+                            \"org.apache.nifi.processors.standard.PutDistributedMapCache\"\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\": \"If the cache was successfully communicated with it will be routed 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\": \"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                         ],\n                         \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n                             \"cache\",\n                             \"distributed\",\n-                            \"map\",\n-                            \"put\"\n+                            \"fetch\",\n+                            \"map\"\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.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                         \"useCases\": [],\n                         \"version\": \"2.0.0-M3\",\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\": \"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\": true,\n+                        \"additionalDetails\": false,\n                         \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n@@ -53678,447 +61614,69 @@\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-                        \"multiProcessorUseCases\": [],\n-                        \"primaryNodeOnly\": false,\n-                        \"propertyDescriptors\": {\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\": \"Attach File\",\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\": \"Environment variables 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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"CC\",\n-                                \"required\": false,\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Content Type\",\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"From\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\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 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\": \"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\": \"Environment variables 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\": \"Environment variables 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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"SMTP Hostname\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables 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\": \"Environment variables 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\": \"Environment variables 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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"SMTP Username\",\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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"SMTP X-Mailer Header\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Subject\": {\n-                                \"defaultValue\": \"Message from NiFi\",\n-                                \"description\": \"The email subject\",\n-                                \"displayName\": \"Subject\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Subject\",\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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"To\",\n-                                \"required\": false,\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 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\": \"attribute-name-regex\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"authorization-mode\": {\n-                                \"allowableValues\": [\n+                        \"multiProcessorUseCases\": [\n+                            {\n+                                \"configurations\": [\n                                     {\n-                                        \"description\": \"Use password\",\n-                                        \"displayName\": \"Use Password\",\n-                                        \"value\": \"password-based-authorization-mode\"\n+                                        \"configuration\": \"The \\\"Hostname\\\" property should be set to the fully qualified hostname of the FTP Server. It's a good idea to parameterize     this property by setting it to something like `#{FTP_SERVER}`.\\nThe \\\"Remote Path\\\" property must be set to the directory on the FTP Server where the files reside. If the flow being built is to be reused elsewhere,     it's a good idea to parameterize this property by setting it to something like `#{FTP_REMOTE_PATH}`.\\nConfigure the \\\"Username\\\" property to the appropriate username for logging into the FTP Server. It's usually a good idea to parameterize this property     by setting it to something like `#{FTP_USERNAME}`.\\nConfigure the \\\"Password\\\" property to the appropriate password for the provided username. It's usually a good idea to parameterize this property     by setting it to something like `#{FTP_PASSWORD}`.\\n\\nThe 'success' Relationship of this Processor is then connected to FetchFTP.\\n\",\n+                                        \"processorClassName\": \"org.apache.nifi.processors.standard.ListFTP\"\n                                     },\n                                     {\n-                                        \"description\": \"Use OAuth2 to acquire access token\",\n-                                        \"displayName\": \"Use OAuth2\",\n-                                        \"value\": \"oauth-based-authorization-mode\"\n+                                        \"configuration\": \"\\\"Hostname\\\" = \\\"${ftp.remote.host}\\\"\\n\\\"Remote File\\\" = \\\"${path}/${filename}\\\"\\n\\\"Username\\\" = \\\"${ftp.listing.user}\\\"\\n\\\"Password\\\" = \\\"#{FTP_PASSWORD}\\\"\\n\",\n+                                        \"processorClassName\": \"org.apache.nifi.processors.standard.FetchFTP\"\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-                            \"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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables 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-                                \"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+                                \"description\": \"Retrieve all files in a directory of an FTP Server\",\n+                                \"keywords\": [\n+                                    \"ftp\",\n+                                    \"file\",\n+                                    \"transform\",\n+                                    \"state\",\n+                                    \"retrieve\",\n+                                    \"fetch\",\n+                                    \"all\",\n+                                    \"stream\"\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\": \"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\": \"2.0.0-M3\"\n-                                }\n-                            }\n-                        },\n-                        \"sideEffectFree\": false,\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"FlowFiles that are successfully sent will be routed to this relationship\",\n-                                \"name\": \"success\"\n-                            },\n-                            {\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-                        ],\n-                        \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": true,\n-                        \"supportsDynamicRelationships\": 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-                            \"email\",\n-                            \"notify\",\n-                            \"put\",\n-                            \"smtp\"\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-                        \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\"\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-standard-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"f2215c6\"\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\": \"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+                                \"notes\": \"\"\n                             }\n                         ],\n-                        \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n-                        \"multiProcessorUseCases\": [],\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Batch Size\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Conflict Resolution\": {\n+                            \"Completion 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\": \"RENAME\",\n-                                        \"value\": \"RENAME\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"REJECT\",\n-                                        \"value\": \"REJECT\"\n+                                        \"description\": \"Leave the file as-is\",\n+                                        \"displayName\": \"None\",\n+                                        \"value\": \"None\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"FAIL\",\n-                                        \"value\": \"FAIL\"\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\": \"\",\n-                                        \"displayName\": \"NONE\",\n-                                        \"value\": \"NONE\"\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\": \"Determines how to handle the problem of filename collisions\",\n-                                \"displayName\": \"Conflict Resolution\",\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\": \"Conflict Resolution\",\n+                                \"name\": \"Completion Strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n                             \"Connection Mode\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n@@ -54162,59 +61720,36 @@\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+                                \"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\": true,\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-                            \"Dot Rename\": {\n-                                \"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-                                \"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+                                \"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\": \"Environment variables and FlowFile Attributes\",\n                                 \"name\": \"Hostname\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n@@ -54246,47 +61781,37 @@\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+                            \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Last Modified Time\",\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\": \"Environment variables 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\": \"Environment variables 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+                                \"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\": \"Environment variables and FlowFile Attributes\",\n                                 \"name\": \"Port\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n@@ -54335,55 +61860,22 @@\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n                                 \"name\": \"Proxy Type\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\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\": \"Reject Zero-Byte Files\",\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\": \"Environment variables 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+                            \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Temporary Filename\",\n-                                \"required\": false,\n+                                \"name\": \"Remote File\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n                             \"Transfer Mode\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"Binary\",\n@@ -54434,14 +61926,62 @@\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n                                 \"name\": \"Username\",\n                                 \"required\": true,\n                                 \"sensitive\": false\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"fetchfiletransfer-notfound-loglevel\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n                             \"ftp-use-utf8\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n@@ -54458,15 +61998,15 @@\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n                                 \"name\": \"ftp-use-utf8\",\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+                                \"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@@ -54475,55 +62015,90 @@\n                                     \"group\": \"org.apache.nifi\",\n                                     \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n                                     \"version\": \"2.0.0-M3\"\n                                 }\n                             }\n                         },\n                         \"seeAlso\": [\n-                            \"org.apache.nifi.processors.standard.GetFTP\"\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\": \"FlowFiles that are successfully sent will be routed to success\",\n+                                \"description\": \"All FlowFiles that are received are routed to success\",\n                                 \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"FlowFiles that were rejected by the destination system\",\n-                                \"name\": \"reject\"\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\": \"FlowFiles that failed to send to the remote system; failure is usually looped back to this processor\",\n-                                \"name\": \"failure\"\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\": true,\n-                        \"supportsDynamicProperties\": true,\n+                        \"supportsBatching\": false,\n+                        \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"archive\",\n-                            \"copy\",\n-                            \"egress\",\n+                            \"fetch\",\n                             \"files\",\n                             \"ftp\",\n-                            \"put\",\n-                            \"remote\"\n+                            \"get\",\n+                            \"ingest\",\n+                            \"input\",\n+                            \"remote\",\n+                            \"retrieve\",\n+                            \"source\"\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+                        \"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                         \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\"\n+                        \"version\": \"2.0.0-M3\",\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-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n@@ -54537,178 +62112,307 @@\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+                                \"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-                        \"multiProcessorUseCases\": [],\n+                        \"multiProcessorUseCases\": [\n+                            {\n+                                \"configurations\": [\n+                                    {\n+                                        \"configuration\": \"Configure the \\\"Input Directory\\\" property to point to the directory that you want to ingest files from.\\nSet the \\\"Input Directory Location\\\" property to \\\"Local\\\"\\nOptionally, set \\\"Minimum File Age\\\" to a small value such as \\\"1 min\\\" to avoid ingesting files that are still being written to.\\n\\nConnect the 'success' Relationship to the FetchFile processor.\\n\",\n+                                        \"processorClassName\": \"org.apache.nifi.processors.standard.ListFile\"\n+                                    },\n+                                    {\n+                                        \"configuration\": \"Set the \\\"File to Fetch\\\" property to `${absolute.path}/${filename}`\\nSet the \\\"Completion Strategy\\\" property to `None`\\n\",\n+                                        \"processorClassName\": \"org.apache.nifi.processors.standard.FetchFile\"\n+                                    }\n+                                ],\n+                                \"description\": \"Ingest all files from a directory into NiFi\",\n+                                \"keywords\": [\n+                                    \"local\",\n+                                    \"files\",\n+                                    \"filesystem\",\n+                                    \"ingest\",\n+                                    \"ingress\",\n+                                    \"get\",\n+                                    \"source\",\n+                                    \"input\",\n+                                    \"fetch\"\n+                                ],\n+                                \"notes\": \"\"\n+                            },\n+                            {\n+                                \"configurations\": [\n+                                    {\n+                                        \"configuration\": \"Configure the \\\"Input Directory\\\" property to point to the directory that you want to ingest files from.\\nSet the \\\"Input Directory Location\\\" property to \\\"Local\\\"\\nSet the \\\"File Filter\\\" property to a Regular Expression that matches the filename (without path) of the files that you want to ingest. For example, to ingest all .jpg files, set the value to `.*\\\\.jpg`\\nOptionally, set \\\"Minimum File Age\\\" to a small value such as \\\"1 min\\\" to avoid ingesting files that are still being written to.\\n\\nConnect the 'success' Relationship to the FetchFile processor.\\n\",\n+                                        \"processorClassName\": \"org.apache.nifi.processors.standard.ListFile\"\n+                                    },\n+                                    {\n+                                        \"configuration\": \"Set the \\\"File to Fetch\\\" property to `${absolute.path}/${filename}`\\nSet the \\\"Completion Strategy\\\" property to `None`\\n\",\n+                                        \"processorClassName\": \"org.apache.nifi.processors.standard.FetchFile\"\n+                                    }\n+                                ],\n+                                \"description\": \"Ingest specific files from a directory into NiFi, filtering on filename\",\n+                                \"keywords\": [\n+                                    \"local\",\n+                                    \"files\",\n+                                    \"filesystem\",\n+                                    \"ingest\",\n+                                    \"ingress\",\n+                                    \"get\",\n+                                    \"source\",\n+                                    \"input\",\n+                                    \"fetch\",\n+                                    \"filter\"\n+                                ],\n+                                \"notes\": \"\"\n+                            }\n+                        ],\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Conflict Resolution Strategy\": {\n+                            \"Completion Strategy\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"replace\",\n-                                        \"value\": \"replace\"\n+                                        \"description\": \"Leave the file as-is\",\n+                                        \"displayName\": \"None\",\n+                                        \"value\": \"None\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"ignore\",\n-                                        \"value\": \"ignore\"\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                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"fail\",\n-                                        \"value\": \"fail\"\n+                                        \"description\": \"Deletes the original file from the file system\",\n+                                        \"displayName\": \"Delete File\",\n+                                        \"value\": \"Delete File\"\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\": \"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\": \"Conflict Resolution Strategy\",\n+                                \"name\": \"Completion Strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Create Missing Directories\": {\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\": \"Environment variables 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\": \"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+                                \"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\": \"Create Missing Directories\",\n+                                \"name\": \"Log level when file not found\",\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+                            \"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+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"NONE\",\n+                                        \"value\": \"NONE\"\n+                                    }\n+                                ],\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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Directory\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Log level when permission denied\",\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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Group\",\n-                                \"required\": false,\n-                                \"sensitive\": false\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables 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+                            \"Move Conflict 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+                                    },\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+                                \"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\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Maximum File Count\",\n-                                \"required\": false,\n-                                \"sensitive\": false\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Owner\",\n-                                \"required\": false,\n+                                \"name\": \"Move Conflict Strategy\",\n+                                \"required\": true,\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+                            \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Permissions\",\n+                                \"name\": \"Move Destination Directory\",\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.processors.standard.FetchFile\",\n-                            \"org.apache.nifi.processors.standard.GetFile\"\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\": \"Files that have been successfully written to the output directory are transferred to this relationship\",\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\": \"Files that could not be written to the output directory for some reason are transferred to this relationship\",\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\": true,\n+                        \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"archive\",\n-                            \"copy\",\n+                            \"fetch\",\n                             \"files\",\n                             \"filesystem\",\n+                            \"get\",\n+                            \"ingest\",\n+                            \"ingress\",\n+                            \"input\",\n                             \"local\",\n-                            \"put\"\n+                            \"source\"\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+                        \"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                         \"useCases\": [],\n                         \"version\": \"2.0.0-M3\"\n                     },\n                     {\n                         \"additionalDetails\": false,\n                         \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n@@ -54724,193 +62428,78 @@\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-                        \"multiProcessorUseCases\": [],\n-                        \"primaryNodeOnly\": false,\n-                        \"propertyDescriptors\": {\n-                            \"put-record-include-zero-record-results\": {\n-                                \"allowableValues\": [\n+                        \"multiProcessorUseCases\": [\n+                            {\n+                                \"configurations\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"configuration\": \"The \\\"Hostname\\\" property should be set to the fully qualified hostname of the FTP Server. It's a good idea to parameterize     this property by setting it to something like `#{SFTP_SERVER}`.\\nThe \\\"Remote Path\\\" property must be set to the directory on the FTP Server where the files reside. If the flow being built is to be reused elsewhere,     it's a good idea to parameterize this property by setting it to something like `#{SFTP_REMOTE_PATH}`.\\nConfigure the \\\"Username\\\" property to the appropriate username for logging into the FTP Server. It's usually a good idea to parameterize this property     by setting it to something like `#{SFTP_USERNAME}`.\\nConfigure the \\\"Password\\\" property to the appropriate password for the provided username. It's usually a good idea to parameterize this property     by setting it to something like `#{SFTP_PASSWORD}`.\\n\\nThe 'success' Relationship of this Processor is then connected to FetchSFTP.\\n\",\n+                                        \"processorClassName\": \"org.apache.nifi.processors.standard.ListSFTP\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"configuration\": \"\\\"Hostname\\\" = \\\"${sftp.remote.host}\\\"\\n\\\"Remote File\\\" = \\\"${path}/${filename}\\\"\\n\\\"Username\\\" = \\\"${sftp.listing.user}\\\"\\n\\\"Password\\\" = \\\"#{SFTP_PASSWORD}\\\"\\n\",\n+                                        \"processorClassName\": \"org.apache.nifi.processors.standard.FetchSFTP\"\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"put-record-include-zero-record-results\",\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"put-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\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\n-                                }\n-                            }\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-                                \"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-                                \"name\": \"failure\"\n+                                \"description\": \"Retrieve all files in a directory of an SFTP Server\",\n+                                \"keywords\": [\n+                                    \"sftp\",\n+                                    \"secure\",\n+                                    \"file\",\n+                                    \"transform\",\n+                                    \"state\",\n+                                    \"retrieve\",\n+                                    \"fetch\",\n+                                    \"all\",\n+                                    \"stream\"\n+                                ],\n+                                \"notes\": \"\"\n                             }\n                         ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"put\",\n-                            \"record\",\n-                            \"sink\"\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-                        \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\"\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-standard-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"f2215c6\"\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-                        \"multiProcessorUseCases\": [],\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-                                \"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\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n                                 \"name\": \"Ciphers Allowed\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Conflict Resolution\": {\n+                            \"Completion 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\": \"RENAME\",\n-                                        \"value\": \"RENAME\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"REJECT\",\n-                                        \"value\": \"REJECT\"\n+                                        \"description\": \"Leave the file as-is\",\n+                                        \"displayName\": \"None\",\n+                                        \"value\": \"None\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"FAIL\",\n-                                        \"value\": \"FAIL\"\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\": \"\",\n-                                        \"displayName\": \"NONE\",\n-                                        \"value\": \"NONE\"\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\": \"Determines how to handle the problem of filename collisions\",\n-                                \"displayName\": \"Conflict Resolution\",\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\": \"Conflict Resolution\",\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@@ -54931,21 +62520,21 @@\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+                                \"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\": true,\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@@ -54965,46 +62554,23 @@\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+                                \"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-                            \"Dot Rename\": {\n-                                \"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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Dot Rename\",\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@@ -55014,15 +62580,15 @@\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+                                \"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\": \"Environment variables and FlowFile Attributes\",\n                                 \"name\": \"Hostname\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n@@ -55063,57 +62629,47 @@\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n                                 \"name\": \"Key Exchange Algorithms Allowed\",\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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Last Modified Time\",\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\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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+                            \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Password\",\n+                                \"name\": \"Move Destination Directory\",\n                                 \"required\": false,\n-                                \"sensitive\": true\n+                                \"sensitive\": false\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+                            \"Password\": {\n+                                \"description\": \"Password for the user account\",\n+                                \"displayName\": \"Password\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Permissions\",\n+                                \"name\": \"Password\",\n                                 \"required\": false,\n-                                \"sensitive\": false\n+                                \"sensitive\": true\n                             },\n                             \"Port\": {\n                                 \"defaultValue\": \"22\",\n-                                \"description\": \"The port that the remote system is listening on for file transfers\",\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\": \"Environment variables and FlowFile Attributes\",\n                                 \"name\": \"Port\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n@@ -55188,65 +62744,22 @@\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n                                 \"name\": \"Proxy Type\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\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\": \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Remote Group\",\n-                                \"required\": false,\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables 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+                            \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Remote Path\",\n-                                \"required\": false,\n+                                \"name\": \"Remote File\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n                             \"Send Keep Alive On Timeout\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n@@ -55287,24 +62800,14 @@\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n                                 \"name\": \"Strict Host Key Checking\",\n                                 \"required\": true,\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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Temporary Filename\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n                             \"Use Compression\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n@@ -55330,16 +62833,64 @@\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n                                 \"name\": \"Username\",\n                                 \"required\": true,\n                                 \"sensitive\": false\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"fetchfiletransfer-notfound-loglevel\",\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+                                \"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@@ -55348,55 +62899,90 @@\n                                     \"group\": \"org.apache.nifi\",\n                                     \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n                                     \"version\": \"2.0.0-M3\"\n                                 }\n                             }\n                         },\n                         \"seeAlso\": [\n-                            \"org.apache.nifi.processors.standard.GetSFTP\"\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\": \"FlowFiles that are successfully sent will be routed to success\",\n+                                \"description\": \"All FlowFiles that are received are routed to success\",\n                                 \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"FlowFiles that were rejected by the destination system\",\n-                                \"name\": \"reject\"\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\": \"FlowFiles that failed to send to the remote system; failure is usually looped back to this processor\",\n-                                \"name\": \"failure\"\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\": true,\n+                        \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"archive\",\n-                            \"copy\",\n-                            \"egress\",\n+                            \"fetch\",\n                             \"files\",\n-                            \"put\",\n+                            \"get\",\n+                            \"ingest\",\n+                            \"input\",\n                             \"remote\",\n-                            \"sftp\"\n+                            \"retrieve\",\n+                            \"sftp\",\n+                            \"source\"\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.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                         \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\"\n+                        \"version\": \"2.0.0-M3\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"The hostname or IP address from which the file was pulled\",\n+                                \"name\": \"sftp.remote.host\"\n+                            },\n+                            {\n+                                \"description\": \"The port that was used to communicate with the remote SFTP server\",\n+                                \"name\": \"sftp.remote.port\"\n+                            },\n+                            {\n+                                \"description\": \"The name of the remote file that was pulled\",\n+                                \"name\": \"sftp.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-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n@@ -55413,231 +62999,396 @@\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"multiProcessorUseCases\": [],\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+                            \"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\": \"Batch Size\",\n+                                \"name\": \"Attribute Matching Strategy\",\n                                 \"required\": true,\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+                            \"Filter Mode\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Retains only the attributes matching the filter, all other attributes are removed.\",\n+                                        \"displayName\": \"Retain\",\n+                                        \"value\": \"Retain\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Removes the attributes matching the filter, all other attributes are retained.\",\n+                                        \"displayName\": \"Remove\",\n+                                        \"value\": \"Remove\"\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                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"JDBC Connection Pool\",\n+                                \"name\": \"Filter Mode\",\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\": \"2.0.0-M3\"\n-                                }\n+                                \"sensitive\": false\n                             },\n-                            \"Obtain Generated Keys\": {\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\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Filtered Attributes\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\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\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Filtered Attributes Pattern\",\n+                                \"required\": true,\n+                                \"sensitive\": false\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+                        \"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+                        \"useCases\": [\n+                            {\n+                                \"configuration\": \"Set \\\"Filter Mode\\\" to \\\"Retain\\\".\\nSet \\\"Attribute Matching Strategy\\\" to \\\"Use regular expression\\\".\\nSpecify the \\\"Filtered Attributes Pattern\\\", e.g. \\\"my-property|a-prefix[.].*\\\".\\n\",\n+                                \"description\": \"Retain all FlowFile attributes matching a regular expression\",\n+                                \"keywords\": [],\n+                                \"notes\": \"\"\n+                            },\n+                            {\n+                                \"configuration\": \"Set \\\"Filter Mode\\\" to \\\"Remove\\\".\\nSet \\\"Attribute Matching Strategy\\\" to \\\"Enumerate attributes\\\".\\nSpecify the set of \\\"Filtered Attributes\\\" using the delimiter comma ',', e.g. \\\"my-property,other,filename\\\".\\n\",\n+                                \"description\": \"Remove only a specified set of FlowFile attributes\",\n+                                \"keywords\": [],\n+                                \"notes\": \"\"\n+                            }\n+                        ],\n+                        \"version\": \"2.0.0-M3\"\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-standard-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"f2215c6\"\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+                        \"multiProcessorUseCases\": [],\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\": \"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+                                \"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\": \"Obtain Generated Keys\",\n-                                \"required\": false,\n+                                \"name\": \"flatten-json-pretty-print-json\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Support Fragmented Transactions\": {\n+                            \"flatten-json-return-type\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"displayName\": \"flatten\",\n+                                        \"value\": \"flatten\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"displayName\": \"unflatten\",\n+                                        \"value\": \"unflatten\"\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+                                \"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\": \"Support Fragmented Transactions\",\n-                                \"required\": false,\n+                                \"name\": \"flatten-json-return-type\",\n+                                \"required\": true,\n                                 \"sensitive\": false\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+                            \"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\": \"Transaction Timeout\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"flatten-json-separator\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"database-session-autocommit\": {\n+                            \"flatten-mode\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"description\": \"Flattens every objects into a single level json\",\n+                                        \"displayName\": \"normal\",\n+                                        \"value\": \"normal\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\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\": \"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+                                \"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\": \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"putsql-sql-statement\",\n-                                \"required\": false,\n+                                \"name\": \"flatten-mode\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"rollback-on-failure\": {\n+                            \"ignore-reserved-characters\": {\n                                 \"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+                                \"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\": \"rollback-on-failure\",\n+                                \"name\": \"ignore-reserved-characters\",\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+                        \"sideEffectFree\": true,\n+                        \"supportedRelationships\": [\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+                                \"description\": \"Successfully flattened/unflattened files go to this relationship.\",\n+                                \"name\": \"success\"\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+                                \"description\": \"Files that cannot be flattened/unflattened go 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+                        \"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+                        \"useCases\": [],\n+                        \"version\": \"2.0.0-M3\"\n+                    },\n+                    {\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-standard-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"f2215c6\"\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+                        \"multiProcessorUseCases\": [],\n+                        \"primaryNodeOnly\": false,\n                         \"seeAlso\": [\n-                            \"org.apache.nifi.processors.standard.ConvertJSONToSQL\"\n+                            \"org.apache.nifi.processors.standard.JoinEnrichment\"\n                         ],\n-                        \"sideEffectFree\": false,\n+                        \"sideEffectFree\": true,\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-                                \"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\": \"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+                                \"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\": true,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"database\",\n-                            \"insert\",\n-                            \"put\",\n-                            \"rdbms\",\n-                            \"relational\",\n-                            \"sql\",\n-                            \"update\"\n+                            \"enrich\",\n+                            \"fork\",\n+                            \"join\",\n+                            \"record\"\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.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                         \"useCases\": [],\n                         \"version\": \"2.0.0-M3\",\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\": \"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 role to use for enrichment. This will either be ORIGINAL or ENRICHMENT.\",\n+                                \"name\": \"enrichment.role\"\n                             }\n                         ]\n                     },\n                     {\n-                        \"additionalDetails\": false,\n+                        \"additionalDetails\": true,\n                         \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n@@ -55646,237 +63397,158 @@\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                         \"multiProcessorUseCases\": [],\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Batch Size\",\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"Environment variables 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\": \"Environment variables 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\": \"Environment variables 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\": \"Environment variables 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\": \"Environment variables 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+                            \"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                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Port\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"fork-mode\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Protocol\": {\n+                            \"include-parent-fields\": {\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\": \"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                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Protocol\",\n+                                \"name\": \"include-parent-fields\",\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+                            \"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\": \"2.0.0-M3\"\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+                            \"record-writer\": {\n+                                \"description\": \"Specifies the Controller Service to use for writing out the records\",\n+                                \"displayName\": \"Record Writer\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Timeout\",\n-                                \"required\": false,\n-                                \"sensitive\": 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\": \"2.0.0-M3\"\n+                                }\n                             }\n                         },\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.standard.ListenSyslog\",\n-                            \"org.apache.nifi.processors.standard.ParseSyslog\"\n-                        ],\n-                        \"sideEffectFree\": false,\n+                        \"sideEffectFree\": true,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"FlowFiles that are sent successfully to Syslog are sent out this relationship.\",\n-                                \"name\": \"success\"\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                             {\n-                                \"description\": \"FlowFiles that failed to send to Syslog are sent out this relationship.\",\n-                                \"name\": \"failure\"\n+                                \"description\": \"The original FlowFiles will be routed to this relationship\",\n+                                \"name\": \"original\"\n                             },\n                             {\n-                                \"description\": \"FlowFiles that do not form a valid Syslog message are sent out this relationship.\",\n-                                \"name\": \"invalid\"\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\": false,\n-                        \"supportsDynamicProperties\": false,\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": true,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"logs\",\n-                            \"put\",\n-                            \"syslog\",\n-                            \"tcp\",\n-                            \"udp\"\n+                            \"array\",\n+                            \"content\",\n+                            \"event\",\n+                            \"fork\",\n+                            \"record\",\n+                            \"stream\"\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+                        \"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                         \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\"\n+                        \"version\": \"2.0.0-M3\",\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\": \"f2215c6\"\n                         },\n@@ -55884,269 +63556,163 @@\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\": \"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\": \"ENVIRONMENT\",\n+                                \"name\": \"Generated FlowFile attribute name\",\n+                                \"value\": \"Generated FlowFile attribute value\"\n+                            }\n+                        ],\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n                         \"multiProcessorUseCases\": [],\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\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+                            \"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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Character Set\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Batch Size\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Connection Per FlowFile\": {\n+                            \"Data Format\": {\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\": \"Text\",\n+                                        \"value\": \"Text\"\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+                                \"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\": \"Connection Per FlowFile\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Hostname\": {\n-                                \"defaultValue\": \"localhost\",\n-                                \"description\": \"Destination hostname or IP address\",\n-                                \"displayName\": \"Hostname\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Idle Connection Expiration\",\n+                                \"name\": \"Data Format\",\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+                            \"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\": \"Max Size of Socket Send Buffer\",\n+                                \"name\": \"File Size\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Outgoing Message Delimiter\": {\n-                                \"dependencies\": [\n+                            \"Unique FlowFiles\": {\n+                                \"allowableValues\": [\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\": \"Environment variables 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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Port\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Record Reader\": {\n-                                \"dependencies\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"RECORD_ORIENTED\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Transmission Strategy\",\n-                                        \"propertyName\": \"Transmission Strategy\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"description\": \"Specifies the Controller Service to use for reading Records from input FlowFiles\",\n-                                \"displayName\": \"Record Reader\",\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                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Record Reader\",\n+                                \"name\": \"Unique FlowFiles\",\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\": \"2.0.0-M3\"\n-                                }\n+                                \"sensitive\": false\n                             },\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+                            \"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\": \"Record Writer\",\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.serialization.RecordSetWriterFactory\",\n-                                    \"version\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\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+                            \"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\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Timeout\",\n+                                \"name\": \"generate-ff-custom-text\",\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+                            \"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\": \"Transmission Strategy\",\n-                                \"required\": true,\n+                                \"name\": \"mime-type\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             }\n                         },\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 that are sent successfully to the destination are sent out this relationship.\",\n+                                \"description\": \"\",\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+                        \"supportsDynamicProperties\": true,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"egress\",\n-                            \"put\",\n-                            \"remote\",\n-                            \"tcp\"\n+                            \"generate\",\n+                            \"load\",\n+                            \"random\",\n+                            \"test\"\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+                        \"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                         \"useCases\": [],\n                         \"version\": \"2.0.0-M3\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"Count of records transmitted to configured destination address\",\n-                                \"name\": \"record.count.transmitted\"\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-standard-nar\",\n                         \"buildInfo\": {\n@@ -56160,141 +63726,177 @@\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_REQUIRED\",\n+                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n                         \"multiProcessorUseCases\": [],\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Hostname\": {\n-                                \"defaultValue\": \"localhost\",\n-                                \"description\": \"Destination hostname or IP address\",\n-                                \"displayName\": \"Hostname\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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+                            \"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\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Idle Connection Expiration\",\n+                                \"name\": \"null-percentage\",\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+                            \"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\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Max Size of Socket Send Buffer\",\n+                                \"name\": \"nullable-fields\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Port\": {\n-                                \"description\": \"Destination port number\",\n-                                \"displayName\": \"Port\",\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\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Port\",\n+                                \"name\": \"number-of-records\",\n                                 \"required\": true,\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+                            \"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\": \"2.0.0-M3\"\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                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Timeout\",\n+                                \"name\": \"schema-text\",\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+                                \"description\": \"FlowFiles that are successfully created will be routed 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-                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicProperties\": true,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"egress\",\n-                            \"put\",\n-                            \"remote\",\n-                            \"udp\"\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.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+                        \"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                         \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\"\n+                        \"version\": \"2.0.0-M3\",\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                     },\n                     {\n-                        \"additionalDetails\": false,\n+                        \"additionalDetails\": true,\n                         \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\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\": \"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\": \"ENVIRONMENT\",\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_FORBIDDEN\",\n+                        \"inputRequirement\": \"INPUT_ALLOWED\",\n                         \"multiProcessorUseCases\": [],\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                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n@@ -56314,25 +63916,14 @@\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n                                     \"type\": \"org.apache.nifi.dbcp.DBCPService\",\n                                     \"version\": \"2.0.0-M3\"\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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                                 \"displayName\": \"Max Wait Time\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n@@ -56346,38 +63937,16 @@\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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+                                \"description\": \"The name of the database table to be queried.\",\n                                 \"displayName\": \"Table Name\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n                                 \"name\": \"Table Name\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n@@ -56431,259 +64000,165 @@\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"Environment variables 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+                            \"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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"dbf-default-precision\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"gen-table-column-for-val-partitioning\",\n+                                \"required\": false,\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+                            \"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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"dbf-default-scale\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"gen-table-custom-orderby-column\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\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\": \"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+                            \"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\": \"dbf-normalize\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"gen-table-fetch-partition-size\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"dbf-user-logical-types\": {\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\": \"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\": \"dbf-user-logical-types\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"initial-load-strategy\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Loads all existing rows from the database table.\",\n-                                        \"displayName\": \"Start at Beginning\",\n-                                        \"value\": \"Start at Beginning\"\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-                                    }\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+                                \"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\": \"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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"qdbt-max-rows\",\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"qdbt-output-batch-size\",\n+                                \"name\": \"gen-table-output-flowfile-on-zero-results\",\n                                 \"required\": true,\n                                 \"sensitive\": false\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"transaction-isolation-level\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n                             }\n                         },\n                         \"seeAlso\": [\n                             \"org.apache.nifi.processors.standard.ExecuteSQL\",\n-                            \"org.apache.nifi.processors.standard.GenerateTableFetch\"\n+                            \"org.apache.nifi.processors.standard.ListDatabaseTables\",\n+                            \"org.apache.nifi.processors.standard.QueryDatabaseTable\"\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\": \"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                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n                             \"database\",\n+                            \"fetch\",\n+                            \"generate\",\n                             \"jdbc\",\n                             \"query\",\n                             \"select\",\n                             \"sql\"\n                         ],\n                         \"triggerSerially\": true,\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 Environment/System properties 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.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 Environment/System properties.\\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                         \"useCases\": [],\n                         \"version\": \"2.0.0-M3\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"Name of the table being queried\",\n-                                \"name\": \"tablename\"\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 number of rows selected by the query\",\n-                                \"name\": \"querydbtable.row.count\"\n+                                \"description\": \"The name of the database table to be queried.\",\n+                                \"name\": \"generatetablefetch.tableName\"\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+                                \"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\": \"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+                                \"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\": \"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+                                \"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-                                \"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@@ -56693,464 +64168,502 @@\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\": \"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\": \"ENVIRONMENT\",\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-                        \"multiProcessorUseCases\": [\n-                            {\n-                                \"configurations\": [\n+                        \"multiProcessorUseCases\": [],\n+                        \"primaryNodeOnly\": false,\n+                        \"propertyDescriptors\": {\n+                            \"Connection Mode\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"configuration\": \"Configure the \\\"Database Connection Pooling Service\\\" property to specify a Connection Pool that is applicable for interacting with your database.\\n\\nSet the \\\"Catalog\\\" property to the name of the database Catalog;\\nset the \\\"Schema Pattern\\\" property to a Java Regular Expression that matches all database Schemas that should be included; and\\nset the \\\"Table Name Pattern\\\" property to a Java Regular Expression that matches the names of all tables that should be included.\\nIn order to perform an incremental load of all tables, leave the Catalog, Schema Pattern, and Table Name Pattern unset.\\n\\nLeave the RecordWriter property unset.\\n\\nConnect the 'success' relationship to QueryDatabaseTableRecord.\\n\",\n-                                        \"processorClassName\": \"org.apache.nifi.processors.standard.ListDatabaseTables\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Active\",\n+                                        \"value\": \"Active\"\n                                     },\n                                     {\n-                                        \"configuration\": \"Configure the \\\"Database Connection Pooling Service\\\" to the same Connection Pool that was used in ListDatabaseTables.\\nSet the \\\"Database Type\\\" property to the type of database to query, or \\\"Generic\\\" if the database vendor is not listed.\\nSet the \\\"Table Name\\\" property to \\\"${db.table.fullname}\\\"\\nConfigure the \\\"Record Writer\\\" to specify a Record Writer that is appropriate for the desired output format.\\nSet the \\\"Maximum-value Columns\\\" property to a comma-separated list of columns whose values can be used to determine which values are new. For example, this might be set to\\n    an `id` column that is a one-up number, or a `last_modified` column that is a timestamp of when the row was last modified.\\nSet the \\\"Initial Load Strategy\\\" property to \\\"Start at Current Maximum Values\\\".\\nSet the \\\"Fetch Size\\\" to a number that avoids loading too much data into memory on the NiFi side. For example, a value of `1000` will load up to 1,000 rows of data.\\nSet the \\\"Max Rows Per Flow File\\\" to a value that allows efficient processing, such as `1000` or `10000`.\\nSet the \\\"Output Batch Size\\\" property to a value greater than `0`. A smaller value, such as `1` or even `20` will result in lower latency but also slightly lower throughput.\\n    A larger value such as `1000` will result in higher throughput but also higher latency. It is not recommended to set the value larger than `1000` as it can cause significant\\n    memory utilization.\\n\",\n-                                        \"processorClassName\": \"org.apache.nifi.processors.standard.QueryDatabaseTableRecord\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Passive\",\n+                                        \"value\": \"Passive\"\n                                     }\n                                 ],\n-                                \"description\": \"Perform an incremental load of multiple database tables, fetching only new rows as they are added to the tables.\",\n-                                \"keywords\": [\n-                                    \"incremental load\",\n-                                    \"rdbms\",\n-                                    \"jdbc\",\n-                                    \"cdc\",\n-                                    \"database\",\n-                                    \"table\",\n-                                    \"stream\"\n-                                ],\n-                                \"notes\": \"\"\n-                            }\n-                        ],\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+                                \"defaultValue\": \"Passive\",\n+                                \"description\": \"The FTP Connection Mode\",\n+                                \"displayName\": \"Connection Mode\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Columns to Return\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Connection Mode\",\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+                            \"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\": \"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\": \"2.0.0-M3\"\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Fetch Size\",\n+                                \"name\": \"Connection Timeout\",\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+                            \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Max Wait Time\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Data Timeout\",\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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Maximum-value Columns\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Set Auto Commit\": {\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-                                \"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+                                \"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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Set Auto Commit\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Delete Original\",\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"File Filter Regex\",\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+                            \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Table Name\",\n+                                \"name\": \"Hostname\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"db-fetch-db-type\": {\n+                            \"Http Proxy Password\": {\n+                                \"description\": \"Http Proxy Password\",\n+                                \"displayName\": \"Http Proxy Password\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Http Proxy Username\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Ignore Dotted Files\": {\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\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n-                                        \"description\": \"Generates Phoenix compliant SQL\",\n-                                        \"displayName\": \"Phoenix\",\n-                                        \"value\": \"Phoenix\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\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\": \"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\": \"db-fetch-db-type\",\n+                                \"name\": \"Ignore Dotted Files\",\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+                            \"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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"db-fetch-sql-query\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Internal Buffer Size\",\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+                            \"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\": \"Max Selects\",\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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"db-fetch-where-clause\",\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-                            \"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+                            \"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\": \"Environment variables 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\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"dbf-default-precision\",\n-                                \"required\": true,\n+                                \"name\": \"Proxy Host\",\n+                                \"required\": false,\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+                            \"Proxy Port\": {\n+                                \"description\": \"The port of the proxy server\",\n+                                \"displayName\": \"Proxy Port\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"dbf-default-scale\",\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+                                \"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\": \"Environment variables 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-                            \"dbf-user-logical-types\": {\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\": \"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+                                \"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\": \"dbf-user-logical-types\",\n+                                \"name\": \"Search Recursively\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"initial-load-strategy\": {\n+                            \"Transfer Mode\": {\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\": \"Binary\",\n+                                        \"value\": \"Binary\"\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\": \"ASCII\",\n+                                        \"value\": \"ASCII\"\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\": \"Binary\",\n+                                \"description\": \"The FTP Transfer Mode\",\n+                                \"displayName\": \"Transfer Mode\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"initial-load-strategy\",\n-                                \"required\": true,\n+                                \"name\": \"Transfer Mode\",\n+                                \"required\": false,\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+                            \"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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"qdbt-max-frags\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Use Natural Ordering\",\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+                            \"Username\": {\n+                                \"description\": \"Username\",\n+                                \"displayName\": \"Username\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"qdbt-max-rows\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Username\",\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+                            \"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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"qdbt-output-batch-size\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"follow-symlink\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"qdbtr-normalize\": {\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\": \"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+                                \"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\": \"qdbtr-normalize\",\n+                                \"name\": \"ftp-use-utf8\",\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+                            \"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\": \"qdbtr-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\": \"2.0.0-M3\"\n                                 }\n                             }\n                         },\n                         \"seeAlso\": [\n-                            \"org.apache.nifi.processors.standard.ExecuteSQL\",\n-                            \"org.apache.nifi.processors.standard.GenerateTableFetch\"\n+                            \"org.apache.nifi.processors.standard.PutFTP\"\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 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\": true,\n+                        \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"database\",\n-                            \"jdbc\",\n-                            \"query\",\n-                            \"record\",\n-                            \"select\",\n-                            \"sql\"\n+                            \"FTP\",\n+                            \"fetch\",\n+                            \"files\",\n+                            \"get\",\n+                            \"ingest\",\n+                            \"input\",\n+                            \"remote\",\n+                            \"retrieve\",\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 Environment/System properties 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-                        \"useCases\": [\n-                            {\n-                                \"configuration\": \"Configure the \\\"Database Connection Pooling Service\\\" to specify a Connection Pooling Service so that the Processor knows how to connect to the database.\\nSet the \\\"Database Type\\\" property to the type of database to query, or \\\"Generic\\\" if the database vendor is not listed.\\nSet the \\\"Table Name\\\" property to the name of the table to retrieve records from.\\nConfigure the \\\"Record Writer\\\" to specify a Record Writer that is appropriate for the desired output format.\\nSet the \\\"Maximum-value Columns\\\" property to a comma-separated list of columns whose values can be used to determine which values are new. For example, this might be set to\\n    an `id` column that is a one-up number, or a `last_modified` column that is a timestamp of when the row was last modified.\\nSet the \\\"Initial Load Strategy\\\" property to \\\"Start at Beginning\\\".\\nSet the \\\"Fetch Size\\\" to a number that avoids loading too much data into memory on the NiFi side. For example, a value of `1000` will load up to 1,000 rows of data.\\nSet the \\\"Max Rows Per Flow File\\\" to a value that allows efficient processing, such as `1000` or `10000`.\\nSet the \\\"Output Batch Size\\\" property to a value greater than `0`. A smaller value, such as `1` or even `20` will result in lower latency but also slightly lower throughput.\\n    A larger value such as `1000` will result in higher throughput but also higher latency. It is not recommended to set the value larger than `1000` as it can cause significant\\n    memory utilization.\\n\",\n-                                \"description\": \"Retrieve all rows from a database table.\",\n-                                \"keywords\": [\n-                                    \"jdbc\",\n-                                    \"rdbms\",\n-                                    \"cdc\",\n-                                    \"database\",\n-                                    \"table\",\n-                                    \"stream\"\n-                                ],\n-                                \"notes\": \"\"\n-                            },\n-                            {\n-                                \"configuration\": \"Configure the \\\"Database Connection Pooling Service\\\" to specify a Connection Pooling Service so that the Processor knows how to connect to the database.\\nSet the \\\"Database Type\\\" property to the type of database to query, or \\\"Generic\\\" if the database vendor is not listed.\\nSet the \\\"Table Name\\\" property to the name of the table to retrieve records from.\\nConfigure the \\\"Record Writer\\\" to specify a Record Writer that is appropriate for the desired output format.\\nSet the \\\"Maximum-value Columns\\\" property to a comma-separated list of columns whose values can be used to determine which values are new. For example, this might be set to\\n    an `id` column that is a one-up number, or a `last_modified` column that is a timestamp of when the row was last modified.\\nSet the \\\"Initial Load Strategy\\\" property to \\\"Start at Current Maximum Values\\\".\\nSet the \\\"Fetch Size\\\" to a number that avoids loading too much data into memory on the NiFi side. For example, a value of `1000` will load up to 1,000 rows of data.\\nSet the \\\"Max Rows Per Flow File\\\" to a value that allows efficient processing, such as `1000` or `10000`.\\nSet the \\\"Output Batch Size\\\" property to a value greater than `0`. A smaller value, such as `1` or even `20` will result in lower latency but also slightly lower throughput.\\n    A larger value such as `1000` will result in higher throughput but also higher latency. It is not recommended to set the value larger than `1000` as it can cause significant\\n    memory utilization.\\n\",\n-                                \"description\": \"Perform an incremental load of a single database table, fetching only new rows as they are added to the table.\",\n-                                \"keywords\": [\n-                                    \"incremental load\",\n-                                    \"rdbms\",\n-                                    \"jdbc\",\n-                                    \"cdc\",\n-                                    \"database\",\n-                                    \"table\",\n-                                    \"stream\"\n-                                ],\n-                                \"notes\": \"\"\n-                            }\n-                        ],\n+                        \"type\": \"org.apache.nifi.processors.standard.GetFTP\",\n+                        \"typeDescription\": \"Fetches files from an FTP Server and creates FlowFiles from them\",\n+                        \"useCases\": [],\n                         \"version\": \"2.0.0-M3\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"Name of the table being queried\",\n-                                \"name\": \"tablename\"\n+                                \"description\": \"The filename is set to the name of the file on the remote server\",\n+                                \"name\": \"filename\"\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 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\": \"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 date and time that the source file was last modified\",\n+                                \"name\": \"file.lastModifiedTime\"\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 date and time that the file was last accessed. May not work on all file systems\",\n+                                \"name\": \"file.lastAccessTime\"\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 numeric owner id of the source file\",\n+                                \"name\": \"file.owner\"\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 numeric group id of the source file\",\n+                                \"name\": \"file.group\"\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 read/write/execute permissions of the source file\",\n+                                \"name\": \"file.permissions\"\n                             },\n                             {\n-                                \"description\": \"The number of records output by the Record Writer.\",\n-                                \"name\": \"record.count\"\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+                        \"additionalDetails\": false,\n                         \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n@@ -57159,523 +64672,267 @@\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\": \"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+                                \"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-                        \"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+                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n                         \"multiProcessorUseCases\": [],\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"cache-schema\": {\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+                            \"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+                            \"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\": \"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+                                \"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\": \"cache-schema\",\n-                                \"required\": true,\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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"dbf-default-precision\",\n+                                \"name\": \"Ignore Hidden Files\",\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+                            \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"dbf-default-scale\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Input Directory\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"include-zero-record-flowfiles\": {\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\": \"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+                                \"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\": \"include-zero-record-flowfiles\",\n+                                \"name\": \"Keep Source File\",\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+                            \"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\": \"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\": \"2.0.0-M3\"\n-                                }\n+                                \"name\": \"Maximum File Age\",\n+                                \"required\": false,\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+                            \"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\": \"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\": \"2.0.0-M3\"\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-                        ],\n-                        \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": true,\n-                        \"supportsDynamicRelationships\": 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-                        \"useCases\": [\n-                            {\n-                                \"configuration\": \"\\\"Record Reader\\\" should be set to a Record Reader that is appropriate for your data.\\n\\\"Record Writer\\\" should be set to a Record Writer that writes out data in the desired format.\\n\\nOne additional property should be added.\\nThe name of the property should be a short description of the data to keep.\\nIts value is a SQL statement that selects all columns from a table named `FLOW_FILE` for relevant rows.\\nThe WHERE clause selects the data to keep. I.e., it is the exact opposite of what we want to remove.\\nIt is recommended to always quote column names using double-quotes in order to avoid conflicts with SQL keywords.\\nFor example, to remove records where either the name is George OR the age is less than 18, we would add a   property named \\\"adults not george\\\" with a value that selects records where the name is not George AND the age is greater than or equal to 18.   So the value would be `SELECT * FROM FLOWFILE WHERE \\\"name\\\" <> 'George' AND \\\"age\\\" >= 18`\\n\\nAdding this property now gives us a new Relationship whose name is the same as the property name. So, the \\\"adults not george\\\" Relationship should be connected to the next Processor in our flow.\\n\",\n-                                \"description\": \"Filter out records based on the values of the records' fields\",\n-                                \"keywords\": [\n-                                    \"filter out\",\n-                                    \"remove\",\n-                                    \"drop\",\n-                                    \"strip out\",\n-                                    \"record field\",\n-                                    \"sql\"\n-                                ],\n-                                \"notes\": \"\"\n-                            },\n-                            {\n-                                \"configuration\": \"\\\"Record Reader\\\" should be set to a Record Reader that is appropriate for your data.\\n\\\"Record Writer\\\" should be set to a Record Writer that writes out data in the desired format.\\n\\nOne additional property should be added.\\nThe name of the property should be a short description of the data to keep.\\nIts value is a SQL statement that selects all columns from a table named `FLOW_FILE` for relevant rows.\\nThe WHERE clause selects the data to keep.\\nIt is recommended to always quote column names using double-quotes in order to avoid conflicts with SQL keywords.\\nFor example, to keep only records where the person is an adult (aged 18 or older), add a property named \\\"adults\\\"   with a value that is a SQL statement that selects records where the age is at least 18.   So the value would be `SELECT * FROM FLOWFILE WHERE \\\"age\\\" >= 18`\\n\\nAdding this property now gives us a new Relationship whose name is the same as the property name. So, the \\\"adults\\\" Relationship should be connected to the next Processor in our flow.\\n\",\n-                                \"description\": \"Keep only specific records\",\n-                                \"keywords\": [\n-                                    \"keep\",\n-                                    \"filter\",\n-                                    \"retain\",\n-                                    \"select\",\n-                                    \"include\",\n-                                    \"record\",\n-                                    \"sql\"\n-                                ],\n-                                \"notes\": \"\"\n+                                \"name\": \"Maximum File Size\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n                             },\n-                            {\n-                                \"configuration\": \"\\\"Record Reader\\\" should be set to a Record Reader that is appropriate for your data.\\n\\\"Record Writer\\\" should be set to a Record Writer that writes out data in the desired format.\\n\\nOne additional property should be added.\\nThe name of the property should be a short description of the data to keep, such as `relevant fields`.\\nIts value is a SQL statement that selects the desired columns from a table named `FLOW_FILE` for relevant rows.\\nThere is no WHERE clause.\\nIt is recommended to always quote column names using double-quotes in order to avoid conflicts with SQL keywords.\\nFor example, to keep only the `name`, `age`, and `address` fields, add a property named `relevant fields`   with a value of `SELECT \\\"name\\\", \\\"age\\\", \\\"address\\\" FROM FLOWFILE`\\n\\nAdding this property now gives us a new Relationship whose name is the same as the property name. So, the `relevant fields` Relationship should be connected to the next Processor in our flow.\\n\",\n-                                \"description\": \"Keep only specific fields in a a Record, where the names of the fields to keep are known\",\n-                                \"keywords\": [\n-                                    \"keep\",\n-                                    \"filter\",\n-                                    \"retain\",\n-                                    \"select\",\n-                                    \"include\",\n-                                    \"record\",\n-                                    \"fields\",\n-                                    \"sql\"\n-                                ],\n-                                \"notes\": \"\"\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-                            {\n-                                \"configuration\": \"\\\"Record Reader\\\" should be set to a Record Reader that is appropriate for your data.\\n\\\"Record Writer\\\" should be set to a Record Writer that writes out data in the desired format.\\n\\nFor each route that you want to create, add a new property.\\nThe name of the property should be a short description of the data that should be selected for the route.\\nIts value is a SQL statement that selects all columns from a table named `FLOW_FILE`. The WHERE clause selects the data that should be included in the route.\\nIt is recommended to always quote column names using double-quotes in order to avoid conflicts with SQL keywords.\\n\\nA new outbound relationship is created for each property that is added. The name of the relationship is the same as the property name.\\n\\nFor example, to route data based on whether or not it is a large transaction, we would add two properties:\\n`small transaction` would have a value such as `SELECT * FROM FLOWFILE WHERE transactionTotal < 100`\\n`large transaction` would have a value of `SELECT * FROM FLOWFILE WHERE transactionTotal >= 100`\\n\",\n-                                \"description\": \"Route record-oriented data for processing based on its contents\",\n-                                \"keywords\": [\n-                                    \"record\",\n-                                    \"route\",\n-                                    \"conditional processing\",\n-                                    \"field\"\n-                                ],\n-                                \"notes\": \"\"\n-                            }\n-                        ],\n-                        \"version\": \"2.0.0-M3\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"Sets the mime.type attribute to the MIME Type specified by the Record Writer\",\n-                                \"name\": \"mime.type\"\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-                            {\n-                                \"description\": \"The number of records selected by the query\",\n-                                \"name\": \"record.count\"\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-                            {\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\": \"f2215c6\"\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\": \"Any field that matches the RecordPath set as the value will be removed.\",\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"name\": \"A description of the field to remove\",\n-                                \"value\": \"A RecordPath to the field to be removed.\"\n-                            }\n-                        ],\n-                        \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n-                        \"multiProcessorUseCases\": [],\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+                            \"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\": \"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\": \"2.0.0-M3\"\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+                            \"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 or not to pull files from subdirectories\",\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-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n-                                    \"version\": \"2.0.0-M3\"\n-                                }\n+                                \"sensitive\": false\n                             }\n                         },\n+                        \"restricted\": true,\n                         \"seeAlso\": [\n-                            \"org.apache.nifi.processors.standard.UpdateRecord\"\n+                            \"org.apache.nifi.processors.standard.FetchFile\",\n+                            \"org.apache.nifi.processors.standard.PutFile\"\n                         ],\n-                        \"sideEffectFree\": true,\n+                        \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"FlowFiles that are successfully transformed will be routed to this relationship\",\n+                                \"description\": \"All files are routed to success\",\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                         \"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+                            \"files\",\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.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-                        \"useCases\": [\n-                            {\n-                                \"configuration\": \"Configure the Record Reader according to the incoming data format.\\nConfigure the Record Writer according to the desired output format.\\n\\nFor each field that you want to remove, add a single new property to the Processor.\\nThe name of the property can be anything but it's recommended to use a brief description of the field.\\nThe value of the property is a RecordPath that matches the field to remove.\\n\\nFor example, to remove the `name` and `email` fields, add two Properties:\\n`name` = `/name`\\n`email` = `/email`\\n\",\n-                                \"description\": \"Remove one or more fields from a Record, where the names of the fields to remove are known.\",\n-                                \"keywords\": [\n-                                    \"record\",\n-                                    \"field\",\n-                                    \"drop\",\n-                                    \"remove\",\n-                                    \"delete\",\n-                                    \"expunge\",\n-                                    \"recordpath\"\n-                                ],\n-                                \"notes\": \"\"\n-                            }\n-                        ],\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+                        \"useCases\": [],\n                         \"version\": \"2.0.0-M3\",\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-                            }\n-                        ]\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-standard-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"f2215c6\"\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+                                \"description\": \"The filename is set to the name of the file on disk\",\n+                                \"name\": \"filename\"\n+                            },\n                             {\n-                                \"description\": \"Allows users to specify a new name for each field that matches the RecordPath.\",\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"name\": \"A RecordPath that identifies which field(s) to update\",\n-                                \"value\": \"The new name to assign to the Record field\"\n-                            }\n-                        ],\n-                        \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n-                        \"multiProcessorUseCases\": [],\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-                                \"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\": \"2.0.0-M3\"\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-                            \"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\": \"2.0.0-M3\"\n-                                }\n-                            }\n-                        },\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.standard.RemoveRecordField\",\n-                            \"org.apache.nifi.processors.standard.UpdateRecord\"\n-                        ],\n-                        \"sideEffectFree\": true,\n-                        \"supportedRelationships\": [\n                             {\n-                                \"description\": \"FlowFiles that are successfully transformed will be routed to this relationship\",\n-                                \"name\": \"success\"\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\": \"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-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"avro\",\n-                            \"csv\",\n-                            \"field\",\n-                            \"generic\",\n-                            \"json\",\n-                            \"log\",\n-                            \"logs\",\n-                            \"record\",\n-                            \"rename\",\n-                            \"schema\",\n-                            \"update\"\n-                        ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.RenameRecordField\",\n-                        \"typeDescription\": \"Renames one or more fields in each Record of a FlowFile. 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 the new name to assign to the Record Field that matches the RecordPath. The property value may use Expression Language to reference FlowFile attributes as well as the variables `field.name`, `field.value`, `field.type`, and `record.index`\",\n-                        \"useCases\": [\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-                                \"configuration\": \"Configure the 'Record Reader' according to the input format.\\nConfigure the 'Record Writer' according to the desired output format.\\n\\nAdd a property to the Processor such that the name of the property is a RecordPath to identifies the field to rename. The value of the property is the new name of the property.\\n\\nFor example, to rename the `name` field to `full_name`, add a property with a name of `/name` and a value of `full_name`.\\n\\nMany properties can be added following this pattern in order to rename multiple fields.\\n\",\n-                                \"description\": \"Rename a field in each Record to a specific, known name.\",\n-                                \"keywords\": [\n-                                    \"rename\",\n-                                    \"field\",\n-                                    \"static\",\n-                                    \"specific\",\n-                                    \"name\"\n-                                ],\n-                                \"notes\": \"\"\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-                                \"configuration\": \"Configure the 'Record Reader' according to the input format.\\nConfigure the 'Record Writer' according to the desired output format.\\n\\nAdd a property to the Processor such that the name of the property is a RecordPath to identifies the field to rename. The value of the property is an Expression Language expression that can be used to determine the new name of the field.\\n\\nFor example, to rename the `addr` field to whatever value is stored in the `preferred_address_name` attribute, add a property with a name of `/name` and a value of `${preferred_address_name}`.\\n\\nMany properties can be added following this pattern in order to rename multiple fields.\\n\",\n-                                \"description\": \"Rename a field in each Record to a name that is derived from a FlowFile attribute.\",\n-                                \"keywords\": [\n-                                    \"rename\",\n-                                    \"field\",\n-                                    \"expression language\",\n-                                    \"EL\",\n-                                    \"flowfile\",\n-                                    \"attribute\"\n-                                ],\n-                                \"notes\": \"\"\n+                                \"description\": \"The owner of the file. May not work on all file systems\",\n+                                \"name\": \"file.owner\"\n                             },\n                             {\n-                                \"configuration\": \"Configure the 'Record Reader' according to the input format.\\nConfigure the 'Record Writer' according to the desired output format.\\n\\nAdd a property to the Processor such that the name of the property is a RecordPath to identifies the field to rename. The value of the property is an Expression Language expression that references the `field.name` property.\\n\\nFor example, to rename all fields with a prefix of `pre_`, we add a property named `/*` and a value of `pre_${field.name}`. If we would like this to happen recursively, to nested fields as well, we use a property name of `//*` with the value of `pre_${field.name}`.\\n\\nTo make all field names uppercase, we can add a property named `//*` with a value of `${field.name:toUpper()}`.\\n\\nMany properties can be added following this pattern in order to rename multiple fields.\\n\",\n-                                \"description\": \"Rename a field in each Record to a new name that is derived from the current field name.\",\n-                                \"keywords\": [\n-                                    \"rename\",\n-                                    \"field\",\n-                                    \"expression language\",\n-                                    \"EL\",\n-                                    \"field.name\"\n-                                ],\n-                                \"notes\": \"This might be used, for example, to add a prefix or a suffix to some fields, or to transform the name of the field by making it uppercase.\"\n-                            }\n-                        ],\n-                        \"version\": \"2.0.0-M3\",\n-                        \"writesAttributes\": [\n+                                \"description\": \"The group owner of the file. May not work on all file systems\",\n+                                \"name\": \"file.group\"\n+                            },\n                             {\n-                                \"description\": \"This attribute provides the current row index and is only available inside the literal value expression.\",\n-                                \"name\": \"record.index\"\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\": \"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\": false,\n                         \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n@@ -57690,804 +64947,564 @@\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                         \"multiProcessorUseCases\": [],\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+                            \"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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"Character Set\",\n+                                \"name\": \"Connection Timeout\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Evaluation Mode\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Line-by-Line\",\n-                                        \"value\": \"Line-by-Line\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Entire text\",\n-                                        \"value\": \"Entire text\"\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+                            \"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\": \"Evaluation Mode\",\n+                                \"name\": \"Data Timeout\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Line-by-Line Evaluation Mode\": {\n+                            \"Delete Original\": {\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\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"Except-Last-Line\",\n-                                        \"value\": \"Except-Last-Line\"\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\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+                                \"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\": \"Line-by-Line Evaluation Mode\",\n+                                \"name\": \"Delete Original\",\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"File Filter Regex\",\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+                            \"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\": \"Maximum Buffer Size\",\n-                                \"required\": true,\n+                                \"name\": \"Host Key File\",\n+                                \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"SINGLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\"\n+                                    ]\n+                                },\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+                            \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Regular Expression\",\n+                                \"name\": \"Hostname\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Replacement Strategy\": {\n+                            \"Http Proxy Password\": {\n+                                \"description\": \"Http Proxy Password\",\n+                                \"displayName\": \"Http Proxy Password\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Http Proxy Username\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\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+                                \"name\": \"Ignore Dotted Files\",\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+                            \"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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Replacement Value\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Key Algorithms Allowed\",\n+                                \"required\": false,\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+                            \"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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Text to Append\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Key Exchange Algorithms Allowed\",\n+                                \"required\": false,\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+                            \"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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Text to Prepend\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Max Selects\",\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-                        ],\n-                        \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": 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-                            \"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-                        \"useCases\": [\n-                            {\n-                                \"configuration\": \"\\\"Evaluation Mode\\\" = \\\"Line-by-Line\\\"\\n\\\"Replacement Strategy\\\" = \\\"Append\\\"\\n\\n\\\"Replacement Value\\\" is set to whatever text should be appended to the line.\\nFor example, to insert the text `<fin>` at the end of every line, we would set \\\"Replacement Value\\\" to `<fin>`.\\nWe can also use Expression Language. So to insert the filename at the end of every line, we set \\\"Replacement Value\\\" to `${filename}`\\n\",\n-                                \"description\": \"Append text to the end of every line in a FlowFile\",\n-                                \"keywords\": [\n-                                    \"raw text\",\n-                                    \"append\",\n-                                    \"line\"\n-                                ],\n-                                \"notes\": \"\"\n-                            },\n-                            {\n-                                \"configuration\": \"\\\"Evaluation Mode\\\" = \\\"Line-by-Line\\\"\\n\\\"Replacement Strategy\\\" = \\\"Prepend\\\"\\n\\n\\\"Replacement Value\\\" is set to whatever text should be prepended to the line.\\nFor example, to insert the text `<start>` at the beginning of every line, we would set \\\"Replacement Value\\\" to `<start>`.\\nWe can also use Expression Language. So to insert the filename at the beginning of every line, we set \\\"Replacement Value\\\" to `${filename}`\\n\",\n-                                \"description\": \"Prepend text to the beginning of every line in a FlowFile\",\n-                                \"keywords\": [\n-                                    \"raw text\",\n-                                    \"prepend\",\n-                                    \"line\"\n-                                ],\n-                                \"notes\": \"\"\n                             },\n-                            {\n-                                \"configuration\": \"\\\"Evaluation Mode\\\" = \\\"Line-by-Line\\\"\\n\\\"Replacement Strategy\\\" = \\\"Literal Replace\\\"\\n\\\"Search Value\\\" is set to whatever text is in the FlowFile that needs to be replaced.\\n\\\"Replacement Value\\\" is set to the text that should replace the current text.\\n\\nFor example, to replace the word \\\"spider\\\" with \\\"arachnid\\\" we set \\\"Search Value\\\" to `spider` and set \\\"Replacement Value\\\" to `arachnid`.\\n\",\n-                                \"description\": \"Replace every occurrence of a literal string in the FlowFile with a different value\",\n-                                \"keywords\": [\n-                                    \"replace\",\n-                                    \"string\",\n-                                    \"text\",\n-                                    \"literal\"\n-                                ],\n-                                \"notes\": \"\"\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Message Authentication Codes Allowed\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n                             },\n-                            {\n-                                \"configuration\": \"\\\"Evaluation Mode\\\" = \\\"Line-by-Line\\\"\\n\\\"Replacement Strategy\\\" = \\\"Regex Replace\\\"\\n\\\"Search Value\\\" is set to a regular expression that matches the text that should be transformed in a capturing group.\\n\\\"Replacement Value\\\" is set to a NiFi Expression Language expression that references `$1` (in quotes to escape the reference name).\\n\\nFor example, if we wanted to lowercase any occurrence of WOLF, TIGER, or LION, we would use a \\\"Search Value\\\" of `(WOLF|TIGER|LION)` and a \\\"Replacement Value\\\" of `${'$1':toLower()}`.\\nIf we want to replace any identifier with a hash of that identifier, we might use a \\\"Search Value\\\" of `identifier: (.*)` and a \\\"Replacement Value\\\" of `identifier: ${'$1':hash('sha256')}`\\n\",\n-                                \"description\": \"Transform every occurrence of a literal string in a FlowFile\",\n-                                \"keywords\": [\n-                                    \"replace\",\n-                                    \"transform\",\n-                                    \"raw text\"\n-                                ],\n-                                \"notes\": \"\"\n+                            \"Password\": {\n+                                \"description\": \"Password for the user account\",\n+                                \"displayName\": \"Password\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Password\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n                             },\n-                            {\n-                                \"configuration\": \"\\\"Evaluation Mode\\\" = \\\"Entire text\\\"\\n\\\"Replacement Strategy\\\" = \\\"Always Replace\\\"\\n\\n\\\"Replacement Value\\\" is set to the new text that should be written to the FlowFile. This text might include NiFi Expression Language to reference one or more attributes.\\n\",\n-                                \"description\": \"Completely replace the contents of a FlowFile to a specific text\",\n-                                \"keywords\": [\n-                                    \"replace\",\n-                                    \"raw text\"\n-                                ],\n-                                \"notes\": \"\"\n-                            }\n-                        ],\n-                        \"version\": \"2.0.0-M3\"\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-standard-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"f2215c6\"\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-                        \"multiProcessorUseCases\": [],\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+                            \"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\": \"Character Set\",\n-                                \"required\": true,\n+                                \"name\": \"Path Filter Regex\",\n+                                \"required\": false,\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+                            \"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\": \"Mapping File\",\n+                                \"name\": \"Polling Interval\",\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables 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\": \"Environment variables 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\": \"Environment variables 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-                            \"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+                            \"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\": \"Mapping File Refresh Interval\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Proxy Host\",\n+                                \"required\": false,\n                                 \"sensitive\": false\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+                            \"Proxy Port\": {\n+                                \"description\": \"The port of the proxy server\",\n+                                \"displayName\": \"Proxy Port\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Matching Group\",\n-                                \"required\": true,\n+                                \"name\": \"Proxy Port\",\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+                            \"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\": \"Maximum Buffer Size\",\n-                                \"required\": true,\n+                                \"name\": \"Proxy Type\",\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+                            \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Regular Expression\",\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-                        },\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-                        ],\n-                        \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\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-                        \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\"\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-standard-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"f2215c6\"\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-                        \"multiProcessorUseCases\": [],\n-                        \"primaryNodeOnly\": false,\n-                        \"propertyDescriptors\": {\n-                            \"Fail on Non-numerical Overwrite\": {\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 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+                                \"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\": \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"maximum-retries\",\n+                                \"name\": \"Search Recursively\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"penalize-retries\": {\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\": \"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+                                \"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\": \"penalize-retries\",\n+                                \"name\": \"Send Keep Alive On Timeout\",\n                                 \"required\": true,\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+                            \"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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"retry-attribute\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Strict Host Key Checking\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"reuse-mode\": {\n+                            \"Use Compression\": {\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+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\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+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\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+                                \"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\": \"reuse-mode\",\n+                                \"name\": \"Use Compression\",\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-                            {\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-                            {\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-                        \"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-                        \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"User defined retry attribute is updated with the current retry count\",\n-                                \"name\": \"Retry Attribute\"\n                             },\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\": \"f2215c6\"\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\": \"Routes FlowFiles whose attributes match the 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\": \"Expression Language expression that returns a boolean value indicating whether or not the FlowFile should be routed to this Relationship\"\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-                        \"multiProcessorUseCases\": [\n-                            {\n-                                \"configurations\": [\n+                            \"Use Natural Ordering\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"configuration\": \"Choose a RecordReader that is appropriate based on the format of the incoming data.\\nChoose a RecordWriter that writes the data in the desired output format.\\n\\nAdd a single additional property. The name of the property should describe the criteria to route on. The property's value should be a RecordPath that returns `true` if the Record meets the criteria or `false` otherwise. This adds a new attribute to the FlowFile whose name is equal to the property name.\\n\\nConnect the 'success' Relationship to RouteOnAttribute.\\n\",\n-                                        \"processorClassName\": \"org.apache.nifi.processors.standard.PartitionRecord\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n-                                        \"configuration\": \"Set \\\"Routing Strategy\\\" to \\\"Route to Property name\\\"\\n\\nAdd two additional properties. For the first one, the name of the property should describe data that matches the criteria. The value is an Expression Language expression that checks if the attribute added by the PartitionRecord processor has a value of `true`. For example, `${criteria:equals('true')}`.\\nThe second property should have a name that describes data that does not match the criteria. The value is an Expression Language that evaluates to the opposite of the first property value. For example, `${criteria:equals('true'):not()}`.\\n\\nConnect each of the newly created Relationships to the appropriate downstream processors.\\n\",\n-                                        \"processorClassName\": \"org.apache.nifi.processors.standard.RouteOnAttribute\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"description\": \"Route record-oriented data based on whether or not the record's values meet some criteria\",\n-                                \"keywords\": [\n-                                    \"record\",\n-                                    \"route\",\n-                                    \"content\",\n-                                    \"data\"\n-                                ],\n-                                \"notes\": \"\"\n-                            }\n-                        ],\n-                        \"primaryNodeOnly\": false,\n-                        \"propertyDescriptors\": {\n-                            \"Routing Strategy\": {\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\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Username\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"follow-symlink\": {\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-                                    },\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+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\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+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\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+                                \"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\": \"Routing Strategy\",\n+                                \"name\": \"follow-symlink\",\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\": \"2.0.0-M3\"\n+                                }\n                             }\n                         },\n-                        \"sideEffectFree\": true,\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.standard.PutSFTP\"\n+                        ],\n+                        \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"FlowFiles that do not match any user-define expression will be routed here\",\n-                                \"name\": \"unmatched\"\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\": true,\n-                        \"supportsDynamicProperties\": true,\n-                        \"supportsDynamicRelationships\": true,\n+                        \"supportsBatching\": false,\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\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+                            \"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.standard.RouteOnAttribute\",\n-                        \"typeDescription\": \"Routes FlowFiles based on their Attributes using the Attribute Expression Language\",\n-                        \"useCases\": [\n+                        \"type\": \"org.apache.nifi.processors.standard.GetSFTP\",\n+                        \"typeDescription\": \"Fetches files from an SFTP Server and creates FlowFiles from them\",\n+                        \"useCases\": [],\n+                        \"version\": \"2.0.0-M3\",\n+                        \"writesAttributes\": [\n                             {\n-                                \"configuration\": \"Set the \\\"Routing Strategy\\\" property to \\\"Route to Property name\\\".\\nFor each route that a FlowFile might be routed to, add a new property. The name of the property should describe the route.\\nThe value of the property is an Attribute Expression Language expression that returns a boolean value indicating whether or not a given FlowFile will be routed to the associated relationship.\\n\\nFor example, we might route data based on its file extension using the following properties:\\n    - \\\"Routing Strategy\\\" = \\\"Route to Property Name\\\"\\n    - \\\"jpg\\\" = \\\"${filename:endsWith('.jpg')}\\\"\\n    - \\\"png\\\" = \\\"${filename:endsWith('.png')}\\\"\\n    - \\\"pdf\\\" = \\\"${filename:endsWith('.pdf')}\\\"\\n\\nThe Processor will now have 3 relationships: `jpg`, `png`, and `pdf`. Each of these should be connected to the appropriate downstream processor.\\n\",\n-                                \"description\": \"Route data to one or more relationships based on its attributes using the NiFi Expression Language.\",\n-                                \"keywords\": [\n-                                    \"attributes\",\n-                                    \"routing\",\n-                                    \"expression language\"\n-                                ],\n-                                \"notes\": \"\"\n+                                \"description\": \"The filename is set to the name of the file on the remote server\",\n+                                \"name\": \"filename\"\n                             },\n                             {\n-                                \"configuration\": \"Add a new property for each condition that must be satisfied in order to keep the data.\\nIf the data should be kept in the case that any of the provided conditions is met, set the \\\"Routing Strategy\\\" property to \\\"Route to 'matched' if any matches\\\".\\nIf all conditions must be met in order to keep the data, set the \\\"Routing Strategy\\\" property  to \\\"Route to 'matched' if all match\\\".\\n\\nFor example, to keep files whose filename ends with .txt and have a file size of at least 1000 bytes, we will use the following properties:\\n    - \\\"ends_with_txt\\\" = \\\"${filename:endsWith('.txt')}\\\"\\n    - \\\"large_enough\\\" = \\\"${fileSize:ge(1000)}\\n    - \\\"Routing Strategy\\\" = \\\"Route to 'matched' if all match\\\"\\n\\nAuto-terminate the 'unmatched' relationship.\\nConnect the 'matched' relationship to the next processor in the flow.\\n\",\n-                                \"description\": \"Keep data only if its attributes meet some criteria, such as its filename ends with .txt.\",\n-                                \"keywords\": [\n-                                    \"keep\",\n-                                    \"filter\",\n-                                    \"remove\",\n-                                    \"delete\",\n-                                    \"expression language\"\n-                                ],\n-                                \"notes\": \"\"\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-                                \"configuration\": \"Add a new property for each condition that must be satisfied in order to drop the data.\\nIf the data should be dropped in the case that any of the provided conditions is met, set the \\\"Routing Strategy\\\" property to \\\"Route to 'matched' if any matches\\\".\\nIf all conditions must be met in order to drop the data, set the \\\"Routing Strategy\\\" property  to \\\"Route to 'matched' if all match\\\".\\n\\nHere are a couple of examples for configuring the properties:\\n    Example 1 Use Case: Data should be dropped if its \\\"uuid\\\" attribute has an 'a' in it or ends with '0'.\\n      Here, we will use the following properties:\\n        - \\\"has_a\\\" = \\\"${uuid:contains('a')}\\\"\\n        - \\\"ends_with_0\\\" = \\\"${uuid:endsWith('0')}\\n        - \\\"Routing Strategy\\\" = \\\"Route to 'matched' if any matches\\\"\\n    Example 2 Use Case: Data should be dropped if its 'uuid' attribute has an 'a' AND it ends with a '1'.\\n      Here, we will use the following properties:\\n        - \\\"has_a\\\" = \\\"${uuid:contains('a')}\\\"\\n        - \\\"ends_with_1\\\" = \\\"${uuid:endsWith('1')}\\n        - \\\"Routing Strategy\\\" = \\\"Route to 'matched' if all match\\\"\\n\\nAuto-terminate the 'matched' relationship.\\nConnect the 'unmatched' relationship to the next processor in the flow.\\n\",\n-                                \"description\": \"Discard or drop a file based on attributes, such as filename.\",\n-                                \"keywords\": [\n-                                    \"discard\",\n-                                    \"drop\",\n-                                    \"filter\",\n-                                    \"remove\",\n-                                    \"delete\",\n-                                    \"expression language\"\n-                                ],\n-                                \"notes\": \"\"\n-                            }\n-                        ],\n-                        \"version\": \"2.0.0-M3\",\n-                        \"writesAttributes\": [\n+                                \"description\": \"The date and time that the source file was last modified\",\n+                                \"name\": \"file.lastModifiedTime\"\n+                            },\n                             {\n-                                \"description\": \"The relation to which the FlowFile was routed\",\n-                                \"name\": \"RouteOnAttribute.Route\"\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\": false,\n+                        \"additionalDetails\": true,\n                         \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n@@ -58496,1212 +65513,512 @@\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+                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n                         \"multiProcessorUseCases\": [],\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 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\": \"Character Set\",\n-                                \"required\": true,\n+                                \"name\": \"Additional HTTP Methods\",\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+                            \"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                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Content Buffer Size\",\n+                                \"name\": \"Allow DELETE\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Match Requirement\": {\n+                            \"Allow GET\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"content must match exactly\",\n-                                        \"value\": \"content must match exactly\"\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"content must contain match\",\n-                                        \"value\": \"content must contain match\"\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\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-                        ],\n-                        \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": true,\n-                        \"supportsDynamicRelationships\": 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-                        \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\"\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-standard-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"f2215c6\"\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\": \"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-                        \"multiProcessorUseCases\": [],\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+                                \"defaultValue\": \"true\",\n+                                \"description\": \"Allow HTTP GET Method\",\n+                                \"displayName\": \"Allow GET\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Character Set\",\n+                                \"name\": \"Allow GET\",\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+                            \"Allow HEAD\": {\n+                                \"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                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Grouping Regular Expression\",\n-                                \"required\": false,\n+                                \"name\": \"Allow HEAD\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Ignore Case\": {\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\": \"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\": \"Allow HTTP OPTIONS Method\",\n+                                \"displayName\": \"Allow OPTIONS\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Ignore Case\",\n+                                \"name\": \"Allow OPTIONS\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Ignore Leading/Trailing Whitespace\": {\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\": \"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+                                \"description\": \"Allow HTTP POST Method\",\n+                                \"displayName\": \"Allow POST\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Ignore Leading/Trailing Whitespace\",\n+                                \"name\": \"Allow POST\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Matching Strategy\": {\n+                            \"Allow PUT\": {\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+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\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+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"description\": \"Specifies how to evaluate each line of incoming text against the user-defined properties.\",\n-                                \"displayName\": \"Matching Strategy\",\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"Allow HTTP PUT Method\",\n+                                \"displayName\": \"Allow PUT\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Matching Strategy\",\n+                                \"name\": \"Allow PUT\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Routing Strategy\": {\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\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Allowed Paths\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Client Authentication\": {\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+                                        \"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\": \"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\": \"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\": \"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\": \"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\": \"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\": \"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\": \"Routing Strategy\",\n+                                \"name\": \"Client Authentication\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n-                            }\n-                        },\n-                        \"sideEffectFree\": true,\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-                            },\n-                            {\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-                        ],\n-                        \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": true,\n-                        \"supportsDynamicRelationships\": true,\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-                        ],\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-                        \"useCases\": [\n-                            {\n-                                \"configuration\": \"\\\"Routing Strategy\\\" = \\\"Route to each matching Property Name\\\"\\n\\\"Matching Strategy\\\" = \\\"Matches Regular Expression\\\"\\n\\\"Empty Line\\\" = \\\"^$\\\"\\n\\nAuto-terminate the \\\"Empty Line\\\" relationship.\\nConnect the \\\"unmatched\\\" relationship to the next processor in your flow.\\n\",\n-                                \"description\": \"Drop blank or empty lines from the FlowFile's content.\",\n-                                \"keywords\": [\n-                                    \"filter\",\n-                                    \"drop\",\n-                                    \"empty\",\n-                                    \"blank\",\n-                                    \"remove\",\n-                                    \"delete\",\n-                                    \"strip out\",\n-                                    \"lines\",\n-                                    \"text\"\n-                                ],\n-                                \"notes\": \"\"\n                             },\n-                            {\n-                                \"configuration\": \"\\\"Routing Strategy\\\" = \\\"Route to each matching Property Name\\\"\\n\\\"Matching Strategy\\\" = \\\"Satisfies Expression\\\"\\n\\nAn additional property should be added named \\\"Filter Out.\\\" The value should be a NiFi Expression Language Expression that can refer to two variables (in addition to FlowFile attributes): `line`, which is the line of text being evaluated; and `lineNo`, which is the line number in the file (starting with 1). The Expression should return `true` for any line that should be dropped.\\n\\nFor example, to remove any line that starts with a # symbol, we can set \\\"Filter Out\\\" to `${line:startsWith(\\\"#\\\")}`.\\nWe could also remove the first 2 lines of text by setting \\\"Filter Out\\\" to `${lineNo:le(2)}`. Note that we use the `le` function because we want lines numbers less than or equal to `2`, since the line index is 1-based.\\n\\nAuto-terminate the \\\"Filter Out\\\" relationship.\\nConnect the \\\"unmatched\\\" relationship to the next processor in your flow.\\n\",\n-                                \"description\": \"Remove specific lines of text from a file, such as those containing a specific word or having a line length over some threshold.\",\n-                                \"keywords\": [\n-                                    \"filter\",\n-                                    \"drop\",\n-                                    \"empty\",\n-                                    \"blank\",\n-                                    \"remove\",\n-                                    \"delete\",\n-                                    \"strip out\",\n-                                    \"lines\",\n-                                    \"text\",\n-                                    \"expression language\"\n-                                ],\n-                                \"notes\": \"\"\n-                            }\n-                        ],\n-                        \"version\": \"2.0.0-M3\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"The name of the relationship to which the FlowFile was routed.\",\n-                                \"name\": \"RouteText.Route\"\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-                            }\n-                        ]\n-                    },\n-                    {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-standard-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"f2215c6\"\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-                        \"multiProcessorUseCases\": [],\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+                            \"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\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"record-reader\",\n+                                \"name\": \"Default URL 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.serialization.RecordReaderFactory\",\n-                                    \"version\": \"2.0.0-M3\"\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+                            \"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\": \"record-writer\",\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.serialization.RecordSetWriterFactory\",\n+                                    \"type\": \"org.apache.nifi.http.HttpContextMap\",\n                                     \"version\": \"2.0.0-M3\"\n                                 }\n                             },\n-                            \"sample-record-interval\": {\n-                                \"dependencies\": [\n+                            \"HTTP Protocols\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"interval\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Sampling Strategy\",\n-                                        \"propertyName\": \"sample-record-sampling-strategy\"\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-                                \"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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"sample-record-interval\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"sample-record-probability\": {\n+                                \"defaultValue\": \"HTTP_1_1\",\n                                 \"dependencies\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"probabilistic\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Sampling Strategy\",\n-                                        \"propertyName\": \"sample-record-sampling-strategy\"\n+                                        \"propertyDisplayName\": \"SSL Context Service\",\n+                                        \"propertyName\": \"SSL Context Service\"\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+                                \"description\": \"HTTP Protocols supported for Application Layer Protocol Negotiation with TLS\",\n+                                \"displayName\": \"HTTP Protocols\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"sample-record-probability\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"HTTP Protocols\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"sample-record-random-seed\": {\n-                                \"dependencies\": [\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+                            \"Hostname\": {\n+                                \"description\": \"The Hostname to bind to. If not specified, will bind to all hosts\",\n+                                \"displayName\": \"Hostname\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"sample-record-random-seed\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Hostname\",\n                                 \"required\": false,\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"sample-record-range\",\n-                                \"required\": true,\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+                            \"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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"sample-record-reservoir\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Listening Port\",\n                                 \"required\": true,\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+                            \"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\": \"sample-record-sampling-strategy\",\n+                                \"name\": \"Maximum Threads\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n-                            }\n-                        },\n-                        \"sideEffectFree\": true,\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"The FlowFile is routed to this relationship if the sampling completed successfully\",\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-                        ],\n-                        \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": 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-                        ],\n-                        \"triggerSerially\": false,\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-                        \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\",\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\": \"f2215c6\"\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-                        \"multiProcessorUseCases\": [],\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+                            \"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\": \"Attribute Pattern\",\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Dictionary File\",\n-                                \"required\": true,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\"\n-                                    ]\n-                                },\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.RestrictedSSLContextService\",\n+                                    \"version\": \"2.0.0-M3\"\n+                                }\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+                            \"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\": \"Dictionary Filter Pattern\",\n-                                \"required\": false,\n+                                \"name\": \"container-queue-size\",\n+                                \"required\": true,\n                                 \"sensitive\": false\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+                            \"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\": \"Match Criteria\",\n+                                \"name\": \"multipart-read-buffer-size\",\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-                            {\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-                        ],\n-                        \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\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-                        \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\"\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-standard-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"f2215c6\"\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-                        \"multiProcessorUseCases\": [],\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+                            \"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\": \"Dictionary Encoding\",\n+                                \"name\": \"multipart-request-max-size\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Dictionary File\": {\n-                                \"description\": \"The filename of the terms dictionary\",\n-                                \"displayName\": \"Dictionary File\",\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\": \"Dictionary File\",\n-                                \"required\": true,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\"\n-                                    ]\n-                                },\n+                                \"name\": \"parameters-to-attributes\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"sideEffectFree\": true,\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.standard.HandleHttpResponse\"\n+                        ],\n+                        \"sideEffectFree\": false,\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-                                \"description\": \"FlowFiles that match at least one term in the dictionary are routed to this relationship\",\n-                                \"name\": \"matched\"\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\": true,\n+                        \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"aho-corasick\",\n-                            \"byte sequence\",\n-                            \"content\",\n-                            \"dictionary\",\n-                            \"find\",\n-                            \"scan\",\n-                            \"search\"\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.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+                        \"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                         \"useCases\": [],\n                         \"version\": \"2.0.0-M3\",\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\": \"f2215c6\"\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-                        \"multiProcessorUseCases\": [],\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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Segment Size\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            }\n-                        },\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.standard.MergeContent\"\n-                        ],\n-                        \"sideEffectFree\": true,\n-                        \"supportedRelationships\": [\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\": \"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+                                \"description\": \"The MIME Type of the data, according to the HTTP Header \\\"Content-Type\\\"\",\n+                                \"name\": \"mime.type\"\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-                        ],\n-                        \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\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-                        \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\",\n-                        \"writesAttributes\": [\n+                                \"description\": \"The part of the request URL that is considered the Servlet Path\",\n+                                \"name\": \"http.servlet.path\"\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+                                \"description\": \"The part of the request URL that is considered to be the Context Path\",\n+                                \"name\": \"http.context.path\"\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+                                \"description\": \"The HTTP Method that was used for the request, such as GET or POST\",\n+                                \"name\": \"http.method\"\n                             },\n                             {\n-                                \"description\": \"The number of segments generated from the parent FlowFile\",\n-                                \"name\": \"fragment.count\"\n+                                \"description\": \"IP address/hostname of the server\",\n+                                \"name\": \"http.local.name\"\n                             },\n                             {\n-                                \"description\": \"The filename of the parent FlowFile\",\n-                                \"name\": \"segment.original.filename \"\n+                                \"description\": \"Listening port of the server\",\n+                                \"name\": \"http.server.port\"\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\": \"f2215c6\"\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-                        \"multiProcessorUseCases\": [],\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Byte Sequence\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n+                                \"description\": \"The query string portion of the Request URL\",\n+                                \"name\": \"http.query.string\"\n                             },\n-                            \"Byte Sequence Format\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"The Byte Sequence will be interpreted as a hexadecimal representation of bytes\",\n-                                        \"displayName\": \"Hexadecimal\",\n-                                        \"value\": \"Hexadecimal\"\n-                                    },\n-                                    {\n-                                        \"description\": \"The Byte Sequence will be interpreted as UTF-8 Encoded text\",\n-                                        \"displayName\": \"Text\",\n-                                        \"value\": \"Text\"\n-                                    }\n-                                ],\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\": \"Byte Sequence Format\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n+                            {\n+                                \"description\": \"The hostname of the requestor\",\n+                                \"name\": \"http.remote.host\"\n                             },\n-                            \"Byte Sequence Location\": {\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-                                    },\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-                                \"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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Byte Sequence Location\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n+                            {\n+                                \"description\": \"The hostname:port combination of the requestor\",\n+                                \"name\": \"http.remote.addr\"\n                             },\n-                            \"Keep Byte Sequence\": {\n-                                \"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-                                \"dynamic\": false,\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 Splits will be routed to the splits relationship\",\n-                                \"name\": \"splits\"\n+                                \"description\": \"The username of the requestor\",\n+                                \"name\": \"http.remote.user\"\n                             },\n                             {\n-                                \"description\": \"The original file\",\n-                                \"name\": \"original\"\n-                            }\n-                        ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"systemResourceConsiderations\": [\n+                                \"description\": \"The protocol used to communicate\",\n+                                \"name\": \"http.protocol\"\n+                            },\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-                        ],\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-                        \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\",\n-                        \"writesAttributes\": [\n+                                \"description\": \"The full Request URL\",\n+                                \"name\": \"http.request.uri\"\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 type of HTTP Authorization used\",\n+                                \"name\": \"http.auth.type\"\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 name of the authenticated user making the request\",\n+                                \"name\": \"http.principal.name\"\n                             },\n                             {\n-                                \"description\": \"The number of split FlowFiles generated from the parent FlowFile\",\n-                                \"name\": \"fragment.count\"\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\": \"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\": \"f2215c6\"\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-                        \"multiProcessorUseCases\": [],\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"JsonPath Expression\",\n-                                \"required\": true,\n-                                \"sensitive\": false\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-                            \"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+                                \"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-                            \"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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Null Value Representation\",\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 JSON or the specified path does not exist), it will be routed to this relationship\",\n-                                \"name\": \"failure\"\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\": \"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\": \"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\": \"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-                        ],\n-                        \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"systemResourceConsiderations\": [\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\": \"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-                        ],\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-                        \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\",\n-                        \"writesAttributes\": [\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\": \"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\": \"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\": \"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\": \"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\": \"The number of split FlowFiles generated from the parent FlowFile\",\n-                                \"name\": \"fragment.count\"\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\": \"The filename of the parent FlowFile\",\n-                                \"name\": \"segment.original.filename \"\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\": false,\n+                        \"additionalDetails\": true,\n                         \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n@@ -59710,133 +66027,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_REQUIRED\",\n                         \"multiProcessorUseCases\": [],\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+                            \"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\": \"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\": \"2.0.0-M3\"\n-                                }\n+                                \"name\": \"Attributes to add to the HTTP Response (Regex)\",\n+                                \"required\": false,\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+                            \"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\": \"Record Writer\",\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.serialization.RecordSetWriterFactory\",\n+                                    \"type\": \"org.apache.nifi.http.HttpContextMap\",\n                                     \"version\": \"2.0.0-M3\"\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+                            \"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\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Records Per Split\",\n+                                \"name\": \"HTTP Status Code\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"sideEffectFree\": true,\n-                        \"supportedRelationships\": [\n+                        \"readsAttributes\": [\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\": \"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\": \"The individual 'segments' of the original FlowFile will be routed to this relationship.\",\n-                                \"name\": \"splits\"\n+                                \"description\": \"Value of the URI requested by the client. Used for provenance event.\",\n+                                \"name\": \"http.request.uri\"\n                             },\n                             {\n-                                \"description\": \"Upon successfully splitting an input FlowFile, the original FlowFile will be sent to this relationship.\",\n-                                \"name\": \"original\"\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\": true,\n-                        \"supportsDynamicProperties\": false,\n+                        \"supportsBatching\": false,\n+                        \"supportsDynamicProperties\": true,\n                         \"supportsDynamicRelationships\": 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+                            \"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.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.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                         \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\",\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-                            },\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+                        \"version\": \"2.0.0-M3\"\n                     },\n                     {\n-                        \"additionalDetails\": false,\n+                        \"additionalDetails\": true,\n                         \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n@@ -59850,146 +66164,150 @@\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"multiProcessorUseCases\": [],\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+                            \"config-body\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"Replace\",\n+                                            \"Merge\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Config Strategy\",\n+                                        \"propertyName\": \"config-strategy\"\n+                                    }\n+                                ],\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\": \"Header Line Count\",\n-                                \"required\": true,\n+                                \"name\": \"config-body\",\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+                            \"config-file\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"Replace\",\n+                                            \"Merge\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Config Strategy\",\n+                                        \"propertyName\": \"config-strategy\"\n+                                    }\n+                                ],\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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Header Line Marker Characters\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"config-file\",\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+                            \"config-strategy\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Use default NiFi MIME Types.\",\n+                                        \"displayName\": \"Preset\",\n+                                        \"value\": \"Preset\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Use config MIME Types only.\",\n+                                        \"displayName\": \"Replace\",\n+                                        \"value\": \"Replace\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Use config together with default NiFi MIME Types.\",\n+                                        \"displayName\": \"Merge\",\n+                                        \"value\": \"Merge\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"Preset\",\n+                                \"description\": \"Select the loading strategy for MIME Type configuration to be used.\",\n+                                \"displayName\": \"Config Strategy\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Line Split Count\",\n+                                \"name\": \"config-strategy\",\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+                            \"use-filename-in-detection\": {\n                                 \"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 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+                                \"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\": \"Remove Trailing Newlines\",\n+                                \"name\": \"use-filename-in-detection\",\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-                            {\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+                                \"description\": \"All FlowFiles are routed to success\",\n+                                \"name\": \"success\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\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+                            \"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.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+                        \"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.\",\n                         \"useCases\": [],\n                         \"version\": \"2.0.0-M3\",\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+                                \"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\": \"The number of split FlowFiles generated from the parent FlowFile\",\n-                                \"name\": \"fragment.count\"\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\": \"The filename of the parent FlowFile\",\n-                                \"name\": \"segment.original.filename \"\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-standard-nar\",\n                         \"buildInfo\": {\n@@ -60003,570 +66321,769 @@\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                         \"multiProcessorUseCases\": [],\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+                            \"Connection Timeout\": {\n+                                \"defaultValue\": \"5 secs\",\n+                                \"description\": \"Maximum time to wait for initial socket connection to the HTTP URL.\",\n+                                \"displayName\": \"Connection Timeout\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Split Depth\",\n+                                \"name\": \"Connection Timeout\",\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-                            {\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-                        ],\n-                        \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\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-                        ],\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-                        \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\",\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+                            \"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\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"HTTP Method\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             },\n-                            {\n-                                \"description\": \"The number of split FlowFiles generated from the parent FlowFile\",\n-                                \"name\": \"fragment.count\"\n+                            \"HTTP 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\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"HTTP URL\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             },\n-                            {\n-                                \"description\": \"The filename of the parent FlowFile\",\n-                                \"name\": \"segment.original.filename \"\n-                            }\n-                        ]\n-                    },\n-                    {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-standard-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"f2215c6\"\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-                            {\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-                        \"multiProcessorUseCases\": [],\n-                        \"primaryNodeOnly\": false,\n-                        \"propertyDescriptors\": {\n-                            \"File Location\": {\n+                            \"HTTP/2 Disabled\": {\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\": \"\",\n+                                        \"displayName\": \"True\",\n+                                        \"value\": \"True\"\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\": \"\",\n+                                        \"displayName\": \"False\",\n+                                        \"value\": \"False\"\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\": \"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\": \"File Location\",\n+                                \"name\": \"HTTP/2 Disabled\",\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+                            \"Request Body 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+                                \"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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"File to Tail\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Request Body Enabled\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Initial Start Position\": {\n+                            \"Request Chunked Transfer-Encoding Enabled\": {\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+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\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+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"false\",\n+                                \"dependencies\": [\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+                                        \"dependentValues\": [\n+                                            \"POST\",\n+                                            \"PATCH\",\n+                                            \"PUT\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"HTTP Method\",\n+                                        \"propertyName\": \"HTTP Method\"\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+                                \"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\": \"Initial Start Position\",\n+                                \"name\": \"Request Chunked Transfer-Encoding Enabled\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Line Start Pattern\": {\n+                            \"Request 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-                                            \"Single file\"\n+                                            \"POST\",\n+                                            \"PATCH\",\n+                                            \"PUT\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Tailing mode\",\n-                                        \"propertyName\": \"tail-mode\"\n+                                        \"propertyDisplayName\": \"HTTP Method\",\n+                                        \"propertyName\": \"HTTP Method\"\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+                                \"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\": \"Line Start Pattern\",\n-                                \"required\": false,\n+                                \"name\": \"Request Content-Encoding\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Max Buffer Size\": {\n-                                \"defaultValue\": \"64 KB\",\n+                            \"Request Content-Type\": {\n+                                \"defaultValue\": \"${mime.type}\",\n                                 \"dependencies\": [\n                                     {\n-                                        \"propertyDisplayName\": \"Line Start Pattern\",\n-                                        \"propertyName\": \"Line Start Pattern\"\n+                                        \"dependentValues\": [\n+                                            \"POST\",\n+                                            \"PATCH\",\n+                                            \"PUT\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"HTTP Method\",\n+                                        \"propertyName\": \"HTTP Method\"\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+                                \"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\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Request Content-Type\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Request Date Header 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\": \"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\": \"Max Buffer Size\",\n+                                \"name\": \"Request Date Header Enabled\",\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+                            \"Request Digest Authentication 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\": \"false\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"propertyDisplayName\": \"Request Username\",\n+                                        \"propertyName\": \"Request 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\": \"Post-Rollover Tail Period\",\n+                                \"name\": \"Request Digest Authentication Enabled\",\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+                            \"Request Failure Penalization 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\": \"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\": \"Rolling Filename Pattern\",\n+                                \"name\": \"Request Failure Penalization Enabled\",\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+                            \"Request Header Attributes Pattern\": {\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\": \"pre-allocated-buffer-size\",\n-                                \"required\": true,\n+                                \"name\": \"Request Header Attributes Pattern\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"reread-on-nul\": {\n+                            \"Request Multipart Form-Data Filename 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\": \"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+                                \"defaultValue\": \"true\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"propertyDisplayName\": \"Request Multipart Form-Data Name\",\n+                                        \"propertyName\": \"Request Multipart Form-Data 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\": \"reread-on-nul\",\n+                                \"name\": \"Request Multipart Form-Data Filename Enabled\",\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+                            \"Request Multipart Form-Data Name\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"true\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Request Body Enabled\",\n+                                        \"propertyName\": \"Request Body Enabled\"\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"tail-base-directory\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Request Multipart Form-Data Name\",\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+                            \"Request 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\": \"tail-mode\",\n-                                \"required\": true,\n+                                \"name\": \"Request 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\": \"2.0.0-M3\"\n+                                }\n+                            },\n+                            \"Request 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\": \"Request Password\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n+                            },\n+                            \"Request User-Agent\": {\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\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Request User-Agent\",\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+                            \"Request 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\": \"tailfile-lookup-frequency\",\n+                                \"name\": \"Request Username\",\n                                 \"required\": false,\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+                            \"Response Body Attribute Name\": {\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\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Response Body Attribute Name\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Response Body Attribute Size\": {\n+                                \"defaultValue\": \"256\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"propertyDisplayName\": \"Response Body Attribute Name\",\n+                                        \"propertyName\": \"Response Body Attribute Name\"\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\": \"tailfile-maximum-age\",\n+                                \"name\": \"Response Body Attribute Size\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"tailfile-recursive-lookup\": {\n+                            \"Response Body Ignored\": {\n                                 \"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+                                \"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\": \"tailfile-recursive-lookup\",\n+                                \"name\": \"Response Body Ignored\",\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-                                \"LOCAL\",\n-                                \"CLUSTER\"\n-                            ]\n-                        },\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-                        ],\n-                        \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"file\",\n-                            \"log\",\n-                            \"source\",\n-                            \"tail\",\n-                            \"text\"\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-                        \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\",\n-                        \"writesAttributes\": [\n-                            {\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\": \"f2215c6\"\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 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-                        \"multiProcessorUseCases\": [],\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+                            },\n+                            \"Response Cache 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\": \"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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"XSLT file name\",\n-                                \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\"\n-                                    ]\n-                                },\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Response Cache Enabled\",\n+                                \"required\": true,\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+                            \"Response Cache Size\": {\n+                                \"defaultValue\": \"10MB\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"true\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Response Cache Enabled\",\n+                                        \"propertyName\": \"Response Cache Enabled\"\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\": \"cache-size\",\n+                                \"name\": \"Response Cache Size\",\n                                 \"required\": true,\n                                 \"sensitive\": false\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+                            \"Response 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\": \"cache-ttl-after-last-access\",\n+                                \"name\": \"Response Cookie Strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"indent-output\": {\n+                            \"Response FlowFile 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\": \"Response FlowFile Naming Strategy\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Response Generation Required\": {\n                                 \"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 indent the output.\",\n-                                \"displayName\": \"Indent\",\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\": \"indent-output\",\n-                                \"required\": true,\n+                                \"name\": \"Response Generation Required\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"secure-processing\": {\n+                            \"Response Header Request Attributes 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 or not to mitigate various XML-related attacks like XXE (XML External Entity) attacks.\",\n-                                \"displayName\": \"Secure processing\",\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\": \"secure-processing\",\n+                                \"name\": \"Response Header Request Attributes Enabled\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Response Redirects 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\": \"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\": \"Response Redirects Enabled\",\n                                 \"required\": true,\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+                            \"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\": \"xslt-controller\",\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.lookup.StringLookupService\",\n+                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n                                     \"version\": \"2.0.0-M3\"\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+                            \"Socket 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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"xslt-controller-key\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Socket Idle Connections\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Socket 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\": \"Socket Idle Timeout\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Socket 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\": \"Socket Read Timeout\",\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Socket Write 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+                                \"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\": \"2.0.0-M3\"\n+                                }\n                             }\n                         },\n-                        \"sideEffectFree\": true,\n+                        \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"The FlowFile with transformed content will be routed to this relationship\",\n-                                \"name\": \"success\"\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\": \"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+                                \"description\": \"Response FlowFiles transferred when receiving HTTP responses with a status code between 200 and 299.\",\n+                                \"name\": \"Response\"\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 socket communication errors.\",\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                         ],\n                         \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": true,\n                         \"supportsDynamicRelationships\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"supportsSensitiveDynamicProperties\": true,\n                         \"tags\": [\n-                            \"transform\",\n-                            \"xml\",\n-                            \"xslt\"\n+                            \"client\",\n+                            \"http\",\n+                            \"https\",\n+                            \"rest\"\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.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                         \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\"\n+                        \"version\": \"2.0.0-M3\",\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                     },\n                     {\n-                        \"additionalDetails\": false,\n+                        \"additionalDetails\": true,\n                         \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n@@ -60580,231 +67097,256 @@\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"multiProcessorUseCases\": [],\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+                            \"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\": \"File Filter\",\n+                                \"name\": \"Enrichment 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\": \"2.0.0-M3\"\n+                                }\n                             },\n-                            \"Filename Character Set\": {\n-                                \"defaultValue\": \"UTF-8\",\n+                            \"Insertion Record Path\": {\n+                                \"defaultValue\": \"/\",\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"zip\",\n-                                            \"use mime.type attribute\"\n+                                            \"Insert Enrichment Fields\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Packaging Format\",\n-                                        \"propertyName\": \"Packaging Format\"\n+                                        \"propertyDisplayName\": \"Join Strategy\",\n+                                        \"propertyName\": \"Join Strategy\"\n                                     }\n                                 ],\n-                                \"description\": \"If supplied this character set will be supplied to the Zip utility to attempt to decode filenames using the specific character set. If not specified the default platform character set will be used. This is useful if a Zip was created with a different character set than the platform default and the zip uses non standard values to specify.\",\n-                                \"displayName\": \"Filename Character Set\",\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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Filename Character Set\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Insertion Record Path\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Packaging Format\": {\n+                            \"Join Strategy\": {\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+                                        \"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\": \"flowfile-stream-v2\",\n-                                        \"value\": \"flowfile-stream-v2\"\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\": \"\",\n-                                        \"displayName\": \"flowfile-tar-v1\",\n-                                        \"value\": \"flowfile-tar-v1\"\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-                                \"defaultValue\": \"use mime.type attribute\",\n-                                \"description\": \"The Packaging Format used to create the file\",\n-                                \"displayName\": \"Packaging Format\",\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\": \"Packaging Format\",\n+                                \"name\": \"Join Strategy\",\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+                            \"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\": \"Password\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n+                                \"name\": \"Maximum number of Bins\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             },\n-                            \"allow-stored-entries-wdd\": {\n-                                \"allowableValues\": [\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\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\n+                                }\n+                            },\n+                            \"SQL\": {\n+                                \"defaultValue\": \"SELECT original.*, enrichment.* \\nFROM original \\nLEFT OUTER JOIN enrichment \\nON original.id = enrichment.id\",\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\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\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"SQL\",\n+                                \"required\": true,\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Timeout\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"dbf-default-precision\": {\n+                                \"defaultValue\": \"10\",\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"dependentValues\": [\n+                                            \"SQL\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Join Strategy\",\n+                                        \"propertyName\": \"Join Strategy\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"false\",\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\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"dbf-default-precision\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"dbf-default-scale\": {\n+                                \"defaultValue\": \"0\",\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"zip\"\n+                                            \"SQL\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Packaging Format\",\n-                                        \"propertyName\": \"Packaging Format\"\n+                                        \"propertyDisplayName\": \"Join Strategy\",\n+                                        \"propertyName\": \"Join Strategy\"\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+                                \"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\": \"allow-stored-entries-wdd\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"dbf-default-scale\",\n+                                \"required\": false,\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+                            \"org.apache.nifi.processors.standard.ForkEnrichment\"\n                         ],\n                         \"sideEffectFree\": true,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"The original FlowFile is sent to this relationship after it has been successfully unpacked\",\n-                                \"name\": \"original\"\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 original FlowFile is sent to this relationship when it cannot be unpacked for some reason\",\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\": \"Unpacked FlowFiles are sent to this relationship\",\n-                                \"name\": \"success\"\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\": true,\n+                        \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": 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-                            \"Unpack\",\n-                            \"archive\",\n-                            \"flowfile-stream\",\n-                            \"flowfile-stream-v3\",\n-                            \"tar\",\n-                            \"un-merge\",\n-                            \"zip\"\n+                            \"combine\",\n+                            \"enrichment\",\n+                            \"fork\",\n+                            \"join\",\n+                            \"merge\",\n+                            \"record\",\n+                            \"recordpath\",\n+                            \"sql\",\n+                            \"streams\",\n+                            \"wrap\"\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-                        \"useCases\": [\n-                            {\n-                                \"configuration\": \"Set \\\"Packaging Format\\\" value to \\\"zip\\\" or \\\"use mime.type attribute\\\".\\nSet \\\"Filename Character Set\\\" value to \\\"Cp437\\\" or \\\"IBM437\\\".\\n\",\n-                                \"description\": \"Unpack Zip containing filenames with special characters, created on Windows with filename charset 'Cp437' or 'IBM437'.\",\n-                                \"keywords\": [],\n-                                \"notes\": \"\"\n-                            }\n-                        ],\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+                        \"useCases\": [],\n                         \"version\": \"2.0.0-M3\",\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\": \"Sets the mime.type attribute to the MIME Type specified by the Record Writer\",\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+                                \"description\": \"The number of records in the FlowFile\",\n+                                \"name\": \"record.count\"\n                             }\n                         ]\n                     },\n                     {\n                         \"additionalDetails\": false,\n                         \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n@@ -60814,643 +67356,814 @@\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-                        \"multiProcessorUseCases\": [],\n-                        \"primaryNodeOnly\": false,\n+                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n+                        \"multiProcessorUseCases\": [\n+                            {\n+                                \"configurations\": [\n+                                    {\n+                                        \"configuration\": \"Configure the \\\"Database Connection Pooling Service\\\" property to specify a Connection Pool that is applicable for interacting with your database.\\nLeave the RecordWriter property unset.\\n\\nSet the \\\"Catalog\\\" property to the name of the database Catalog; leave it empty to include all catalogs.\\nSet the \\\"Schema Pattern\\\" property to a Java Regular Expression that matches all database Schemas that should be included; leave it empty to include all Schemas.\\nSet the \\\"Table Name Pattern\\\" property to a Java Regular Expression that matches the names of all tables that should be included; leave it empty to include all Tables.\\n\\nConnect the \\\"success\\\" relationship to GenerateTableFetch.\\n\",\n+                                        \"processorClassName\": \"org.apache.nifi.processors.standard.ListDatabaseTables\"\n+                                    },\n+                                    {\n+                                        \"configuration\": \"Configure the \\\"Database Connection Pooling Service\\\" property to specify the same Connection Pool that was used in ListDatabaseTables.\\nSet the \\\"Database Type\\\" property to match the appropriate value for your RDBMS vendor.\\nSet \\\"Table Name\\\" to `${db.table.fullname}`\\nLeave the RecordWriter property unset.\\n\\nConnect the \\\"success\\\" relationship to ExecuteSQLRecord.\\n\",\n+                                        \"processorClassName\": \"org.apache.nifi.processors.standard.GenerateTableFetch\"\n+                                    },\n+                                    {\n+                                        \"configuration\": \"Configure the \\\"Database Connection Pooling Service\\\" property to specify the same Connection Pool that was used in ListDatabaseTables.\\nConfigure the \\\"Record Writer\\\" property to specify a Record Writer that is appropriate for the desired output data type.\\nLeave the \\\"SQL select query\\\" unset.\\n\\nConnect the \\\"success\\\" relationship to the next Processor in the flow.\\n\",\n+                                        \"processorClassName\": \"org.apache.nifi.processors.standard.ExecuteSQLRecord\"\n+                                    }\n+                                ],\n+                                \"description\": \"Perform a full load of a database, retrieving all rows from all tables, or a specific set of tables.\",\n+                                \"keywords\": [\n+                                    \"full load\",\n+                                    \"rdbms\",\n+                                    \"jdbc\",\n+                                    \"database\"\n+                                ],\n+                                \"notes\": \"\"\n+                            }\n+                        ],\n+                        \"primaryNodeOnly\": true,\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+                            \"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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"counter-name\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"list-db-include-count\",\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+                            \"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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"delta\",\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\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.dbcp.DBCPService\",\n+                                    \"version\": \"2.0.0-M3\"\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"list-db-tables-types\",\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\": \"2.0.0-M3\"\n+                                }\n                             }\n                         },\n-                        \"readsAttributes\": [\n-                            {\n-                                \"description\": \"The name of the counter to update/get.\",\n-                                \"name\": \"counterName\"\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\": \"Counter was updated/retrieved\",\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                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"counter\",\n-                            \"debug\",\n-                            \"instrumentation\"\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.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+                        \"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                         \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\"\n+                        \"version\": \"2.0.0-M3\",\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+                        \"additionalDetails\": true,\n                         \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\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+                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n                         \"multiProcessorUseCases\": [],\n-                        \"primaryNodeOnly\": false,\n+                        \"primaryNodeOnly\": true,\n                         \"propertyDescriptors\": {\n-                            \"db-type\": {\n+                            \"Connection Mode\": {\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\": \"Active\",\n+                                        \"value\": \"Active\"\n                                     },\n                                     {\n-                                        \"description\": \"Generates Phoenix compliant SQL\",\n-                                        \"displayName\": \"Phoenix\",\n-                                        \"value\": \"Phoenix\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Passive\",\n+                                        \"value\": \"Passive\"\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\": \"Passive\",\n+                                \"description\": \"The FTP Connection Mode\",\n+                                \"displayName\": \"Connection Mode\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"db-type\",\n+                                \"name\": \"Connection Mode\",\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+                            \"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\": \"record-reader\",\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+                            \"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.serialization.RecordReaderFactory\",\n+                                    \"type\": \"org.apache.nifi.distributed.cache.client.DistributedMapCacheClient\",\n                                     \"version\": \"2.0.0-M3\"\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+                            \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"updatedatabasetable-catalog-name\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"File Filter Regex\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"updatedatabasetable-create-table\": {\n+                            \"Hostname\": {\n+                                \"description\": \"The fully qualified hostname or IP address of the remote system\",\n+                                \"displayName\": \"Hostname\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Http Proxy Username\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Ignore Dotted Files\": {\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\": \"true\",\n+                                        \"value\": \"true\"\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+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\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+                                \"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\": \"updatedatabasetable-create-table\",\n+                                \"name\": \"Ignore Dotted Files\",\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+                            \"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\": \"updatedatabasetable-dbcp-service\",\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\": \"Environment variables 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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Port\",\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\": \"2.0.0-M3\"\n-                                }\n+                                \"sensitive\": false\n                             },\n-                            \"updatedatabasetable-primary-keys\": {\n-                                \"dependencies\": [\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Proxy Port\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Proxy Type\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"Create If Not Exists\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Create Table Strategy\",\n-                                        \"propertyName\": \"updatedatabasetable-create-table\"\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-                                \"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+                                \"defaultValue\": \"DIRECT\",\n+                                \"description\": \"Proxy type used for file transfers\",\n+                                \"displayName\": \"Proxy Type\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"updatedatabasetable-primary-keys\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Proxy Type\",\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+                            \"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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"updatedatabasetable-query-timeout\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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-                            \"updatedatabasetable-quoted-column-identifiers\": {\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\": \"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+                                \"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\": \"updatedatabasetable-quoted-column-identifiers\",\n-                                \"required\": false,\n+                                \"name\": \"Search Recursively\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"updatedatabasetable-quoted-table-identifiers\": {\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\": \"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+                                \"defaultValue\": \"Binary\",\n+                                \"description\": \"The FTP Transfer Mode\",\n+                                \"displayName\": \"Transfer Mode\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"updatedatabasetable-quoted-table-identifiers\",\n+                                \"name\": \"Transfer Mode\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"updatedatabasetable-record-writer\": {\n-                                \"dependencies\": [\n+                            \"Username\": {\n+                                \"description\": \"Username\",\n+                                \"displayName\": \"Username\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Username\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"et-initial-listing-target\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"true\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Update Field Names\",\n-                                        \"propertyName\": \"updatedatabasetable-update-field-names\"\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-                                \"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+                                \"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\": \"updatedatabasetable-record-writer\",\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.serialization.RecordSetWriterFactory\",\n+                                    \"type\": \"org.apache.nifi.distributed.cache.client.DistributedMapCacheClient\",\n                                     \"version\": \"2.0.0-M3\"\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+                            \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"updatedatabasetable-schema-name\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"et-time-window\",\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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"updatedatabasetable-table-name\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"updatedatabasetable-translate-field-names\": {\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\": \"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\": \"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\": \"updatedatabasetable-translate-field-names\",\n+                                \"name\": \"follow-symlink\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"updatedatabasetable-update-field-names\": {\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\": \"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+                                \"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\": \"updatedatabasetable-update-field-names\",\n+                                \"name\": \"ftp-use-utf8\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n-                            }\n-                        },\n-                        \"sideEffectFree\": false,\n-                        \"supportedRelationships\": [\n-                            {\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-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\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.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-                        \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\",\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-                                \"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-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-standard-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"f2215c6\"\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 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-                        \"multiProcessorUseCases\": [],\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+                            \"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\": \"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: 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.serialization.RecordReaderFactory\",\n+                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n                                     \"version\": \"2.0.0-M3\"\n                                 }\n                             },\n-                            \"Record Writer\": {\n-                                \"description\": \"Specifies the Controller Service to use for writing out the records\",\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\": 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.RecordSetWriterFactory\",\n                                     \"version\": \"2.0.0-M3\"\n                                 }\n                             },\n-                            \"Replacement Value Strategy\": {\n+                            \"target-system-timestamp-precision\": {\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+                                        \"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\": \"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+                                        \"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\": \"literal-value\",\n-                                \"description\": \"Specifies how to interpret the configured replacement values\",\n-                                \"displayName\": \"Replacement Value Strategy\",\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\": \"Replacement Value Strategy\",\n+                                \"name\": \"target-system-timestamp-precision\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n                         \"seeAlso\": [\n-                            \"org.apache.nifi.processors.standard.ConvertRecord\"\n+                            \"org.apache.nifi.processors.standard.FetchFTP\",\n+                            \"org.apache.nifi.processors.standard.GetFTP\",\n+                            \"org.apache.nifi.processors.standard.PutFTP\"\n                         ],\n-                        \"sideEffectFree\": true,\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 that are successfully transformed 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 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                         \"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+                            \"files\",\n+                            \"ftp\",\n+                            \"ingest\",\n+                            \"input\",\n+                            \"list\",\n+                            \"remote\",\n+                            \"source\"\n                         ],\n-                        \"triggerSerially\": false,\n+                        \"triggerSerially\": true,\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-                        \"useCases\": [\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+                        \"useCases\": [],\n+                        \"version\": \"2.0.0-M3\",\n+                        \"writesAttributes\": [\n                             {\n-                                \"configuration\": \"\\\"Replacement Value Strategy\\\" = \\\"Record Path Value\\\"\\n\\nA single additional property is added to the Processor. The name of the property is a RecordPath identifying the field to place the result in.\\nThe value of the property uses the CONCAT Record Path function to concatenate multiple values together, potentially using other string literal values.\\nFor example, to combine the `title`, `firstName` and `lastName` fields into a single field named `fullName`, we add a property with the name `/fullName` and a value of `CONCAT(/title, ' ', /firstName, ' ', /lastName)`\\n\",\n-                                \"description\": \"Combine multiple fields into a single field.\",\n-                                \"keywords\": [\n-                                    \"combine\",\n-                                    \"concatenate\",\n-                                    \"recordpath\"\n-                                ],\n-                                \"notes\": \"\"\n+                                \"description\": \"The hostname of the FTP Server\",\n+                                \"name\": \"ftp.remote.host\"\n                             },\n                             {\n-                                \"configuration\": \"    \\\"Replacement Value Strategy\\\" = \\\"Literal Value\\\"\\n\\n    A single additional property is added to the Processor. The name of the property is a RecordPath identifying the field to place the result in.\\n    The value of the property is the explicit value to set the field to. For example, we can set any field with a name of `txId`, regardless of its level in the data's hierarchy,     to `1111-1111` by adding a property with a name of `//txId` and a value of `1111-1111`\\n\",\n-                                \"description\": \"Change the value of a record field to an explicit value.\",\n-                                \"keywords\": [\n-                                    \"change\",\n-                                    \"update\",\n-                                    \"replace\",\n-                                    \"transform\"\n-                                ],\n-                                \"notes\": \"\"\n+                                \"description\": \"The port that was connected to on the FTP Server\",\n+                                \"name\": \"ftp.remote.port\"\n                             },\n                             {\n-                                \"configuration\": \"    \\\"Replacement Value Strategy\\\" = \\\"Record Path Value\\\"\\n\\n    A single additional property is added to the Processor. The name of the property is a RecordPath identifying the field to update.\\n    The value of the property is a RecordPath identifying the field to copy the value from.\\n    For example, we can copy the value of `/identifiers/all/imei` to the `identifier` field at the root level, by adding a property named     `/identifier` with a value of `/identifiers/all/imei`.\\n\",\n-                                \"description\": \"Copy the value of one record field to another record field.\",\n-                                \"keywords\": [\n-                                    \"change\",\n-                                    \"update\",\n-                                    \"copy\",\n-                                    \"recordpath\",\n-                                    \"hierarchy\",\n-                                    \"transform\"\n-                                ],\n-                                \"notes\": \"\"\n+                                \"description\": \"The username of the user that performed the FTP Listing\",\n+                                \"name\": \"ftp.listing.user\"\n                             },\n                             {\n-                                \"configuration\": \"\\\"Replacement Value Strategy\\\" = \\\"Literal Value\\\"\\n\\nA single additional property is added to the Processor. The name of the property is a RecordPath identifying the field to place the result in.\\nThe value of the property is an Expression Language expression that references the attribute of interest. We can, for example, insert a new field name `filename` into each record by adding a property named `/filename` with a value of `${filename}`\\n\",\n-                                \"description\": \"Enrich data by injecting the value of an attribute into each Record.\",\n-                                \"keywords\": [\n-                                    \"enrich\",\n-                                    \"attribute\",\n-                                    \"change\",\n-                                    \"update\",\n-                                    \"replace\",\n-                                    \"insert\",\n-                                    \"transform\"\n-                                ],\n-                                \"notes\": \"\"\n+                                \"description\": \"The numeric owner id of the source file\",\n+                                \"name\": \"file.owner\"\n                             },\n                             {\n-                                \"configuration\": \"\\\"Replacement Value Strategy\\\" = \\\"Literal Value\\\"\\n\\nA single additional property is added to the Processor. The name of the property is a RecordPath identifying the field to update.\\nThe value is an Expression Language expression that references the `field.value` variable. For example, to change the date/time format of a field named `txDate` from `year-month-day` format to `month/day/year` format, we add a property named `/txDate` with a value of `${field.value:toDate('yyyy-MM-dd'):format('MM/dd/yyyy')}`. We could also change the timezone of a timestamp field (and insert the timezone for clarity) by using a value of `${field.value:toDate('yyyy-MM-dd HH:mm:ss', 'UTC-0400'):format('yyyy-MM-dd HH:mm:ss Z', 'UTC')}`.\\n\",\n-                                \"description\": \"Change the format of a record field's value.\",\n-                                \"keywords\": [\n-                                    \"change\",\n-                                    \"update\",\n-                                    \"replace\",\n-                                    \"insert\",\n-                                    \"transform\",\n-                                    \"format\",\n-                                    \"date/time\",\n-                                    \"timezone\",\n-                                    \"expression language\"\n-                                ],\n-                                \"notes\": \"Use the RenameRecordField Processor in order to change a field's name.\"\n-                            }\n-                        ],\n-                        \"version\": \"2.0.0-M3\",\n-                        \"writesAttributes\": [\n+                                \"description\": \"The numeric group id of the source file\",\n+                                \"name\": \"file.group\"\n+                            },\n                             {\n-                                \"description\": \"This attribute provides the current row index and is only available inside the literal value expression.\",\n-                                \"name\": \"record.index\"\n+                                \"description\": \"The read/write/execute permissions of the source file\",\n+                                \"name\": \"file.permissions\"\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 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\": true,\n                         \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n@@ -61460,678 +68173,1177 @@\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+                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n                         \"multiProcessorUseCases\": [],\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+                            \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"validate-csv-delimiter\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"File Filter\",\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+                            \"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\": \"Indicates whether or not hidden files should be ignored\",\n+                                \"displayName\": \"Ignore Hidden Files\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"validate-csv-eol\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Ignore Hidden Files\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"validate-csv-header\": {\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\": \"true\",\n-                                \"description\": \"True if the incoming flow file contains a header to ignore, false otherwise.\",\n-                                \"displayName\": \"Header\",\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\": \"validate-csv-header\",\n+                                \"name\": \"Include File Attributes\",\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+                            \"Input Directory\": {\n+                                \"description\": \"The input directory from which files to pull files\",\n+                                \"displayName\": \"Input Directory\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"validate-csv-quote\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Input Directory\",\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+                            \"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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"validate-csv-schema\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Input Directory Location\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"validate-csv-strategy\": {\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+                                \"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+                            \"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+                            \"Recurse Subdirectories\": {\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+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\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+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"FlowFile validation\",\n-                                \"description\": \"Strategy to apply when routing input files to output relationships.\",\n-                                \"displayName\": \"Validation strategy\",\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\": \"validate-csv-strategy\",\n+                                \"name\": \"Recurse Subdirectories\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"validate-csv-violations\": {\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-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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"et-node-identifier\",\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\": \"2.0.0-M3\"\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"et-time-window\",\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 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+                            \"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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"max-listing-time\",\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"max-operation-time\",\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"max-performance-metrics\",\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+                                \"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\": \"2.0.0-M3\"\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\": \"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+                                \"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\": \"validate-csv-violations\",\n+                                \"name\": \"track-performance\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"sideEffectFree\": 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+                        ],\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 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+                                \"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\": true,\n+                        \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"csv\",\n-                            \"schema\",\n-                            \"validation\"\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.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+                        \"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                         \"useCases\": [],\n                         \"version\": \"2.0.0-M3\",\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+                                \"description\": \"The name of the file that was read from filesystem.\",\n+                                \"name\": \"filename\"\n                             },\n                             {\n-                                \"description\": \"If line by line validation, number of invalid lines extracted from the source data\",\n-                                \"name\": \"count.invalid.lines\"\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\": \"If line by line validation, total number of lines in the source data\",\n-                                \"name\": \"count.total.lines\"\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\": \"For flow files routed to invalid, message of the first validation error\",\n-                                \"name\": \"validation.error.message\"\n+                                \"description\": \"The user that owns the file in filesystem\",\n+                                \"name\": \"file.owner\"\n+                            },\n+                            {\n+                                \"description\": \"The group that owns the file in filesystem\",\n+                                \"name\": \"file.group\"\n+                            },\n+                            {\n+                                \"description\": \"The number of bytes in the file in filesystem\",\n+                                \"name\": \"file.size\"\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+                            },\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+                            },\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+                            },\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+                        \"additionalDetails\": true,\n                         \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\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-                        \"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+                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n                         \"multiProcessorUseCases\": [],\n-                        \"primaryNodeOnly\": false,\n+                        \"primaryNodeOnly\": true,\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+                            \"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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"JSON Schema\",\n+                                \"name\": \"Connection Timeout\",\n                                 \"required\": true,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\",\n-                                        \"TEXT\",\n-                                        \"URL\"\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+                            \"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\": \"JSON Schema Registry\",\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.schemaregistry.services.JsonSchemaRegistry\",\n+                                    \"type\": \"org.apache.nifi.distributed.cache.client.DistributedMapCacheClient\",\n                                     \"version\": \"2.0.0-M3\"\n                                 }\n                             },\n-                            \"JSON Schema Version\": {\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+                                \"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\": \"Environment variables 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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Http Proxy Username\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Ignore Dotted Files\": {\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\": \"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\": \"JSON Schema Version\",\n+                                \"name\": \"Ignore Dotted Files\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Schema Access Strategy\": {\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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+                                \"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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Message Authentication Codes Allowed\",\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\": \"Environment variables 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\": \"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\": \"Environment variables 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\": \"Environment variables 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\": \"Environment variables 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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Proxy Port\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\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 JSON Schema Registry Service.\",\n-                                        \"displayName\": \"Schema Name Property\",\n-                                        \"value\": \"SCHEMA_NAME_PROPERTY\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"DIRECT\",\n+                                        \"value\": \"DIRECT\"\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\": \"HTTP\",\n+                                        \"value\": \"HTTP\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SOCKS\",\n+                                        \"value\": \"SOCKS\"\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\": \"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\": \"Schema Access Strategy\",\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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-                            \"Schema Name\": {\n-                                \"defaultValue\": \"${schema.name}\",\n-                                \"dependencies\": [\n+                            \"Search Recursively\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"SCHEMA_NAME_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\": \"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 from arbitrarily nested subdirectories; otherwise, will not traverse subdirectories\",\n+                                \"displayName\": \"Search Recursively\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Schema Name\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Search Recursively\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n-                            }\n-                        },\n-                        \"restricted\": true,\n-                        \"sideEffectFree\": true,\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"FlowFiles that cannot be read as JSON are routed to this relationship\",\n-                                \"name\": \"failure\"\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 are successfully validated against the schema are routed to this relationship\",\n-                                \"name\": \"valid\"\n-                            }\n-                        ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": 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-                        \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\",\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\": \"f2215c6\"\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-                        \"multiProcessorUseCases\": [],\n-                        \"primaryNodeOnly\": false,\n-                        \"propertyDescriptors\": {\n-                            \"allow-extra-fields\": {\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\": \"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+                                \"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\": \"allow-extra-fields\",\n+                                \"name\": \"Send Keep Alive On Timeout\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"coerce-types\": {\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\": \"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+                                \"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\": \"coerce-types\",\n+                                \"name\": \"Strict Host Key Checking\",\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+                            \"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\": \"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\": \"2.0.0-M3\"\n-                                }\n+                                \"name\": \"Use Compression\",\n+                                \"required\": true,\n+                                \"sensitive\": false\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+                            \"Username\": {\n+                                \"description\": \"Username\",\n+                                \"displayName\": \"Username\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"maximum-validation-details-length\",\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+                                \"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-                            \"record-reader\": {\n-                                \"description\": \"Specifies the Controller Service to use for reading incoming data\",\n-                                \"displayName\": \"Record Reader\",\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\": \"record-reader\",\n-                                \"required\": true,\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.serialization.RecordReaderFactory\",\n+                                    \"type\": \"org.apache.nifi.distributed.cache.client.DistributedMapCacheClient\",\n                                     \"version\": \"2.0.0-M3\"\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+                            \"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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"record-writer\",\n+                                \"name\": \"follow-symlink\",\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\": \"2.0.0-M3\"\n-                                }\n+                                \"sensitive\": false\n                             },\n-                            \"schema-access-strategy\": {\n+                            \"listing-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+                                        \"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 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\": \"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 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\": \"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\": \"reader-schema\",\n-                                \"description\": \"Specifies how to obtain the schema that should be used to validate records\",\n-                                \"displayName\": \"Schema Access Strategy\",\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\": \"schema-access-strategy\",\n+                                \"name\": \"listing-strategy\",\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\": \"Environment variables 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+                            \"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\": \"schema-registry\",\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.schemaregistry.services.SchemaRegistry\",\n+                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n                                     \"version\": \"2.0.0-M3\"\n                                 }\n                             },\n-                            \"schema-text\": {\n-                                \"defaultValue\": \"${avro.schema}\",\n-                                \"description\": \"The text of an Avro-formatted Schema\",\n-                                \"displayName\": \"Schema Text\",\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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"schema-text\",\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\": \"2.0.0-M3\"\n+                                }\n                             },\n-                            \"strict-type-checking\": {\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 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+                                \"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\": \"strict-type-checking\",\n+                                \"name\": \"target-system-timestamp-precision\",\n                                 \"required\": true,\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"validation-details-attribute-name\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n                             }\n                         },\n-                        \"sideEffectFree\": true,\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\": \"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+                                \"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\": true,\n+                        \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"record\",\n-                            \"schema\",\n-                            \"validate\"\n+                            \"files\",\n+                            \"ingest\",\n+                            \"input\",\n+                            \"list\",\n+                            \"remote\",\n+                            \"sftp\",\n+                            \"source\"\n                         ],\n-                        \"triggerSerially\": false,\n+                        \"triggerSerially\": true,\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+                        \"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                         \"useCases\": [],\n                         \"version\": \"2.0.0-M3\",\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 hostname of the SFTP Server\",\n+                                \"name\": \"sftp.remote.host\"\n                             },\n                             {\n-                                \"description\": \"The number of records in the FlowFile routed to a relationship\",\n-                                \"name\": \"record.count\"\n+                                \"description\": \"The port that was connected to on the SFTP Server\",\n+                                \"name\": \"sftp.remote.port\"\n+                            },\n+                            {\n+                                \"description\": \"The username of the user that performed the SFTP Listing\",\n+                                \"name\": \"sftp.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 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-standard-nar\",\n                         \"buildInfo\": {\n@@ -62145,101 +69357,118 @@\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+                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n                         \"multiProcessorUseCases\": [],\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+                            \"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\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Schema File\",\n+                                \"name\": \"bind-address\",\n                                 \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\",\n-                                        \"URL\"\n-                                    ]\n-                                },\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+                            \"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\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"XML Source Attribute\",\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"2.0.0-M3\"\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"username\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"restricted\": true,\n-                        \"sideEffectFree\": true,\n+                        \"sideEffectFree\": false,\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-                            {\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+                                \"description\": \"Relationship for successfully received files.\",\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                         \"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+                            \"FTP\",\n+                            \"FTPS\",\n+                            \"ingest\",\n+                            \"listen\"\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+                        \"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                         \"useCases\": [],\n                         \"version\": \"2.0.0-M3\",\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+                                \"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                     {\n-                        \"additionalDetails\": true,\n+                        \"additionalDetails\": false,\n                         \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n@@ -62249,670 +69478,526 @@\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                         \"multiProcessorUseCases\": [],\n                         \"primaryNodeOnly\": false,\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-                                    {\n-                                        \"description\": \"Attributes on released FlowFiles are not overwritten by copied cached attributes.\",\n-                                        \"displayName\": \"Keep original\",\n-                                        \"value\": \"keeporiginal\"\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+                            \"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\": \"attribute-copy-mode\",\n+                                \"name\": \"Authorized DN Pattern\",\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+                            \"Base Path\": {\n+                                \"defaultValue\": \"contentListener\",\n+                                \"description\": \"Base path for incoming connections\",\n+                                \"displayName\": \"Base Path\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"distributed-cache-service\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Base Path\",\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\": \"2.0.0-M3\"\n-                                }\n+                                \"sensitive\": false\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+                            \"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\": \"expiration-duration\",\n-                                \"required\": true,\n+                                \"name\": \"HTTP Headers to receive as Attributes (Regex)\",\n+                                \"required\": false,\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+                            \"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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"releasable-flowfile-count\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"HTTP Protocols\",\n                                 \"required\": true,\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+                            \"Listening Port\": {\n+                                \"description\": \"The Port to listen on for incoming connections\",\n+                                \"displayName\": \"Listening Port\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"release-signal-id\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Listening Port\",\n                                 \"required\": true,\n                                 \"sensitive\": false\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+                            \"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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"signal-counter-name\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Max Data to Receive per Second\",\n                                 \"required\": false,\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+                            \"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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"target-signal-count\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Max Unconfirmed Flowfile Time\",\n                                 \"required\": true,\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+                            \"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\": \"wait-buffer-count\",\n-                                \"required\": true,\n+                                \"name\": \"Return Code\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"wait-mode\": {\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-                                    },\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-                                    }\n-                                ],\n-                                \"defaultValue\": \"wait\",\n-                                \"description\": \"Specifies how to handle a FlowFile waiting for a notify signal\",\n-                                \"displayName\": \"Wait Mode\",\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\": \"wait-mode\",\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.RestrictedSSLContextService\",\n+                                    \"version\": \"2.0.0-M3\"\n+                                }\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+                            \"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\": \"wait-penalty-duration\",\n+                                \"name\": \"authorized-issuer-dn-pattern\",\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-                        ],\n-                        \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\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-                        \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\",\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\": \"f2215c6\"\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+                            \"client-authentication\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\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\": \"\",\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Show Deltas\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"reporting-granularity\": {\n-                                \"allowableValues\": [\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-                                        \"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+                                        \"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\": \"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+                                        \"description\": \"Does not request the client certificate on handshake\",\n+                                        \"displayName\": \"NONE\",\n+                                        \"value\": \"NONE\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"five-minutes\",\n-                                \"description\": \"When reporting information, specifies the granularity of the metrics to report\",\n-                                \"displayName\": \"Reporting Granularity\",\n+                                \"defaultValue\": \"AUTO\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"propertyDisplayName\": \"SSL Context Service\",\n+                                        \"propertyName\": \"SSL Context Service\"\n+                                    }\n+                                ],\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\": \"reporting-granularity\",\n+                                \"name\": \"client-authentication\",\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\": \"2.0.0-M3\"\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-standard-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"f2215c6\"\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+                            \"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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"health-check-port\",\n+                                \"required\": false,\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                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Directory Display Name\",\n-                                \"required\": false,\n+                                \"name\": \"max-thread-pool-size\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Directory Location\": {\n-                                \"description\": \"The directory path of the partition to be monitored.\",\n-                                \"displayName\": \"Directory Location\",\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\": \"Directory Location\",\n+                                \"name\": \"multipart-read-buffer-size\",\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+                            \"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\": \"Threshold\",\n+                                \"name\": \"multipart-request-max-size\",\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+                                \"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\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\n+                                }\n                             }\n                         },\n+                        \"sideEffectFree\": false,\n+                        \"supportedRelationships\": [\n+                            {\n+                                \"description\": \"Relationship for successfully received FlowFiles\",\n+                                \"name\": \"success\"\n+                            }\n+                        ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n+                        \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"disk\",\n-                            \"monitoring\",\n-                            \"repo\",\n-                            \"storage\",\n-                            \"warning\"\n+                            \"http\",\n+                            \"https\",\n+                            \"ingest\",\n+                            \"listen\",\n+                            \"rest\"\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+                        \"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+                        \"useCases\": [],\n                         \"version\": \"2.0.0-M3\"\n                     },\n                     {\n                         \"additionalDetails\": false,\n                         \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\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+                        \"multiProcessorUseCases\": [],\n+                        \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Memory Pool\": {\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+                            \"Client Auth\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"G1 Eden Space\",\n-                                        \"value\": \"G1 Eden Space\"\n+                                        \"displayName\": \"WANT\",\n+                                        \"value\": \"WANT\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"G1 Old Gen\",\n-                                        \"value\": \"G1 Old Gen\"\n+                                        \"displayName\": \"REQUIRED\",\n+                                        \"value\": \"REQUIRED\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"G1 Survivor Space\",\n-                                        \"value\": \"G1 Survivor Space\"\n+                                        \"displayName\": \"NONE\",\n+                                        \"value\": \"NONE\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"G1 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\": \"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\": \"Memory Pool\",\n-                                \"required\": true,\n+                                \"name\": \"Client Auth\",\n+                                \"required\": false,\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+                            \"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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Reporting Interval\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Local Network Interface\",\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+                            \"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\": \"Usage Threshold\",\n+                                \"name\": \"Max Batch Size\",\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\": \"2.0.0-M3\"\n-                    },\n-                    {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-standard-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"f2215c6\"\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+                            \"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\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Hostname\",\n+                                \"name\": \"Max Number of TCP Connections\",\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+                            \"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\": \"Port\",\n+                                \"name\": \"Max Size of Message Queue\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Send JVM Metrics\": {\n-                                \"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 JVM Metrics should be gathered and sent, in addition to NiFi-specific metrics\",\n-                                \"displayName\": \"Send JVM Metrics\",\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\": \"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-                            \"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\": \"2.0.0-M3\"\n-                    }\n-                ]\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"2.0.0-M3\"\n-        },\n-        {\n-            \"artifact\": \"nifi-mongodb-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [],\n-                \"processors\": [\n-                    {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-mongodb-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"f2215c6\"\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-                        \"multiProcessorUseCases\": [],\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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Mongo Collection Name\",\n+                                \"name\": \"Max Size of Socket Buffer\",\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+                            \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Mongo Database Name\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Message Delimiter\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\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+                            \"Port\": {\n+                                \"description\": \"The port to listen on for communication.\",\n+                                \"displayName\": \"Port\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"delete-mongo-delete-mode\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Port\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\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+                            \"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\": \"delete-mongo-fail-on-no-delete\",\n-                                \"required\": false,\n+                                \"name\": \"Receive Buffer Size\",\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+                            \"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\": \"mongo-client-service\",\n+                                \"name\": \"SSL Context 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.ssl.RestrictedSSLContextService\",\n                                     \"version\": \"2.0.0-M3\"\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+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.standard.ParseSyslog\"\n                         ],\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"All FlowFiles that are written to MongoDB are routed to this relationship\",\n+                                \"description\": \"Messages received successfully will be sent out 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                         ],\n                         \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"delete\",\n-                            \"mongo\",\n-                            \"mongodb\"\n+                            \"listen\",\n+                            \"logs\",\n+                            \"relp\",\n+                            \"tcp\"\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+                        \"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                         \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\"\n+                        \"version\": \"2.0.0-M3\",\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+                            }\n+                        ]\n                     },\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-mongodb-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -62921,265 +70006,362 @@\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_FORBIDDEN\",\n                         \"multiProcessorUseCases\": [],\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+                            \"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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Batch Size\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"Client Auth\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Limit\": {\n-                                \"description\": \"The maximum number of elements to return\",\n-                                \"displayName\": \"Limit\",\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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Limit\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Local Network Interface\",\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+                            \"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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Mongo Collection Name\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Max Batch Size\",\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+                            \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Mongo Database Name\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Max Number of TCP Connections\",\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+                            \"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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Projection\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Max Size of Message Queue\",\n+                                \"required\": true,\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+                            \"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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Query\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Max Size of Socket Buffer\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Sort\": {\n-                                \"description\": \"The fields by which to sort; must be a valid BSON document\",\n-                                \"displayName\": \"Sort\",\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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Sort\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Message Delimiter\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"get-mongo-send-empty\": {\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\": \"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\": \"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\": \"get-mongo-send-empty\",\n-                                \"required\": false,\n+                                \"name\": \"Parse Messages\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"json-type\": {\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Port\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Protocol\": {\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+                                        \"description\": \"\",\n+                                        \"displayName\": \"TCP\",\n+                                        \"value\": \"TCP\"\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+                                        \"description\": \"\",\n+                                        \"displayName\": \"UDP\",\n+                                        \"value\": \"UDP\"\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+                                \"defaultValue\": \"UDP\",\n+                                \"description\": \"The protocol for Syslog communication.\",\n+                                \"displayName\": \"Protocol\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"json-type\",\n+                                \"name\": \"Protocol\",\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+                            \"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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"mongo-charset\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Receive Buffer Size\",\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+                            \"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\": \"mongo-client-service\",\n+                                \"name\": \"SSL Context 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.ssl.RestrictedSSLContextService\",\n                                     \"version\": \"2.0.0-M3\"\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.\",\n-                                \"displayName\": \"Date Format\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"mongo-date-format\",\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables 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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"results-per-flowfile\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"use-pretty-printing\": {\n+                            \"socket-keep-alive\": {\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+                                \"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\": \"use-pretty-printing\",\n+                                \"name\": \"socket-keep-alive\",\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\": \"All FlowFiles that have the results of a successful query execution go here.\",\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\": \"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+                                \"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+                        \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"get\",\n-                            \"mongodb\",\n-                            \"read\"\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.mongodb.GetMongo\",\n-                        \"typeDescription\": \"Creates FlowFiles from documents in MongoDB loaded by a user-specified query.\",\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                         \"useCases\": [],\n                         \"version\": \"2.0.0-M3\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"The database where the results came from.\",\n-                                \"name\": \"mongo.database.name\"\n+                                \"description\": \"The priority of the Syslog message.\",\n+                                \"name\": \"syslog.priority\"\n                             },\n                             {\n-                                \"description\": \"The collection where the results came from.\",\n-                                \"name\": \"mongo.collection.name\"\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\": true,\n-                        \"artifact\": \"nifi-mongodb-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -63188,194 +70370,254 @@\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_FORBIDDEN\",\n                         \"multiProcessorUseCases\": [],\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+                            \"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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Batch Size\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\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+                                \"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-                            \"Limit\": {\n-                                \"description\": \"The maximum number of elements to return\",\n-                                \"displayName\": \"Limit\",\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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Limit\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Local Network Interface\",\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+                            \"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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Mongo Collection Name\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Max Batch Size\",\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+                            \"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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Mongo Database Name\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Max Number of TCP Connections\",\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+                            \"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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Projection\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Max Size of Message Queue\",\n+                                \"required\": true,\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+                            \"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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Query\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Max Size of Socket Buffer\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Sort\": {\n-                                \"description\": \"The fields by which to sort; must be a valid BSON document\",\n-                                \"displayName\": \"Sort\",\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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Sort\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Message Delimiter\",\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+                            \"Port\": {\n+                                \"description\": \"The port to listen on for communication.\",\n+                                \"displayName\": \"Port\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"get-mongo-record-writer-factory\",\n+                                \"name\": \"Receive Buffer 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\": \"2.0.0-M3\"\n-                                }\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+                            \"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\": \"mongo-client-service\",\n+                                \"name\": \"SSL Context 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.ssl.RestrictedSSLContextService\",\n                                     \"version\": \"2.0.0-M3\"\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+                            \"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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"mongo-query-attribute\",\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-                            \"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+                            \"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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"mongodb-schema-name\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"pool-receive-buffers\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"All FlowFiles that have the results of a successful query execution go here.\",\n+                                \"description\": \"Messages received successfully will be sent out this relationship.\",\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+                        \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"fetch\",\n-                            \"get\",\n-                            \"json\",\n-                            \"mongo\",\n-                            \"mongodb\",\n-                            \"record\"\n+                            \"listen\",\n+                            \"ssl\",\n+                            \"tcp\",\n+                            \"tls\"\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.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                         \"useCases\": [],\n                         \"version\": \"2.0.0-M3\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"The database where the results came from.\",\n-                                \"name\": \"mongo.database.name\"\n+                                \"description\": \"The sending host of the messages.\",\n+                                \"name\": \"tcp.sender\"\n                             },\n                             {\n-                                \"description\": \"The collection where the results came from.\",\n-                                \"name\": \"mongo.collection.name\"\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\": true,\n-                        \"artifact\": \"nifi-mongodb-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -63384,198 +70626,241 @@\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                         \"multiProcessorUseCases\": [],\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+                            \"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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Character Set\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Local Network Interface\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Mode\": {\n+                            \"client-auth\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"insert\",\n-                                        \"value\": \"insert\"\n+                                        \"displayName\": \"WANT\",\n+                                        \"value\": \"WANT\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"update\",\n-                                        \"value\": \"update\"\n+                                        \"displayName\": \"REQUIRED\",\n+                                        \"value\": \"REQUIRED\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"NONE\",\n+                                        \"value\": \"NONE\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"insert\",\n-                                \"description\": \"Indicates whether the processor should insert or update content\",\n-                                \"displayName\": \"Mode\",\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\": \"Mode\",\n+                                \"name\": \"client-auth\",\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"max-number-tcp-connections\",\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+                            \"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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Mongo Collection Name\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"max-size-socket-buffer\",\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+                            \"port\": {\n+                                \"description\": \"The port to listen on for communication.\",\n+                                \"displayName\": \"Port\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Mongo Database Name\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"port\",\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+                            \"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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Update Query Key\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"read-timeout\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Upsert\": {\n+                            \"reader-error-handling-strategy\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"description\": \"Transfers any records already received and closes the connection.\",\n+                                        \"displayName\": \"Transfer\",\n+                                        \"value\": \"Transfer\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"description\": \"Discards any records already received and closes the connection.\",\n+                                        \"displayName\": \"Discard\",\n+                                        \"value\": \"Discard\"\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+                                \"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\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Upsert\",\n+                                \"name\": \"reader-error-handling-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-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\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"mongo-client-service\",\n-                                \"required\": false,\n+                                \"name\": \"record-batch-size\",\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\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\": \"2.0.0-M3\"\n                                 }\n                             },\n-                            \"put-mongo-update-mode\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"With whole document\",\n-                                        \"value\": \"doc\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"With operators enabled\",\n-                                        \"value\": \"operators\"\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+                            \"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\": \"put-mongo-update-mode\",\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\": \"2.0.0-M3\"\n+                                }\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+                            \"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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"putmongo-update-query\",\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\": \"2.0.0-M3\"\n+                                }\n                             }\n                         },\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"All FlowFiles that are written to MongoDB are routed to this relationship\",\n+                                \"description\": \"Messages received successfully will be sent out 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                         ],\n-                        \"supportsBatching\": false,\n+                        \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": 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-                            \"insert\",\n-                            \"mongodb\",\n-                            \"put\",\n-                            \"update\",\n-                            \"write\"\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.mongodb.PutMongo\",\n-                        \"typeDescription\": \"Writes the contents of a FlowFile to MongoDB\",\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                         \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\"\n+                        \"version\": \"2.0.0-M3\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"The host that sent the data.\",\n+                                \"name\": \"tcp.sender\"\n+                            },\n+                            {\n+                                \"description\": \"The port that the processor accepted the connection on.\",\n+                                \"name\": \"tcp.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+                                \"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-mongodb-nar\",\n+                        \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -63584,133 +70869,167 @@\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                         \"multiProcessorUseCases\": [],\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n                             \"Character Set\": {\n                                 \"defaultValue\": \"UTF-8\",\n-                                \"description\": \"The Character Set in which the data is encoded\",\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-                            \"Mongo Collection Name\": {\n-                                \"description\": \"The name of the collection to use\",\n-                                \"displayName\": \"Mongo Collection Name\",\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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Mongo Collection Name\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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-                            \"Mongo Database Name\": {\n-                                \"description\": \"The name of the database to use\",\n-                                \"displayName\": \"Mongo Database Name\",\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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Mongo Database Name\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Max Size of Message Queue\",\n                                 \"required\": true,\n                                 \"sensitive\": false\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\": \"true\",\n-                                \"description\": \"Ordered execution of bulk-writes and break on error - otherwise arbitrary order and continue on error\",\n-                                \"displayName\": \"Ordered\",\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\": \"Ordered\",\n+                                \"name\": \"Max Size of Socket Buffer\",\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+                            \"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\": \"mongo-client-service\",\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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+                            \"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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Sending Host\",\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\": \"2.0.0-M3\"\n-                                }\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Sending Host Port\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n                             }\n                         },\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"All FlowFiles that are written to MongoDB are routed to this relationship\",\n+                                \"description\": \"Messages received successfully will be sent out 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                         ],\n-                        \"supportsBatching\": false,\n+                        \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": 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-                            \"bulk\",\n-                            \"insert\",\n-                            \"mongodb\",\n-                            \"put\",\n-                            \"update\",\n-                            \"write\"\n+                            \"ingest\",\n+                            \"listen\",\n+                            \"source\",\n+                            \"udp\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.mongodb.PutMongoBulkOperations\",\n-                        \"typeDescription\": \"Writes the contents of a FlowFile to MongoDB as bulk-update\",\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                         \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\"\n+                        \"version\": \"2.0.0-M3\",\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                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-mongodb-nar\",\n+                        \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -63719,216 +71038,212 @@\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                         \"multiProcessorUseCases\": [],\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Mongo Collection Name\": {\n-                                \"description\": \"The name of the collection to use\",\n-                                \"displayName\": \"Mongo Collection Name\",\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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Mongo Collection Name\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Character Set\",\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+                            \"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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Mongo Database Name\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Local Network Interface\",\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Max Size of Message Queue\",\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\": \"False\",\n-                                \"description\": \"        Enable or disable bypassing document schema validation during insert or update operations.\\n        Bypassing document validation is a Privilege Action in MongoDB.\\n        Enabling this property can result in authorization errors for users with limited privileges.\\n\",\n-                                \"displayName\": \"Bypass Validation\",\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\": \"bypass-validation\",\n+                                \"name\": \"Max Size of Socket Buffer\",\n                                 \"required\": true,\n                                 \"sensitive\": false\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+                            \"Port\": {\n+                                \"description\": \"The port to listen on for communication.\",\n+                                \"displayName\": \"Port\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"insert_count\",\n+                                \"name\": \"Receive Buffer Size\",\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+                            \"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\": \"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\": \"2.0.0-M3\"\n-                                }\n+                                \"name\": \"batch-size\",\n+                                \"required\": true,\n+                                \"sensitive\": false\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+                            \"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\": \"ordered\",\n+                                \"name\": \"poll-timeout\",\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+                                \"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.serialization.RecordReaderFactory\",\n                                     \"version\": \"2.0.0-M3\"\n                                 }\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+                            \"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\": \"update-key-fields\",\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\": \"2.0.0-M3\"\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"sending-host\",\n                                 \"required\": false,\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+                            \"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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"update-mode\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"sending-host-port\",\n                                 \"required\": false,\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-                        ],\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"All FlowFiles that are written to MongoDB are routed to this relationship\",\n+                                \"description\": \"Messages received successfully will be sent out 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+                                \"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                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"insert\",\n-                            \"mongodb\",\n-                            \"put\",\n+                            \"ingest\",\n+                            \"listen\",\n                             \"record\",\n-                            \"update\",\n-                            \"upsert\"\n+                            \"source\",\n+                            \"udp\"\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+                        \"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                         \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\"\n+                        \"version\": \"2.0.0-M3\",\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                     },\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-mongodb-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -63937,204 +71252,218 @@\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                         \"multiProcessorUseCases\": [],\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+                            \"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\": \"Batch Size\",\n+                                \"name\": \"Attributes to Ignore\",\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\": \"Environment variables 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+                            \"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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Mongo Database Name\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Attributes to Log\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"allow-disk-use\": {\n+                            \"Log FlowFile Properties\": {\n                                 \"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+                                \"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\": \"allow-disk-use\",\n+                                \"name\": \"Log FlowFile Properties\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"json-type\": {\n+                            \"Log Level\": {\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+                                        \"description\": \"\",\n+                                        \"displayName\": \"trace\",\n+                                        \"value\": \"trace\"\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+                                        \"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-                                \"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+                                \"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\": \"json-type\",\n+                                \"name\": \"Log Level\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"mongo-agg-query\": {\n-                                \"description\": \"The aggregation query to be executed.\",\n-                                \"displayName\": \"Query\",\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\": \"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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"mongo-agg-query\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Log Payload\",\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+                            \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"mongo-charset\",\n-                                \"required\": true,\n+                                \"name\": \"Log prefix\",\n+                                \"required\": false,\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+                            \"Output Format\": {\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+                                    },\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+                                    }\n+                                ],\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\": \"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\": \"2.0.0-M3\"\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.\",\n-                                \"displayName\": \"Date Format\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"mongo-date-format\",\n-                                \"required\": false,\n+                                \"name\": \"Output Format\",\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+                            \"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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"mongo-query-attribute\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"attributes-to-ignore-regex\",\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+                            \"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\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"results-per-flowfile\",\n+                                \"name\": \"attributes-to-log-regex\",\n                                 \"required\": false,\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"character-set\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             }\n                         },\n-                        \"sideEffectFree\": false,\n+                        \"sideEffectFree\": true,\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+                                \"description\": \"All FlowFiles are routed to this relationship\",\n+                                \"name\": \"success\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": false,\n+                        \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"aggregate\",\n-                            \"aggregation\",\n-                            \"mongo\"\n+                            \"attributes\",\n+                            \"logging\"\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.standard.LogAttribute\",\n+                        \"typeDescription\": \"Emits attributes of the FlowFile at the specified log level\",\n                         \"useCases\": [],\n                         \"version\": \"2.0.0-M3\"\n                     },\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-mongodb-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -64147,116 +71476,76 @@\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"multiProcessorUseCases\": [],\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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"delete-gridfs-query\",\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables 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-                                \"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\": \"2.0.0-M3\"\n-                                }\n-                            },\n-                            \"gridfs-database-name\": {\n-                                \"description\": \"The name of the database to use\",\n-                                \"displayName\": \"Mongo Database Name\",\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\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"gridfs-database-name\",\n+                                \"name\": \"log-level\",\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+                            \"log-message\": {\n+                                \"description\": \"The log message to emit\",\n+                                \"displayName\": \"Log message\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"gridfs-file-name\",\n+                                \"name\": \"log-message\",\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+                            \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"mongo-query-attribute\",\n+                                \"name\": \"log-prefix\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"sideEffectFree\": false,\n+                        \"sideEffectFree\": true,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"When the operation succeeds, the flowfile is sent to this relationship.\",\n+                                \"description\": \"All FlowFiles are routed 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+                        \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"delete\",\n-                            \"gridfs\",\n-                            \"mongodb\"\n+                            \"attributes\",\n+                            \"logging\"\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+                        \"type\": \"org.apache.nifi.processors.standard.LogMessage\",\n+                        \"typeDescription\": \"Emits a log message at the specified log level\",\n                         \"useCases\": [],\n                         \"version\": \"2.0.0-M3\"\n                     },\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-mongodb-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -64264,154 +71553,109 @@\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                         \"multiProcessorUseCases\": [],\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\": \"Environment variables 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-                                \"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\": \"2.0.0-M3\"\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\": \"Environment variables and FlowFile Attributes\",\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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"gridfs-file-name\",\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"gridfs-query\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"mongo-operation-mode\": {\n+                            \"include-empty-values\": {\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\": \"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\": \"mongo-operation-mode\",\n+                                \"name\": \"include-empty-values\",\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+                            \"lookup-service\": {\n+                                \"description\": \"The lookup service to use for attribute lookups\",\n+                                \"displayName\": \"Lookup Service\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"mongo-query-attribute\",\n-                                \"required\": false,\n-                                \"sensitive\": 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\": \"2.0.0-M3\"\n+                                }\n                             }\n                         },\n-                        \"sideEffectFree\": false,\n+                        \"sideEffectFree\": true,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"When the operation succeeds, the flowfile is sent to this relationship.\",\n-                                \"name\": \"success\"\n+                                \"description\": \"FlowFiles with failing lookups are routed to this relationship\",\n+                                \"name\": \"failure\"\n                             },\n                             {\n-                                \"description\": \"When there is a failure processing the flowfile, it goes to this relationship.\",\n-                                \"name\": \"failure\"\n+                                \"description\": \"FlowFiles with missing lookups are routed to this relationship\",\n+                                \"name\": \"unmatched\"\n                             },\n                             {\n-                                \"description\": \"The original input flowfile goes to this relationship if the query does not cause an error\",\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                         ],\n-                        \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": false,\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": true,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"fetch\",\n-                            \"gridfs\",\n-                            \"mongo\"\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.mongodb.gridfs.FetchGridFS\",\n-                        \"typeDescription\": \"Retrieves one or more files from a GridFS bucket by file name or by a user-defined query.\",\n+                        \"type\": \"org.apache.nifi.processors.standard.LookupAttribute\",\n+                        \"typeDescription\": \"Lookup attributes from a lookup service\",\n                         \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\",\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+                        \"version\": \"2.0.0-M3\"\n                     },\n                     {\n                         \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-mongodb-nar\",\n+                        \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -64419,1202 +71663,1211 @@\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+                        \"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                         \"multiProcessorUseCases\": [],\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+                            \"Root Record Path\": {\n+                                \"description\": \"A RecordPath that points to a child Record within each of the top-level Records in the FlowFile. If specified, the additional RecordPath properties will be evaluated against this child Record instead of the top-level Record. This allows for performing enrichment against multiple child Records within a single top-level Record.\",\n+                                \"displayName\": \"Root Record Path\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"gridfs-bucket-name\",\n+                                \"name\": \"Root Record Path\",\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+                            \"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\": \"gridfs-client-service\",\n+                                \"name\": \"lookup-service\",\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.lookup.LookupService\",\n                                     \"version\": \"2.0.0-M3\"\n                                 }\n                             },\n-                            \"gridfs-database-name\": {\n-                                \"description\": \"The name of the database to use\",\n-                                \"displayName\": \"Mongo Database Name\",\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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"gridfs-database-name\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"record-path-lookup-miss-result-cache-size\",\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+                            \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"gridfs-file-name\",\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\": \"2.0.0-M3\"\n+                                }\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+                            \"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 \\\"Result RecordPath\\\" 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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"putgridfs-chunk-size\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"record-update-strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"putgridfs-enforce-uniqueness\": {\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\": \"2.0.0-M3\"\n+                                }\n+                            },\n+                            \"result-contents\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"No uniqueness will be enforced.\",\n-                                        \"displayName\": \"None\",\n-                                        \"value\": \"none\"\n-                                    },\n-                                    {\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+                                        \"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\": \"Only the file hash must be unique.\",\n-                                        \"displayName\": \"Hash\",\n-                                        \"value\": \"hash\"\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\": \"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+                                \"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\": \"putgridfs-enforce-uniqueness\",\n+                                \"name\": \"result-contents\",\n                                 \"required\": true,\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+                            \"result-record-path\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"use-property\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Record Update Strategy\",\n+                                        \"propertyName\": \"record-update-strategy\"\n+                                    }\n+                                ],\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"putgridfs-hash-attribute\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"result-record-path\",\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+                            \"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. If the given Record Paths evaluate such that multiple sub-records are evaluated, the parent Record will be routed to 'unmatched' unless all sub-records match.\",\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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"putgridfs-properties-prefix\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"routing-strategy\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"sideEffectFree\": false,\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                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"When the operation succeeds, the flowfile is sent to this 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 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\": \"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                         ],\n-                        \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": false,\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": true,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"file\",\n-                            \"gridfs\",\n-                            \"mongo\",\n-                            \"put\",\n-                            \"store\"\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.mongodb.gridfs.PutGridFS\",\n-                        \"typeDescription\": \"Writes a file to a GridFS bucket.\",\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                         \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\"\n-                    }\n-                ],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\n-        },\n-        {\n-            \"artifact\": \"nifi-py4j-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [],\n-                \"processors\": [],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"2.0.0-M3\"\n-        },\n-        {\n-            \"artifact\": \"nifi-distributed-cache-services-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [\n+                        \"version\": \"2.0.0-M3\",\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+                    },\n                     {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-distributed-cache-services-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\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+                        \"multiProcessorUseCases\": [],\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+                            \"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\": \"Communications Timeout\",\n+                                \"name\": \"Attribute Strategy\",\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\": \"2.0.0-M3\"\n-                                }\n-                            },\n-                            \"Server Hostname\": {\n-                                \"description\": \"The name of the server that is running the DistributedMapCacheServer service\",\n-                                \"displayName\": \"Server Hostname\",\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\": \"Server Hostname\",\n+                                \"name\": \"Compression Level\",\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+                            \"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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Server Port\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Correlation Attribute Name\",\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\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-distributed-cache-services-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"f2215c6\"\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+                            \"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\": \"Communications Timeout\",\n+                                \"name\": \"Delimiter Strategy\",\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+                            \"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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"SSL Context Service\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Demarcator File\",\n                                 \"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\": \"2.0.0-M3\"\n-                                }\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"SINGLE\",\n+                                    \"resourceTypes\": [\n+                                        \"TEXT\",\n+                                        \"FILE\"\n+                                    ]\n+                                },\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+                            \"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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Server Hostname\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Footer File\",\n+                                \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"SINGLE\",\n+                                    \"resourceTypes\": [\n+                                        \"TEXT\",\n+                                        \"FILE\"\n+                                    ]\n+                                },\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+                            \"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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Server Port\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Header File\",\n+                                \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"SINGLE\",\n+                                    \"resourceTypes\": [\n+                                        \"TEXT\",\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.DistributedSetCacheClient\",\n-                                \"version\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-distributed-cache-services-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"f2215c6\"\n-                        },\n-                        \"group\": \"org.apache.nifi\",\n-                        \"propertyDescriptors\": {\n-                            \"Eviction Strategy\": {\n+                            },\n+                            \"Keep Path\": {\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-                                    },\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"false\",\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"First In, First Out\",\n-                                        \"value\": \"First In, First Out\"\n+                                        \"dependentValues\": [\n+                                            \"ZIP\",\n+                                            \"TAR\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Merge Format\",\n+                                        \"propertyName\": \"Merge Format\"\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+                                \"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\": \"Eviction Strategy\",\n+                                \"name\": \"Keep Path\",\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+                            \"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\": \"Maximum Cache Entries\",\n-                                \"required\": true,\n+                                \"name\": \"Max Bin Age\",\n+                                \"required\": false,\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+                            \"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\": \"Persistence Directory\",\n+                                \"name\": \"Maximum Group Size\",\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+                            \"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\": \"Port\",\n+                                \"name\": \"Maximum Number of Entries\",\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\": \"2.0.0-M3\"\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+                            \"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-read-size\",\n-                                \"required\": false,\n+                                \"name\": \"Maximum number of Bins\",\n+                                \"required\": true,\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\": \"2.0.0-M3\"\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-distributed-cache-services-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"f2215c6\"\n-                        },\n-                        \"group\": \"org.apache.nifi\",\n-                        \"propertyDescriptors\": {\n-                            \"Eviction Strategy\": {\n+                            },\n+                            \"Merge Format\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Least Frequently Used\",\n-                                        \"value\": \"Least Frequently Used\"\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\": \"\",\n-                                        \"displayName\": \"Least Recently Used\",\n-                                        \"value\": \"Least Recently Used\"\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\": \"\",\n-                                        \"displayName\": \"First In, First Out\",\n-                                        \"value\": \"First In, First Out\"\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\": \"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\": \"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\": \"Eviction Strategy\",\n+                                \"name\": \"Merge Format\",\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+                            \"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>. 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\": \"Maximum Cache Entries\",\n+                                \"name\": \"Merge Strategy\",\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+                            \"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\": \"Persistence Directory\",\n-                                \"required\": false,\n+                                \"name\": \"Minimum Group Size\",\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+                            \"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\": \"Port\",\n+                                \"name\": \"Minimum Number of Entries\",\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+                            \"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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"SSL Context Service\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Tar Modified Time\",\n                                 \"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\": \"2.0.0-M3\"\n-                                }\n+                                \"sensitive\": false\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+                            \"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\": \"maximum-read-size\",\n-                                \"required\": false,\n+                                \"name\": \"mergecontent-metadata-strategy\",\n+                                \"required\": true,\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\": \"2.0.0-M3\"\n-                    }\n-                ],\n-                \"processors\": [],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"2.0.0-M3\"\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\": \"f2215c6\"\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-                        \"multiProcessorUseCases\": [],\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"api-url\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"base-id\": {\n-                                \"description\": \"The ID of the Airtable base to be queried.\",\n-                                \"displayName\": \"Base ID\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"custom-filter\",\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"max-records-per-flowfile\",\n-                                \"required\": false,\n-                                \"sensitive\": false\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-                            \"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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"query-page-size\",\n-                                \"required\": false,\n-                                \"sensitive\": false\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-                            \"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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"query-time-window-lag\",\n-                                \"required\": true,\n-                                \"sensitive\": false\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-                            \"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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"table-id\",\n-                                \"required\": true,\n-                                \"sensitive\": false\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-                            \"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\": \"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\": \"2.0.0-M3\"\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-                        \"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+                        ],\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.standard.MergeRecord\",\n+                            \"org.apache.nifi.processors.standard.SegmentContent\"\n+                        ],\n+                        \"sideEffectFree\": true,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"For FlowFiles created as a result of a successful query.\",\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\": \"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                         \"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-                            \"airtable\",\n-                            \"database\",\n-                            \"query\"\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\": true,\n+                        \"triggerSerially\": false,\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-                        \"useCases\": [],\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+                        \"useCases\": [\n+                            {\n+                                \"configuration\": \"\\\"Merge Strategy\\\" = \\\"Bin Packing Algorithm\\\"\\n\\\"Merge Format\\\" = \\\"Binary Concatenation\\\"\\n\\\"Delimiter Strategy\\\" = \\\"Text\\\"\\n\\\"Demarcator\\\" = \\\"\\\\n\\\" (a newline can be inserted by pressing Shift + Enter)\\n\\\"Minimum Number of Entries\\\" = \\\"1\\\"\\n\\\"Maximum Number of Entries\\\" = \\\"500000000\\\"\\n\\\"Minimum Group Size\\\" = the minimum amount of data to write to an output FlowFile. A reasonable value might be \\\"128 MB\\\"\\n\\\"Maximum Group Size\\\" = the maximum amount of data to write to an output FlowFile. A reasonable value might be \\\"256 MB\\\"\\n\\\"Max Bin Age\\\" = the maximum amount of time to wait for incoming data before timing out and transferring the FlowFile along even though it is smaller than the Max Bin Age. A reasonable value might be \\\"5 mins\\\"\\n\",\n+                                \"description\": \"Concatenate FlowFiles with textual content together in order to create fewer, larger FlowFiles.\",\n+                                \"keywords\": [\n+                                    \"concatenate\",\n+                                    \"bundle\",\n+                                    \"aggregate\",\n+                                    \"bin\",\n+                                    \"merge\",\n+                                    \"combine\",\n+                                    \"smash\"\n+                                ],\n+                                \"notes\": \"\"\n+                            },\n+                            {\n+                                \"configuration\": \"\\\"Merge Strategy\\\" = \\\"Bin Packing Algorithm\\\"\\n\\\"Merge Format\\\" = \\\"Binary Concatenation\\\"\\n\\\"Delimiter Strategy\\\" = \\\"Text\\\"\\n\\\"Minimum Number of Entries\\\" = \\\"1\\\"\\n\\\"Maximum Number of Entries\\\" = \\\"500000000\\\"\\n\\\"Minimum Group Size\\\" = the minimum amount of data to write to an output FlowFile. A reasonable value might be \\\"128 MB\\\"\\n\\\"Maximum Group Size\\\" = the maximum amount of data to write to an output FlowFile. A reasonable value might be \\\"256 MB\\\"\\n\\\"Max Bin Age\\\" = the maximum amount of time to wait for incoming data before timing out and transferring the FlowFile along even though it is smaller than the Max Bin Age. A reasonable value might be \\\"5 mins\\\"\\n\",\n+                                \"description\": \"Concatenate FlowFiles with binary content together in order to create fewer, larger FlowFiles.\",\n+                                \"keywords\": [\n+                                    \"concatenate\",\n+                                    \"bundle\",\n+                                    \"aggregate\",\n+                                    \"bin\",\n+                                    \"merge\",\n+                                    \"combine\",\n+                                    \"smash\"\n+                                ],\n+                                \"notes\": \"Not all binary data can be concatenated together. Whether or not this configuration is valid depends on the type of your data.\"\n+                            },\n+                            {\n+                                \"configuration\": \"\\\"Merge Strategy\\\" = \\\"Defragment\\\"\\n\\\"Merge Format\\\" = the value of Merge Format depends on the desired output format. If the file was previously zipped together and was split apart by UnpackContent,\\n    a Merge Format of \\\"ZIP\\\" makes sense. If it was previously a .tar file, a Merge Format of \\\"TAR\\\" makes sense. If the data is textual, \\\"Binary Concatenation\\\" can be\\n    used to combine the text into a single document.\\n\\\"Delimiter Strategy\\\" = \\\"Text\\\"\\n\\\"Max Bin Age\\\" = the maximum amount of time to wait for incoming data before timing out and transferring the fragments to 'failure'. A reasonable value might be \\\"5 mins\\\"\\n\\nFor textual data, \\\"Demarcator\\\" should be set to a newline (\\\\n), set by pressing Shift+Enter in the UI. For binary data, \\\"Demarcator\\\" should be left blank.\\n\",\n+                                \"description\": \"Reassemble a FlowFile that was previously split apart into smaller FlowFiles by a processor such as SplitText, UnpackContext, SplitRecord, etc.\",\n+                                \"keywords\": [\n+                                    \"reassemble\",\n+                                    \"repack\",\n+                                    \"merge\",\n+                                    \"recombine\"\n+                                ],\n+                                \"notes\": \"\"\n+                            }\n+                        ],\n                         \"version\": \"2.0.0-M3\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"Sets the number of records in the FlowFile.\",\n-                                \"name\": \"record.count\"\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\": \"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+                                \"description\": \"The number of FlowFiles that were merged into this bundle\",\n+                                \"name\": \"merge.count\"\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+                                \"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\": \"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+                                \"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\": \"2.0.0-M3\"\n-        },\n-        {\n-            \"artifact\": \"nifi-ssl-context-service-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [\n+                    },\n                     {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-ssl-context-service-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\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-                        \"propertyDescriptors\": {\n-                            \"Keystore Filename\": {\n-                                \"description\": \"The fully-qualified filename of the Keystore\",\n-                                \"displayName\": \"Keystore Filename\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Keystore Filename\",\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Keystore Password\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n-                            },\n-                            \"Keystore Type\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"BCFKS\",\n-                                        \"value\": \"BCFKS\"\n-                                    },\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"multiProcessorUseCases\": [\n+                            {\n+                                \"configurations\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"PKCS12\",\n-                                        \"value\": \"PKCS12\"\n+                                        \"configuration\": \"Configure the \\\"Record Reader\\\" to specify a Record Reader that is appropriate for the incoming data type.\\nConfigure the \\\"Record Writer\\\" to specify a Record Writer that is appropriate for the desired output data type.\\n\\nAdd a single additional property. The name of the property should describe the field on which the data is being merged together.\\nThe property's value should be a RecordPath that specifies which output FlowFile the Record belongs to.\\n\\nFor example, to merge together data that has the same value for the \\\"productSku\\\" field, add a property named `productSku` with a value of `/productSku`.\\n\\nConnect the \\\"success\\\" Relationship to MergeRecord.\\nAuto-terminate the \\\"original\\\" Relationship.\\n\",\n+                                        \"processorClassName\": \"org.apache.nifi.processors.standard.PartitionRecord\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"JKS\",\n-                                        \"value\": \"JKS\"\n+                                        \"configuration\": \"Configure the \\\"Record Reader\\\" to specify a Record Reader that is appropriate for the incoming data type.\\nConfigure the \\\"Record Writer\\\" to specify a Record Writer that is appropriate for the desired output data type.\\nSet \\\"Merge Strategy\\\" to `Bin-Packing Algorithm`.\\nSet the \\\"Minimum Bin Size\\\" to desired file size of the merged output file. For example, a value of `1 MB` will result in not merging data until at least\\n    1 MB of data is available (unless the Max Bin Age is reached first). If there is no desired minimum file size, leave the default value of `0 B`.\\nSet the \\\"Minimum Number of Records\\\" property to the minimum number of Records that should be included in the merged output file. For example, setting the value\\n    to `10000` ensures that the output file will have at least 10,000 Records in it (unless the Max Bin Age is reached first).\\nSet the \\\"Maximum Number of Records\\\" property to a value at least as large as the \\\"Minimum Number of Records.\\\" If there is no need to limit the maximum number of\\n    records per file, this number can be set to a value that will never be reached such as `1000000000`.\\nSet the \\\"Max Bin Age\\\" to specify the maximum amount of time to hold data before merging. This can be thought of as a \\\"timeout\\\" at which time the Processor will\\n    merge whatever data it is, even if the \\\"Minimum Bin Size\\\" and \\\"Minimum Number of Records\\\" has not been reached. It is always recommended to set the value.\\n    A reasonable default might be `10 mins` if there is no other latency requirement.\\nSet the value of the \\\"Correlation Attribute Name\\\" property to the name of the property that you added in the PartitionRecord Processor. For example, if merging data\\n    based on the \\\"productSku\\\" field, the property in PartitionRecord was named `productSku` so the value of the \\\"Correlation Attribute Name\\\" property should\\n    be `productSku`.\\nSet the \\\"Maximum Number of Bins\\\" property to a value that is at least as large as the different number of values that will be present for the Correlation Attribute.\\n    For example, if you expect 1,000 different SKUs, set this value to at least `1001`. It is not advisable, though, to set the value above 10,000.\\n\\nConnect the 'merged' Relationship to the next component in the flow.\\nAuto-terminate the 'original' Relationship.\\n\",\n+                                        \"processorClassName\": \"org.apache.nifi.processors.standard.MergeRecord\"\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\": \"Keystore Type\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"SSL Protocol\": {\n+                                \"description\": \"Combine together many Records that have the same value for a particular field in the data, in order to create a single, larger file\",\n+                                \"keywords\": [\n+                                    \"merge\",\n+                                    \"combine\",\n+                                    \"aggregate\",\n+                                    \"like records\",\n+                                    \"similar data\"\n+                                ],\n+                                \"notes\": \"\"\n+                            }\n+                        ],\n+                        \"primaryNodeOnly\": false,\n+                        \"propertyDescriptors\": {\n+                            \"Attribute Strategy\": {\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+                                        \"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\": \"Require TLSv1.2 protocol version\",\n-                                        \"displayName\": \"TLSv1.2\",\n-                                        \"value\": \"TLSv1.2\"\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\": \"TLS\",\n-                                \"description\": \"TLS Protocol Version for encrypted connections. Supported versions depend on the specific version of Java used.\",\n-                                \"displayName\": \"TLS Protocol\",\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\": \"SSL Protocol\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Truststore Filename\": {\n-                                \"description\": \"The fully-qualified filename of the Truststore\",\n-                                \"displayName\": \"Truststore Filename\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Truststore Filename\",\n-                                \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\"\n-                                    ]\n-                                },\n+                                \"name\": \"Attribute Strategy\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Truststore Password\": {\n-                                \"description\": \"The password for the Truststore\",\n-                                \"displayName\": \"Truststore Password\",\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\": \"Truststore Password\",\n+                                \"name\": \"correlation-attribute-name\",\n                                 \"required\": false,\n-                                \"sensitive\": true\n+                                \"sensitive\": false\n                             },\n-                            \"Truststore 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 Truststore\",\n-                                \"displayName\": \"Truststore Type\",\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\": \"Truststore Type\",\n+                                \"name\": \"max-bin-age\",\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+                            \"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\": \"key-password\",\n+                                \"name\": \"max-bin-size\",\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.RestrictedSSLContextService\",\n-                                \"version\": \"2.0.0-M3\"\n+                                \"sensitive\": false\n                             },\n-                            {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n-                                \"version\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-ssl-context-service-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"f2215c6\"\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+                            \"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\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Keystore Filename\",\n+                                \"name\": \"max-records\",\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.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\": \"Keystore Password\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n+                                \"name\": \"max.bin.count\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             },\n-                            \"Keystore Type\": {\n+                            \"merge-strategy\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"BCFKS\",\n-                                        \"value\": \"BCFKS\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"PKCS12\",\n-                                        \"value\": \"PKCS12\"\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\": \"JKS\",\n-                                        \"value\": \"JKS\"\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-                                \"description\": \"The Type of the Keystore\",\n-                                \"displayName\": \"Keystore Type\",\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\": \"Keystore Type\",\n-                                \"required\": false,\n+                                \"name\": \"merge-strategy\",\n+                                \"required\": true,\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+                            \"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\": \"SSL Protocol\",\n-                                \"required\": false,\n+                                \"name\": \"min-bin-size\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Truststore Filename\": {\n-                                \"description\": \"The fully-qualified filename of the Truststore\",\n-                                \"displayName\": \"Truststore Filename\",\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\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Truststore Filename\",\n-                                \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\"\n-                                    ]\n-                                },\n+                                \"name\": \"min-records\",\n+                                \"required\": true,\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\": \"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 Truststore\",\n-                                \"displayName\": \"Truststore Type\",\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\": \"Truststore Type\",\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\": \"2.0.0-M3\"\n+                                }\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+                            \"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\": \"key-password\",\n-                                \"required\": false,\n-                                \"sensitive\": true\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\": \"2.0.0-M3\"\n+                                }\n                             }\n                         },\n-                        \"providedApiImplementations\": [\n+                        \"readsAttributes\": [\n                             {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n-                                \"version\": \"2.0.0-M3\"\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                         \"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+                            \"content\",\n+                            \"correlation\",\n+                            \"event\",\n+                            \"merge\",\n+                            \"record\",\n+                            \"stream\"\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\": \"2.0.0-M3\"\n-                    }\n-                ],\n-                \"processors\": [],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"2.0.0-M3\"\n-        },\n-        {\n-            \"artifact\": \"nifi-enrich-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [],\n-                \"processors\": [\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+                        \"useCases\": [\n+                            {\n+                                \"configuration\": \"Configure the \\\"Record Reader\\\" to specify a Record Reader that is appropriate for the incoming data type.\\nConfigure the \\\"Record Writer\\\" to specify a Record Writer that is appropriate for the desired output data type.\\nSet \\\"Merge Strategy\\\" to `Bin-Packing Algorithm`.\\nSet the \\\"Minimum Bin Size\\\" to desired file size of the merged output file. For example, a value of `1 MB` will result in not merging data until at least\\n    1 MB of data is available (unless the Max Bin Age is reached first). If there is no desired minimum file size, leave the default value of `0 B`.\\nSet the \\\"Minimum Number of Records\\\" property to the minimum number of Records that should be included in the merged output file. For example, setting the value\\n    to `10000` ensures that the output file will have at least 10,000 Records in it (unless the Max Bin Age is reached first).\\nSet the \\\"Max Bin Age\\\" to specify the maximum amount of time to hold data before merging. This can be thought of as a \\\"timeout\\\" at which time the Processor will\\n    merge whatever data it is, even if the \\\"Minimum Bin Size\\\" and \\\"Minimum Number of Records\\\" has not been reached. It is always recommended to set the value.\\n    A reasonable default might be `10 mins` if there is no other latency requirement.\\n\\nConnect the 'merged' Relationship to the next component in the flow. Auto-terminate the 'original' Relationship.\\n\",\n+                                \"description\": \"Combine together many arbitrary Records in order to create a single, larger file\",\n+                                \"keywords\": [],\n+                                \"notes\": \"\"\n+                            }\n+                        ],\n+                        \"version\": \"2.0.0-M3\",\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-enrich-nar\",\n+                        \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -65627,131 +72880,91 @@\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"multiProcessorUseCases\": [],\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Geo Database File\": {\n-                                \"description\": \"Path to Maxmind IP Enrichment Database File\",\n-                                \"displayName\": \"MaxMind Database File\",\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Geo Database File\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"End Offset\",\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+                            \"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\": \"Remove all content from the FlowFile superseding Start Offset and End Offset properties.\",\n+                                \"displayName\": \"Remove All Content\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"IP Address Attribute\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Remove All Content\",\n                                 \"required\": true,\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+                            \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Log Level\",\n+                                \"name\": \"Start Offset\",\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+                                \"description\": \"Processed flowfiles.\",\n+                                \"name\": \"success\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"enrich\",\n-                            \"geo\",\n-                            \"ip\",\n-                            \"maxmind\"\n+                            \"binary\",\n+                            \"discard\",\n+                            \"keep\"\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.standard.ModifyBytes\",\n+                        \"typeDescription\": \"Discard byte range at the start and end or all content of a binary file.\",\n                         \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\",\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-                            },\n-                            {\n-                                \"description\": \"The postal code for the country identified\",\n-                                \"name\": \"X.geo.postalcode\"\n-                            }\n-                        ]\n+                        \"version\": \"2.0.0-M3\"\n                     },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-enrich-nar\",\n+                        \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -65764,209 +72977,254 @@\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"multiProcessorUseCases\": [],\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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-                            \"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+                            \"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\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Log Level\",\n+                                \"name\": \"Activity Restored Message\",\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"geo-enrich-ip-city-record-path\",\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"geo-enrich-ip-country-iso-record-path\",\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+                            \"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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"geo-enrich-ip-country-postal-record-path\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Continually Send Messages\",\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+                            \"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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"geo-enrich-ip-country-record-path\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Copy Attributes\",\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+                            \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"geo-enrich-ip-ip-record-path\",\n+                                \"name\": \"Inactivity Message\",\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+                            \"Monitoring Scope\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"node\",\n+                                        \"value\": \"node\"\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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"geo-enrich-ip-latitude-record-path\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Monitoring Scope\",\n+                                \"required\": true,\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+                            \"Reporting Node\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"all\",\n+                                        \"value\": \"all\"\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+                                    }\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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"geo-enrich-ip-longitude-record-path\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Reporting Node\",\n+                                \"required\": true,\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+                            \"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                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"geo-enrich-ip-record-reader\",\n+                                \"name\": \"Reset State on Restart\",\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\": \"2.0.0-M3\"\n-                                }\n+                                \"sensitive\": false\n                             },\n-                            \"geo-enrich-ip-record-writer\": {\n-                                \"description\": \"Record writer service to use for enriching the flowfile contents.\",\n-                                \"displayName\": \"Record Writer\",\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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"geo-enrich-ip-record-writer\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Threshold Duration\",\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\": \"2.0.0-M3\"\n-                                }\n+                                \"sensitive\": false\n                             },\n-                            \"geo-enrich-ip-split-found-not-found\": {\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\": \"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+                                \"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\": \"geo-enrich-ip-split-found-not-found\",\n+                                \"name\": \"Wait for Activity\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"sideEffectFree\": false,\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\": \"Where to route flow files after unsuccessfully enriching attributes because no data was found\",\n-                                \"name\": \"not found\"\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\": \"The original input flowfile goes to this relationship regardless of whether the content was enriched or not.\",\n-                                \"name\": \"original\"\n+                                \"description\": \"All incoming FlowFiles are routed to success\",\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+                                \"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                         ],\n                         \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"enrich\",\n-                            \"geo\",\n-                            \"ip\",\n-                            \"maxmind\",\n-                            \"record\"\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.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+                        \"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                         \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\"\n+                        \"version\": \"2.0.0-M3\",\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                     },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-enrich-nar\",\n+                        \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -65979,111 +73237,133 @@\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"multiProcessorUseCases\": [],\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Geo Database File\": {\n-                                \"description\": \"Path to Maxmind IP Enrichment Database File\",\n-                                \"displayName\": \"MaxMind Database File\",\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Geo Database File\",\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+                                \"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\": \"2.0.0-M3\"\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\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"release-signal-id\",\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+                            \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"IP Address Attribute\",\n+                                \"name\": \"signal-counter-delta\",\n                                 \"required\": true,\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+                            \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Log Level\",\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\": \"Where to route flow files after unsuccessfully enriching attributes because no data was found\",\n-                                \"name\": \"not found\"\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\": \"Where to route flow files after successfully enriching attributes with data provided by database\",\n-                                \"name\": \"found\"\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                         ],\n                         \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"ISP\",\n-                            \"enrich\",\n-                            \"ip\",\n-                            \"maxmind\"\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.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.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                         \"useCases\": [],\n                         \"version\": \"2.0.0-M3\",\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+                                \"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\": false,\n-                        \"artifact\": \"nifi-enrich-nar\",\n+                        \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -66093,150 +73373,126 @@\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-                        \"multiProcessorUseCases\": [],\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"DNS_QUERY_TYPE\",\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"DNS_RETRIES\",\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\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-                            \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"QUERY_INPUT\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"QUERY_PARSER\": {\n-                                \"allowableValues\": [\n+                        \"multiProcessorUseCases\": [\n+                            {\n+                                \"configurations\": [\n                                     {\n-                                        \"description\": \"Use a delimiter character or RegEx  to split the results into attributes\",\n-                                        \"displayName\": \"Split\",\n-                                        \"value\": \"Split\"\n+                                        \"configuration\": \"    \\\"Maximum Batch Size\\\" > 1 can help improve performance by batching many flowfiles together into 1 larger file that is transmitted by InvokeHTTP.\\n\\n    Connect the success relationship of PackageFlowFile to the input of InvokeHTTP.\\n\",\n+                                        \"processorClassName\": \"org.apache.nifi.processors.standard.PackageFlowFile\"\n                                     },\n                                     {\n-                                        \"description\": \"Use a regular expression to split the results into attributes \",\n-                                        \"displayName\": \"RegEx\",\n-                                        \"value\": \"RegEx\"\n+                                        \"configuration\": \"    \\\"HTTP Method\\\" = \\\"POST\\\" to send data to ListenHTTP.\\n    \\\"HTTP URL\\\" should include the hostname, port, and path to the ListenHTTP.\\n    \\\"Request Content-Type\\\" = \\\"${mime.type}\\\" because PackageFlowFile output files have attribute mime.type=application/flowfile-v3.\\n\",\n+                                        \"processorClassName\": \"org.apache.nifi.processors.standard.InvokeHTTP\"\n                                     },\n                                     {\n-                                        \"description\": \"Do not split results\",\n-                                        \"displayName\": \"None\",\n-                                        \"value\": \"None\"\n+                                        \"configuration\": \"    \\\"Listening Port\\\" = a unique port number.\\n\\n    ListenHTTP automatically unpacks files that have attribute mime.type=application/flowfile-v3.\\n    If PackageFlowFile batches 99 FlowFiles into 1 file that InvokeHTTP sends, then the original 99 FlowFiles will be output by ListenHTTP.\\n\",\n+                                        \"processorClassName\": \"org.apache.nifi.processors.standard.ListenHTTP\"\n                                     }\n                                 ],\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\": \"QUERY_PARSER\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n+                                \"description\": \"Send FlowFile content and attributes from one NiFi instance to another NiFi instance.\",\n+                                \"keywords\": [\n+                                    \"flowfile\",\n+                                    \"attributes\",\n+                                    \"content\",\n+                                    \"ffv3\",\n+                                    \"flowfile-stream-v3\",\n+                                    \"transfer\"\n+                                ],\n+                                \"notes\": \"A Remote Process Group is preferred to send FlowFiles between two NiFi instances, but an alternative is to use PackageFlowFile then InvokeHTTP sending to ListenHTTP.\"\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+                            {\n+                                \"configurations\": [\n+                                    {\n+                                        \"configuration\": \"    \\\"Maximum Batch Size\\\" > 1 can improve storage efficiency by batching many FlowFiles together into 1 larger file that is stored.\\n\\n    Connect the success relationship to the input of any NiFi egress processor for offline storage.\\n\",\n+                                        \"processorClassName\": \"org.apache.nifi.processors.standard.PackageFlowFile\"\n+                                    },\n+                                    {\n+                                        \"configuration\": \"    \\\"Packaging Format\\\" = \\\"application/flowfile-v3\\\".\\n\\n    Connect the output of a NiFi ingress processor that reads files stored offline to the input of UnpackContent.\\n    If PackageFlowFile batches 99 FlowFiles into 1 file that is read from storage, then the original 99 FlowFiles will be output by UnpackContent.\\n\",\n+                                        \"processorClassName\": \"org.apache.nifi.processors.standard.UnpackContent\"\n+                                    }\n+                                ],\n+                                \"description\": \"Export FlowFile content and attributes from NiFi to external storage and reimport.\",\n+                                \"keywords\": [\n+                                    \"flowfile\",\n+                                    \"attributes\",\n+                                    \"content\",\n+                                    \"ffv3\",\n+                                    \"flowfile-stream-v3\",\n+                                    \"offline\",\n+                                    \"storage\"\n+                                ],\n+                                \"notes\": \"\"\n+                            }\n+                        ],\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                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"QUERY_PARSER_INPUT\",\n-                                \"required\": false,\n+                                \"name\": \"max-batch-size\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\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\": \"Where to route flow files if data enrichment query rendered no results\",\n-                                \"name\": \"not found\"\n+                                \"description\": \"The packaged FlowFile is sent to this relationship\",\n+                                \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"Where to route flow files after successfully enriching attributes with data\",\n-                                \"name\": \"found\"\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\": true,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"dns\",\n-                            \"enrich\",\n-                            \"ip\"\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.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+                        \"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                         \"useCases\": [],\n                         \"version\": \"2.0.0-M3\",\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+                                \"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-enrich-nar\",\n+                        \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -66249,211 +73505,204 @@\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"multiProcessorUseCases\": [],\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+                            \"ACCEPT_EMPTY_EXTENSIONS\": {\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+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n-                                        \"description\": \"Queries are made without any particular dialect\",\n-                                        \"displayName\": \"None\",\n-                                        \"value\": \"None\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"None\",\n-                                \"description\": \"The protocol used to perform the bulk query. \",\n-                                \"displayName\": \"Bulk Protocol\",\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\": \"BULK_PROTOCOL\",\n+                                \"name\": \"ACCEPT_EMPTY_EXTENSIONS\",\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+                            \"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\": \"KEY_GROUP\",\n-                                \"required\": false,\n+                                \"name\": \"APPEND_RAW_MESSAGE_TO_JSON\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"QUERY_INPUT\": {\n-                                \"description\": \"The value that should be used to populate the query\",\n-                                \"displayName\": \"Lookup value\",\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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"QUERY_INPUT\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"DATETIME_REPRESENTATION\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"QUERY_PARSER\": {\n+                            \"FIELDS_DESTINATION\": {\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+                                        \"description\": \"\",\n+                                        \"displayName\": \"flowfile-content\",\n+                                        \"value\": \"flowfile-content\"\n                                     },\n                                     {\n-                                        \"description\": \"Do not split results\",\n-                                        \"displayName\": \"None\",\n-                                        \"value\": \"None\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"flowfile-attribute\",\n+                                        \"value\": \"flowfile-attribute\"\n                                     }\n                                 ],\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\": \"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-                            \"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\": \"WHOIS_QUERY_TYPE\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"WHOIS_SERVER\": {\n-                                \"description\": \"The Whois server to be used\",\n-                                \"displayName\": \"Whois Server\",\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\": \"WHOIS_SERVER\",\n+                                \"name\": \"FIELDS_DESTINATION\",\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+                            \"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 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\": \"WHOIS_SERVER_PORT\",\n+                                \"name\": \"INCLUDE_CUSTOM_EXTENSIONS\",\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+                            \"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                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"WHOIS_TIMEOUT\",\n+                                \"name\": \"TIME_REPRESENTATION\",\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\": \"Where to route flow files if data enrichment query rendered no results\",\n-                                \"name\": \"not found\"\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\": \"Where to route flow files after successfully enriching attributes with data\",\n-                                \"name\": \"found\"\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                         ],\n                         \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"enrich\",\n-                            \"ip\",\n-                            \"whois\"\n+                            \"attributes\",\n+                            \"cef\",\n+                            \"event\",\n+                            \"logs\",\n+                            \"message\",\n+                            \"system\"\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+                        \"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                         \"useCases\": [],\n                         \"version\": \"2.0.0-M3\",\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+                                \"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-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\n-        },\n-        {\n-            \"artifact\": \"nifi-websocket-processors-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [],\n-                \"processors\": [\n+                    },\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-websocket-processors-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -66462,119 +73711,106 @@\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                         \"multiProcessorUseCases\": [],\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"websocket-client-controller-service\",\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\": \"2.0.0-M3\"\n-                                }\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+                            \"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\": \"websocket-client-id\",\n+                                \"name\": \"Character Set\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"sideEffectFree\": false,\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\": \"FlowFile holding connection configuration attributes (like URL or HTTP headers) in case of successful connection\",\n+                                \"description\": \"Any FlowFile that is successfully parsed as a Syslog message will be to this Relationship.\",\n                                 \"name\": \"success\"\n                             },\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\": \"FlowFile holding connection configuration attributes (like URL or HTTP headers) in case of connection failure\",\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\": \"The WebSocket session is established\",\n-                                \"name\": \"connected\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": false,\n+                        \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"WebSocket\",\n-                            \"consume\",\n-                            \"listen\",\n-                            \"subscribe\"\n+                            \"attributes\",\n+                            \"event\",\n+                            \"logs\",\n+                            \"message\",\n+                            \"syslog\",\n+                            \"system\"\n                         ],\n-                        \"triggerSerially\": true,\n+                        \"triggerSerially\": false,\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.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                         \"useCases\": [],\n                         \"version\": \"2.0.0-M3\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"WebSocket Controller Service id.\",\n-                                \"name\": \"websocket.controller.service.id\"\n+                                \"description\": \"The priority of the Syslog message.\",\n+                                \"name\": \"syslog.priority\"\n                             },\n                             {\n-                                \"description\": \"Established WebSocket session id.\",\n-                                \"name\": \"websocket.session.id\"\n+                                \"description\": \"The severity of the Syslog message derived from the priority.\",\n+                                \"name\": \"syslog.severity\"\n                             },\n                             {\n-                                \"description\": \"WebSocket endpoint id.\",\n-                                \"name\": \"websocket.endpoint.id\"\n+                                \"description\": \"The facility of the Syslog message derived from the priority.\",\n+                                \"name\": \"syslog.facility\"\n                             },\n                             {\n-                                \"description\": \"WebSocket client address.\",\n-                                \"name\": \"websocket.local.address\"\n+                                \"description\": \"The optional version from the Syslog message.\",\n+                                \"name\": \"syslog.version\"\n                             },\n                             {\n-                                \"description\": \"WebSocket server address.\",\n-                                \"name\": \"websocket.remote.address\"\n+                                \"description\": \"The timestamp of the Syslog message.\",\n+                                \"name\": \"syslog.timestamp\"\n                             },\n                             {\n-                                \"description\": \"TEXT or BINARY.\",\n-                                \"name\": \"websocket.message.type\"\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-websocket-processors-nar\",\n+                        \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -66583,111 +73819,175 @@\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                         \"multiProcessorUseCases\": [],\n                         \"primaryNodeOnly\": false,\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+                            \"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\": \"server-url-path\",\n+                                \"name\": \"Character Set\",\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+                            \"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, 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\": \"websocket-server-controller-service\",\n+                                \"name\": \"include_policy\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"nil_policy\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"The missing field will not have an attribute added.\",\n+                                        \"displayName\": \"OMIT\",\n+                                        \"value\": \"OMIT\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The missing field will have an empty attribute added.\",\n+                                        \"displayName\": \"NULL\",\n+                                        \"value\": \"NULL\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The missing field will have an attribute added with the value of '-'.\",\n+                                        \"displayName\": \"DASH\",\n+                                        \"value\": \"DASH\"\n+                                    }\n+                                ],\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\": \"nil_policy\",\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.WebSocketServerService\",\n-                                    \"version\": \"2.0.0-M3\"\n-                                }\n+                                \"sensitive\": false\n                             }\n                         },\n-                        \"sideEffectFree\": false,\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\": \"The WebSocket text message output\",\n-                                \"name\": \"text message\"\n-                            },\n-                            {\n-                                \"description\": \"The WebSocket binary message output\",\n-                                \"name\": \"binary message\"\n+                                \"description\": \"Any FlowFile that is successfully parsed as a Syslog message will be to this Relationship.\",\n+                                \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"The WebSocket session is established\",\n-                                \"name\": \"connected\"\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                         ],\n-                        \"supportsBatching\": false,\n+                        \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"WebSocket\",\n-                            \"consume\",\n-                            \"listen\",\n-                            \"subscribe\"\n+                            \"attributes\",\n+                            \"event\",\n+                            \"logs\",\n+                            \"message\",\n+                            \"syslog\",\n+                            \"syslog5424\",\n+                            \"system\"\n                         ],\n-                        \"triggerSerially\": true,\n+                        \"triggerSerially\": false,\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.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                         \"useCases\": [],\n                         \"version\": \"2.0.0-M3\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"WebSocket Controller Service id.\",\n-                                \"name\": \"websocket.controller.service.id\"\n+                                \"description\": \"The priority of the Syslog message.\",\n+                                \"name\": \"syslog.priority\"\n                             },\n                             {\n-                                \"description\": \"Established WebSocket session id.\",\n-                                \"name\": \"websocket.session.id\"\n+                                \"description\": \"The severity of the Syslog message derived from the priority.\",\n+                                \"name\": \"syslog.severity\"\n                             },\n                             {\n-                                \"description\": \"WebSocket endpoint id.\",\n-                                \"name\": \"websocket.endpoint.id\"\n+                                \"description\": \"The facility of the Syslog message derived from the priority.\",\n+                                \"name\": \"syslog.facility\"\n                             },\n                             {\n-                                \"description\": \"WebSocket server address.\",\n-                                \"name\": \"websocket.local.address\"\n+                                \"description\": \"The optional version from the Syslog message.\",\n+                                \"name\": \"syslog.version\"\n                             },\n                             {\n-                                \"description\": \"WebSocket client address.\",\n-                                \"name\": \"websocket.remote.address\"\n+                                \"description\": \"The timestamp of the Syslog message.\",\n+                                \"name\": \"syslog.timestamp\"\n                             },\n                             {\n-                                \"description\": \"TEXT or BINARY.\",\n-                                \"name\": \"websocket.message.type\"\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+                            },\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-websocket-processors-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -66695,1601 +73995,1243 @@\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                         \"multiProcessorUseCases\": [],\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"websocket-controller-service-id\",\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"websocket-endpoint-id\",\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+                            \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"websocket-message-type\",\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\": \"2.0.0-M3\"\n+                                }\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+                            \"record-writer\": {\n+                                \"description\": \"Specifies the Controller Service to use for writing out the records\",\n+                                \"displayName\": \"Record Writer\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"websocket-session-id\",\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\": \"2.0.0-M3\"\n+                                }\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+                        ],\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"FlowFiles that are sent successfully to the destination are transferred to this relationship.\",\n+                                \"description\": \"FlowFiles that are successfully partitioned will be 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\": \"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                         ],\n-                        \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": false,\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": true,\n                         \"supportsDynamicRelationships\": 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-                            \"WebSocket\",\n-                            \"publish\",\n-                            \"send\"\n+                            \"bin\",\n+                            \"group\",\n+                            \"organize\",\n+                            \"partition\",\n+                            \"record\",\n+                            \"recordpath\",\n+                            \"rpath\",\n+                            \"segment\",\n+                            \"split\"\n                         ],\n-                        \"triggerSerially\": true,\n+                        \"triggerSerially\": false,\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-                        \"useCases\": [],\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+                        \"useCases\": [\n+                            {\n+                                \"configuration\": \"Choose a RecordReader that is appropriate based on the format of the incoming data.\\nChoose a RecordWriter that writes the data in the desired output format.\\n\\nAdd a single additional property. The name of the property should describe the type of data that is being used to partition the data. The property's value should be a RecordPath that specifies which output FlowFile the Record belongs to.\\n\\nFor example, if we want to separate records based on their `transactionType` field, we could add a new property named `transactionType`. The value of the property might be `/transaction/type`. An input FlowFile will then be separated into as few FlowFiles as possible such that each output FlowFile has the same value for the `transactionType` field.\\n\",\n+                                \"description\": \"Separate records into separate FlowFiles so that all of the records in a FlowFile have the same value for a given field or set of fields.\",\n+                                \"keywords\": [\n+                                    \"separate\",\n+                                    \"split\",\n+                                    \"partition\",\n+                                    \"break apart\",\n+                                    \"colocate\",\n+                                    \"segregate\",\n+                                    \"record\",\n+                                    \"field\",\n+                                    \"recordpath\"\n+                                ],\n+                                \"notes\": \"\"\n+                            },\n+                            {\n+                                \"configuration\": \"Choose a RecordReader that is appropriate based on the format of the incoming data.\\nChoose a RecordWriter that writes the data in the desired output format.\\n\\nAdd a single additional property. The name of the property should describe the criteria. The property's value should be a RecordPath that returns `true` if the Record meets the criteria or `false` otherwise.\\n\\nFor example, if we want to separate records based on whether or not they have a transaction total of more than $1,000 we could add a new property named `largeTransaction` with a value of `/transaction/total > 1000`. This will create two FlowFiles. In the first, all records will have a total over `1000`. In the second, all records will have a transaction less than or equal to 1000. Each FlowFile will have an attribute named `largeTransaction` with a value of `true` or `false`.\\n\",\n+                                \"description\": \"Separate records based on whether or not they adhere to a specific criteria\",\n+                                \"keywords\": [\n+                                    \"separate\",\n+                                    \"split\",\n+                                    \"partition\",\n+                                    \"break apart\",\n+                                    \"segregate\",\n+                                    \"record\",\n+                                    \"field\",\n+                                    \"recordpath\",\n+                                    \"criteria\"\n+                                ],\n+                                \"notes\": \"\"\n+                            }\n+                        ],\n                         \"version\": \"2.0.0-M3\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"WebSocket Controller Service id.\",\n-                                \"name\": \"websocket.controller.service.id\"\n+                                \"description\": \"The number of records in an outgoing FlowFile\",\n+                                \"name\": \"record.count\"\n                             },\n                             {\n-                                \"description\": \"Established WebSocket session id.\",\n-                                \"name\": \"websocket.session.id\"\n+                                \"description\": \"The MIME Type that the configured Record Writer indicates is appropriate\",\n+                                \"name\": \"mime.type\"\n                             },\n                             {\n-                                \"description\": \"WebSocket endpoint id.\",\n-                                \"name\": \"websocket.endpoint.id\"\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\": \"TEXT or BINARY.\",\n-                                \"name\": \"websocket.message.type\"\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\": \"WebSocket server address.\",\n-                                \"name\": \"websocket.local.address\"\n+                                \"description\": \"The number of partitioned FlowFiles generated from the parent FlowFile\",\n+                                \"name\": \"fragment.count\"\n                             },\n                             {\n-                                \"description\": \"WebSocket client address.\",\n-                                \"name\": \"websocket.remote.address\"\n+                                \"description\": \"The filename of the parent FlowFile\",\n+                                \"name\": \"segment.original.filename \"\n                             },\n                             {\n-                                \"description\": \"Detail of the failure.\",\n-                                \"name\": \"websocket.failure.detail\"\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-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"2.0.0-M3\"\n-        },\n-        {\n-            \"artifact\": \"nifi-db-schema-registry-service-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [\n+                    },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-db-schema-registry-service-nar\",\n+                        \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\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+                        \"multiProcessorUseCases\": [],\n+                        \"primaryNodeOnly\": false,\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+                            \"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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Catalog Name\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Data Record Path\",\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 for retrieving table information.\",\n-                                \"displayName\": \"Database Connection Pooling Service\",\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. (Debezium style operation types are also supported: \\\"r\\\" and \\\"c\\\" for INSERT, \\\"u\\\" for UPDATE, and \\\"d\\\" for DELETE)\",\n+                                \"displayName\": \"Statement Type Record Path\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Database Connection Pooling Service\",\n+                                \"name\": \"Statement Type Record Path\",\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\": \"2.0.0-M3\"\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Schema Name\",\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\": \"2.0.0-M3\"\n-                            }\n-                        ],\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"database\",\n-                            \"registry\",\n-                            \"schema\",\n-                            \"table\"\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-                        \"version\": \"2.0.0-M3\"\n-                    }\n-                ],\n-                \"processors\": [],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"2.0.0-M3\"\n-        },\n-        {\n-            \"artifact\": \"nifi-slack-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-slack-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"f2215c6\"\n-                        },\n-                        \"group\": \"org.apache.nifi\",\n-                        \"propertyDescriptors\": {\n-                            \"access-token\": {\n-                                \"description\": \"Bot OAuth Token used for authenticating and authorizing the Slack request sent by NiFi.\",\n-                                \"displayName\": \"Access Token\",\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.\",\n+                                \"displayName\": \"Database Session AutoCommit\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"access-token\",\n-                                \"required\": true,\n-                                \"sensitive\": true\n+                                \"name\": \"database-session-autocommit\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n                             },\n-                            \"api-url\": {\n-                                \"defaultValue\": \"https://slack.com/api\",\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\": \"API URL\",\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                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"api-url\",\n-                                \"required\": true,\n+                                \"name\": \"db-type\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"channel-id\": {\n-                                \"description\": \"Slack channel, private group, or IM channel to send the message to. Use Channel ID instead of the name.\",\n-                                \"displayName\": \"Channel ID\",\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                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"channel-id\",\n+                                \"name\": \"put-db-record-allow-multiple-statements\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"input-character-set\": {\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\": \"Specifies the character set of the records used to generate the Slack message.\",\n-                                \"displayName\": \"Input Character Set\",\n+                                \"description\": \"The format to be applied when decoding string values to binary.\",\n+                                \"displayName\": \"Binary String Format\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"input-character-set\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"put-db-record-binary-format\",\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+                            \"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\": \"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\": \"2.0.0-M3\"\n-                                }\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"put-db-record-catalog-name\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n                             },\n-                            \"web-service-client-provider\": {\n-                                \"description\": \"Controller service to provide HTTP client for communicating with Slack API\",\n-                                \"displayName\": \"Web Service Client Provider\",\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\": \"web-service-client-provider\",\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.web.client.provider.api.WebClientServiceProvider\",\n+                                    \"type\": \"org.apache.nifi.dbcp.DBCPService\",\n                                     \"version\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\n-                            }\n-                        ],\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"record\",\n-                            \"sink\",\n-                            \"slack\"\n-                        ],\n-                        \"type\": \"org.apache.nifi.services.slack.SlackRecordSink\",\n-                        \"typeDescription\": \"Format and send Records to a configured Channel using the Slack Post Message API. The service requires a Slack App with a Bot User configured for access to a Slack workspace. The Bot User OAuth Bearer Token is required for posting messages to Slack.\",\n-                        \"version\": \"2.0.0-M3\"\n-                    }\n-                ],\n-                \"processors\": [\n-                    {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-slack-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"f2215c6\"\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_FORBIDDEN\",\n-                        \"multiProcessorUseCases\": [],\n-                        \"primaryNodeOnly\": true,\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. It must be granted the channels:history, groups:history, im:history, or mpim:history scope, depending on the type of conversation being used.\",\n-                                \"displayName\": \"Access Token\",\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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Access Token\",\n-                                \"required\": true,\n-                                \"sensitive\": true\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"put-db-record-field-containing-sql\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n                             },\n-                            \"Batch Size\": {\n-                                \"defaultValue\": \"100\",\n-                                \"description\": \"The maximum number of messages to retrieve in a single request to Slack. The entire response will be parsed into memory, so it is important that this be kept in mind when setting this value.\",\n-                                \"displayName\": \"Batch Size\",\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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Batch Size\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables 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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"put-db-record-query-timeout\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Channels\": {\n-                                \"description\": \"A comma-separated list of Slack Channels to Retrieve Messages From. Each element in the list may be either a Channel ID, such as C0L9VCD47, or (for public channels only) the name of a channel, prefixed with a # sign, such as #general. If any channel name is provided instead,instead of an ID, the Access Token provided must be granted the channels:read scope in order to resolve the Channel ID. See the Processor's Additional Details for information on how to find a Channel ID.\",\n-                                \"displayName\": \"Channels\",\n+                            \"put-db-record-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                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Channels\",\n-                                \"required\": true,\n+                                \"name\": \"put-db-record-quoted-identifiers\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Include Message Blocks\": {\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\": \"Specifies whether or not the output JSON should include the value of the 'blocks' field for each Slack Message. This field includes information such as individual parts of a message that are formatted using rich text. This may be useful, for instance, for parsing. However, it often accounts for a significant portion of the data and as such may be set to null when it is not useful to you.\",\n-                                \"displayName\": \"Include Message Blocks\",\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 Message Blocks\",\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\": \"2.0.0-M3\"\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\": \"Environment variables 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\": \"\",\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"put-db-record-statement-type\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Include Null Fields\": {\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\": \"Environment variables 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\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n                                 \"defaultValue\": \"true\",\n-                                \"description\": \"Specifies whether or not fields that have null values should be included in the output JSON. If true, any field in a Slack Message that has a null value will be included in the JSON with a value of null. If false, the key omitted from the output JSON entirely. Omitting null values results in smaller messages that are generally more efficient to process, but including the values may provide a better understanding of the format, especially for schema inference.\",\n-                                \"displayName\": \"Include Null Fields\",\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\": \"Include Null Fields\",\n-                                \"required\": true,\n+                                \"name\": \"put-db-record-translate-field-names\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Reply Monitor Frequency\": {\n-                                \"defaultValue\": \"5 mins\",\n-                                \"description\": \"After consuming all messages in a given channel, this Processor will periodically poll all \\\"threaded messages\\\", aka Replies, whose timestamp falls between now and the amount of time specified by the <Reply Monitor Window> property. This property determines how frequently those messages are polled. Setting the value to a shorter duration may result in replies to messages being captured more quickly, providing a lower latency. However, it will also result in additional resource use and could trigger Rate Limiting to occur.\",\n-                                \"displayName\": \"Reply Monitor Frequency\",\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\": \"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\": \"Reply Monitor Frequency\",\n-                                \"required\": true,\n+                                \"name\": \"put-db-record-unmatched-column-behavior\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Reply Monitor Window\": {\n-                                \"defaultValue\": \"7 days\",\n-                                \"description\": \"After consuming all messages in a given channel, this Processor will periodically poll all \\\"threaded messages\\\", aka Replies, whose timestamp is between now and this amount of time in the past in order to check for any new replies. Setting this value to a larger value may result in additional resource use and may result in Rate Limiting. However, if a user replies to an old thread that was started outside of this window, the reply may not be captured.\",\n-                                \"displayName\": \"Reply Monitor Window\",\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                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Reply Monitor Window\",\n-                                \"required\": true,\n+                                \"name\": \"put-db-record-unmatched-field-behavior\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Resolve Usernames\": {\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\": \"Environment variables 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\": \"\",\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 User IDs should be resolved to usernames. By default, Slack Messages provide the ID of the user that sends a message, such as U0123456789, but not the username, such as NiFiUser. The username may be resolved, but it may require additional calls to the Slack API and requires that the Token used be granted the users:read scope. If set to true, usernames will be resolved with a best-effort policy: if a username cannot be obtained, it will be skipped over. Also, note that when a username is obtained, the Message's <username> field is populated, and the <text> field is updated such that any mention will be output such as \\\"Hi @user\\\" instead of \\\"Hi <@U1234567>\\\".\",\n-                                \"displayName\": \"Resolve Usernames\",\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\": \"Resolve Usernames\",\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-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.slack.ListenSlack\"\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-                        \"stateful\": {\n-                            \"description\": \"Maintains a mapping of Slack Channel IDs to the timestamp of the last message that was retrieved for that channel. This allows the processor to only retrieve messages that have been posted since the last time the processor was run. This state is stored in the cluster so that if the Primary Node changes, the new node will pick up where the previous node left off.\",\n-                            \"scopes\": [\n-                                \"CLUSTER\"\n-                            ]\n-                        },\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"Slack messages that are successfully received will be routed to this relationship\",\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\": \"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                         ],\n                         \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"conversation\",\n-                            \"conversation.history\",\n-                            \"slack\",\n-                            \"social media\",\n-                            \"team\",\n-                            \"text\",\n-                            \"unstructured\"\n+                            \"database\",\n+                            \"delete\",\n+                            \"insert\",\n+                            \"jdbc\",\n+                            \"put\",\n+                            \"record\",\n+                            \"sql\",\n+                            \"update\"\n                         ],\n-                        \"triggerSerially\": true,\n+                        \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.slack.ConsumeSlack\",\n-                        \"typeDescription\": \"Retrieves messages from one or more configured Slack channels. The messages are written out in JSON format. See Usage / Additional Details for more information about how to configure this Processor and enable it to retrieve messages from Slack.\",\n-                        \"useCases\": [],\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+                        \"useCases\": [\n+                            {\n+                                \"configuration\": \"\",\n+                                \"description\": \"Insert records into a database\",\n+                                \"keywords\": [],\n+                                \"notes\": \"\"\n+                            }\n+                        ],\n                         \"version\": \"2.0.0-M3\",\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 number of slack messages that are included in the FlowFile\",\n-                                \"name\": \"slack.message.count\"\n-                            },\n-                            {\n-                                \"description\": \"Set to application/json, as the output will always be in JSON format\",\n-                                \"name\": \"mime.type\"\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\": true,\n-                        \"artifact\": \"nifi-slack-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\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\": \"250 millis\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"multiProcessorUseCases\": [],\n-                        \"primaryNodeOnly\": true,\n+                        \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"App Token\": {\n-                                \"description\": \"The Application Token that is registered to your Slack application\",\n-                                \"displayName\": \"App Token\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"App Token\",\n-                                \"required\": true,\n-                                \"sensitive\": true\n-                            },\n-                            \"Bot Token\": {\n-                                \"description\": \"The Bot Token that is registered to your Slack application\",\n-                                \"displayName\": \"Bot Token\",\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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Bot Token\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Cache Entry Identifier\",\n                                 \"required\": true,\n-                                \"sensitive\": true\n+                                \"sensitive\": false\n                             },\n-                            \"Event Type to Receive\": {\n+                            \"Cache update strategy\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"The Processor is to receive only slack messages that mention the bot user (App Mention Events)\",\n-                                        \"displayName\": \"Receive App Mention Events\",\n-                                        \"value\": \"Receive App Mention Events\"\n-                                    },\n-                                    {\n-                                        \"description\": \"The Processor is to receive Slack Message Events\",\n-                                        \"displayName\": \"Receive Message Events\",\n-                                        \"value\": \"Receive Message Events\"\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\": \"The Processor is to receive Commands from Slack that are specific to your application. The Processor will not receive Message Events.\",\n-                                        \"displayName\": \"Receive Commands\",\n-                                        \"value\": \"Receive Commands\"\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\": \"Receive App Mention Events\",\n-                                \"description\": \"Specifies the type of Event that the Processor should respond to\",\n-                                \"displayName\": \"Event Type to Receive\",\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\": \"Event Type to Receive\",\n+                                \"name\": \"Cache update strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Resolve User Details\": {\n-                                \"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-                                            \"Receive App Mention Events\",\n-                                            \"Receive Message Events\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Event Type to Receive\",\n-                                        \"propertyName\": \"Event Type to Receive\"\n-                                    }\n-                                ],\n-                                \"description\": \"Specifies whether the Processor should lookup details about the Slack User who sent the received message. If true, the output JSON will contain an additional field named 'userDetails'. The 'user' field will still contain the ID of the user. In order to enable this capability, the Bot Token must be granted the 'users:read' and optionally the 'users.profile:read' Bot Token Scope. If the rate limit is exceeded when retrieving this information, the received message will be rejected and must be re-delivered.\",\n-                                \"displayName\": \"Resolve User Details\",\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\": \"Resolve User Details\",\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\": \"2.0.0-M3\"\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                         \"seeAlso\": [\n-                            \"org.apache.nifi.processors.slack.ConsumeSlack\"\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\": \"All FlowFiles that are created will be sent to this Relationship.\",\n+                                \"description\": \"Any FlowFile that is successfully inserted into cache will be routed 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+                                \"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                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"command\",\n-                            \"event\",\n-                            \"listen\",\n-                            \"message\",\n-                            \"real-time\",\n-                            \"receive\",\n-                            \"slack\",\n-                            \"social media\",\n-                            \"team\",\n-                            \"text\",\n-                            \"unstructured\"\n+                            \"cache\",\n+                            \"distributed\",\n+                            \"map\",\n+                            \"put\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.slack.ListenSlack\",\n-                        \"typeDescription\": \"Retrieves real-time messages or Slack commands from one or more Slack conversations. The messages are written out in JSON format. Note that this Processor should be used to obtain real-time messages and commands from Slack and does not provide a mechanism for obtaining historical messages. The ConsumeSlack Processor should be used for an initial load of messages from a channel. See Usage / Additional Details for more information about how to configure this Processor and enable it to retrieve messages and commands from Slack.\",\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                         \"useCases\": [],\n                         \"version\": \"2.0.0-M3\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"Set to application/json, as the output will always be in JSON format\",\n-                                \"name\": \"mime.type\"\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-slack-nar\",\n+                        \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\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+                        \"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-                        \"multiProcessorUseCases\": [\n-                            {\n-                                \"configurations\": [\n+                        \"multiProcessorUseCases\": [],\n+                        \"primaryNodeOnly\": false,\n+                        \"propertyDescriptors\": {\n+                            \"Attach File\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"configuration\": \"Set \\\"Destination\\\" to \\\"flowfile-attribute\\\"\\n\\nAdd a new property named \\\"thread.ts\\\" with a value of `$.threadTs`\\nAdd a new property named \\\"message.ts\\\" with a value of `$.ts`\\nAdd a new property named \\\"channel.id\\\" with a value of `$.channel`\\nAdd a new property named \\\"user.id\\\" with a value of `$.user`\\n\\nConnect the \\\"matched\\\" Relationship to PublishSlack.\\n\",\n-                                        \"processorClassName\": \"org.apache.nifi.processors.standard.EvaluateJsonPath\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n-                                        \"configuration\": \"Set \\\"Access Token\\\" to the value of your Slack OAuth Access Token.\\nSet \\\"Channel\\\" to `${'channel.id'}`\\nSet \\\"Publish Strategy\\\" to \\\"Use 'Message Text' Property\\\".\\nSet \\\"Message Text\\\" to the text that you would like to send as the response. If desired, you can reference the user of the original message by including the text `<@${'user.id'}>`.\\n    For example: `Hey, <@${'user.id'}>, thanks for asking...`\\nSet \\\"Include FlowFile Content as Attachment\\\" to \\\"false\\\".\\nSet \\\"Thread Timestamp\\\" to `${'thread.ts':replaceEmpty( ${'message.ts'} )}`\\n\",\n-                                        \"processorClassName\": \"org.apache.nifi.processors.slack.PublishSlack\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"description\": \"Respond to a Slack message in a thread.\",\n-                                \"keywords\": [\n-                                    \"slack\",\n-                                    \"respond\",\n-                                    \"reply\",\n-                                    \"thread\"\n-                                ],\n-                                \"notes\": \"\"\n-                            }\n-                        ],\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+                                \"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\": \"Access Token\",\n+                                \"name\": \"Attach File\",\n                                 \"required\": true,\n-                                \"sensitive\": true\n+                                \"sensitive\": false\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+                            \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Channel\",\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\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"CC\",\n+                                \"required\": false,\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Content Type\",\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+                            \"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\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Character Set\",\n+                                \"name\": \"From\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Include FlowFile Content as Attachment\": {\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-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"Use 'Message Text' Property\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Publish Strategy\",\n-                                        \"propertyName\": \"Publish Strategy\"\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+                                \"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\": \"Include FlowFile Content as Attachment\",\n+                                \"name\": \"Include All Attributes In Message\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\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\": \"Max FlowFile Size\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\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+                            \"Message\": {\n+                                \"description\": \"The body of the email message\",\n+                                \"displayName\": \"Message\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Message Text\",\n-                                \"required\": true,\n+                                \"name\": \"Message\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Publish Strategy\": {\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-                                    },\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-                                    }\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+                            \"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\": \"Publish Strategy\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"SMTP Auth\",\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+                            \"SMTP Hostname\": {\n+                                \"description\": \"The hostname of the SMTP host\",\n+                                \"displayName\": \"SMTP Hostname\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Thread Timestamp\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            }\n-                        },\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.slack.ConsumeSlack\",\n-                            \"org.apache.nifi.processors.slack.ListenSlack\"\n-                        ],\n-                        \"sideEffectFree\": false,\n-                        \"supportedRelationships\": [\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-                                \"name\": \"failure\"\n-                            },\n-                            {\n-                                \"description\": \"FlowFiles are routed to success after being successfully sent to Slack\",\n-                                \"name\": \"success\"\n-                            }\n-                        ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": 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-                        ],\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\\nthe 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\\na file attachment.\\n\",\n-                        \"useCases\": [\n-                            {\n-                                \"configuration\": \"Set \\\"Access Token\\\" to the value of your Slack OAuth Access Token.\\nSet \\\"Channel\\\" to the ID of the channel or the name of the channel prefixed with the # symbol. For example, \\\"C0123456789\\\" or \\\"#general\\\".\\nSet \\\"Publish Strategy\\\" to \\\"Use 'Message Text' Property\\\".\\nSet \\\"Message Text\\\" to the text that you would like to send as the Slack message.\\nSet \\\"Include FlowFile Content as Attachment\\\" to \\\"true\\\" if the FlowFile's contents should be attached as a file, or \\\"false\\\" to send just the message text without an attachment.\\n\",\n-                                \"description\": \"Send specific text as a message to Slack, optionally including the FlowFile's contents as an attached file.\",\n-                                \"keywords\": [],\n-                                \"notes\": \"\"\n-                            },\n-                            {\n-                                \"configuration\": \"Set \\\"Access Token\\\" to the value of your Slack OAuth Access Token.\\nSet \\\"Channel\\\" to the ID of the channel or the name of the channel prefixed with the # symbol. For example, \\\"C0123456789\\\" or \\\"#general\\\".\\nSet \\\"Publish Strategy\\\" to \\\"Send FlowFile Content as Message\\\".\\n\",\n-                                \"description\": \"Send the contents of the FlowFile as a message to Slack.\",\n-                                \"keywords\": [],\n-                                \"notes\": \"\"\n-                            }\n-                        ],\n-                        \"version\": \"2.0.0-M3\",\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-                    }\n-                ],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"2.0.0-M3\"\n-        },\n-        {\n-            \"artifact\": \"nifi-key-service-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-key-service-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"f2215c6\"\n-                        },\n-                        \"group\": \"org.apache.nifi\",\n-                        \"propertyDescriptors\": {\n-                            \"key\": {\n-                                \"description\": \"Private Key structured using PKCS8 and encoded as PEM\",\n-                                \"displayName\": \"Key\",\n-                                \"dynamic\": false,\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.key.service.api.PrivateKeyService\",\n-                                \"version\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\n-                    }\n-                ],\n-                \"processors\": [],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"2.0.0-M3\"\n-        },\n-        {\n-            \"artifact\": \"nifi-framework-kubernetes-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [],\n-                \"processors\": [],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"2.0.0-M3\"\n-        },\n-        {\n-            \"artifact\": \"nifi-registry-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-registry-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"f2215c6\"\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-                        \"group\": \"org.apache.nifi\",\n-                        \"propertyDescriptors\": {\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\": \"avro-reg-validated-field-names\",\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\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-registry-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"f2215c6\"\n-                        },\n-                        \"dynamicProperties\": [\n-                            {\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-                        \"propertyDescriptors\": {\n-                            \"JSON Schema Version\": {\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-                                    },\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-                                \"description\": \"The JSON schema specification\",\n-                                \"displayName\": \"JSON Schema Version\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"JSON Schema Version\",\n+                                \"name\": \"SMTP 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.schemaregistry.services.JsonSchemaRegistry\",\n-                                \"version\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\n-                    }\n-                ],\n-                \"processors\": [],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"2.0.0-M3\"\n-        },\n-        {\n-            \"artifact\": \"nifi-snmp-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [],\n-                \"processors\": [\n-                    {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-snmp-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"f2215c6\"\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-                        \"multiProcessorUseCases\": [],\n-                        \"primaryNodeOnly\": false,\n-                        \"propertyDescriptors\": {\n-                            \"snmp-authentication-passphrase\": {\n+                            },\n+                            \"SMTP Password\": {\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"authPriv\",\n-                                            \"authNoPriv\"\n+                                            \"password-based-authorization-mode\"\n                                         ],\n-                                        \"propertyDisplayName\": \"SNMP Security Level\",\n-                                        \"propertyName\": \"snmp-security-level\"\n+                                        \"propertyDisplayName\": \"Authorization Mode\",\n+                                        \"propertyName\": \"authorization-mode\"\n                                     }\n                                 ],\n-                                \"description\": \"Passphrase used for SNMP authentication protocol.\",\n-                                \"displayName\": \"SNMP Authentication Passphrase\",\n+                                \"description\": \"Password for the SMTP account\",\n+                                \"displayName\": \"SMTP Password\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"snmp-authentication-passphrase\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"SMTP Password\",\n+                                \"required\": false,\n                                 \"sensitive\": true\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+                            \"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\": \"snmp-authentication-protocol\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"SMTP Port\",\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+                            \"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\": \"snmp-community\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"SMTP Socket Factory\",\n                                 \"required\": true,\n-                                \"sensitive\": true\n+                                \"sensitive\": false\n                             },\n-                            \"snmp-hostname\": {\n-                                \"defaultValue\": \"localhost\",\n-                                \"description\": \"Hostname or network address of the SNMP Agent.\",\n-                                \"displayName\": \"SNMP Agent Hostname\",\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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"snmp-hostname\",\n+                                \"name\": \"SMTP TLS\",\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+                            \"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\": \"snmp-oid\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"SMTP Username\",\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+                            \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"snmp-port\",\n+                                \"name\": \"SMTP X-Mailer Header\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\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+                            \"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\": \"snmp-private-protocol\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Subject\",\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+                            \"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\": \"snmp-private-protocol-passphrase\",\n-                                \"required\": true,\n-                                \"sensitive\": true\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"To\",\n+                                \"required\": false,\n+                                \"sensitive\": false\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+                            \"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\": \"snmp-retries\",\n+                                \"name\": \"attribute-name-regex\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"snmp-security-level\": {\n+                            \"authorization-mode\": {\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+                                        \"description\": \"Use password\",\n+                                        \"displayName\": \"Use Password\",\n+                                        \"value\": \"password-based-authorization-mode\"\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\": \"Use OAuth2 to acquire access token\",\n+                                        \"displayName\": \"Use OAuth2\",\n+                                        \"value\": \"oauth-based-authorization-mode\"\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\": \"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\": \"snmp-security-level\",\n+                                \"name\": \"authorization-mode\",\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+                            \"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\": \"snmp-security-name\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"email-ff-content-as-message\",\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+                            \"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\": \"snmp-strategy\",\n+                                \"name\": \"input-character-set\",\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"snmp-textual-oid\",\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"snmp-timeout\",\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+                            \"oauth2-access-token-provider\": {\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"SNMP version 3 with improved security\",\n-                                        \"displayName\": \"v3\",\n-                                        \"value\": \"SNMPv3\"\n+                                        \"dependentValues\": [\n+                                            \"oauth-based-authorization-mode\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Authorization Mode\",\n+                                        \"propertyName\": \"authorization-mode\"\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+                                \"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\": \"snmp-version\",\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\": \"2.0.0-M3\"\n+                                }\n                             }\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\": \"FlowFiles that are successfully sent will be 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+                                \"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                         ],\n-                        \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": false,\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": true,\n                         \"supportsDynamicRelationships\": false,\n-                        \"supportsSensitiveDynamicProperties\": 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-                            \"get\",\n-                            \"oid\",\n-                            \"snmp\",\n-                            \"walk\"\n+                            \"email\",\n+                            \"notify\",\n+                            \"put\",\n+                            \"smtp\"\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+                        \"type\": \"org.apache.nifi.processors.standard.PutEmail\",\n+                        \"typeDescription\": \"Sends an e-mail to configured recipients for each incoming FlowFile\",\n                         \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\",\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+                        \"version\": \"2.0.0-M3\"\n                     },\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-snmp-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -68297,770 +75239,493 @@\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_FORBIDDEN\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"multiProcessorUseCases\": [],\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\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+                            \"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\": \"snmp-manager-port\",\n+                                \"name\": \"Batch Size\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"snmp-security-level\": {\n+                            \"Conflict Resolution\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Communication without authentication and privacy.\",\n-                                        \"displayName\": \"noAuthNoPriv\",\n-                                        \"value\": \"noAuthNoPriv\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"REPLACE\",\n+                                        \"value\": \"REPLACE\"\n                                     },\n                                     {\n-                                        \"description\": \"Communication with authentication and without privacy.\",\n-                                        \"displayName\": \"authNoPriv\",\n-                                        \"value\": \"authNoPriv\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"IGNORE\",\n+                                        \"value\": \"IGNORE\"\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\": \"snmp-security-level\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"snmp-usm-security-names\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"SNMPv3\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"SNMP Version\",\n-                                        \"propertyName\": \"snmp-version\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"RENAME\",\n+                                        \"value\": \"RENAME\"\n                                     },\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"noAuthNoPriv\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"SNMP Security Level\",\n-                                        \"propertyName\": \"snmp-security-level\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"REJECT\",\n+                                        \"value\": \"REJECT\"\n                                     },\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"usm-security-names\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"USM Users Source\",\n-                                        \"propertyName\": \"snmp-usm-users-source\"\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\": \"snmp-usm-security-names\",\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+                                        \"description\": \"\",\n+                                        \"displayName\": \"FAIL\",\n+                                        \"value\": \"FAIL\"\n                                     },\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"usm-json-file-path\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"USM Users Source\",\n-                                        \"propertyName\": \"snmp-usm-users-source\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"NONE\",\n+                                        \"value\": \"NONE\"\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+                                \"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\": \"snmp-usm-users-file-path\",\n-                                \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\"\n-                                    ]\n-                                },\n+                                \"name\": \"Conflict Resolution\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"snmp-usm-users-json-content\": {\n-                                \"dependencies\": [\n+                            \"Connection Mode\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"SNMPv3\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"SNMP Version\",\n-                                        \"propertyName\": \"snmp-version\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Active\",\n+                                        \"value\": \"Active\"\n                                     },\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"usm-json-content\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"USM Users Source\",\n-                                        \"propertyName\": \"snmp-usm-users-source\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Passive\",\n+                                        \"value\": \"Passive\"\n                                     }\n                                 ],\n-                                \"description\": \"The JSON containing the user credentials for SNMPv3. Check Usage for more details.\",\n-                                \"displayName\": \"USM Users JSON content\",\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\": \"snmp-usm-users-json-content\",\n+                                \"name\": \"Connection Mode\",\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+                            \"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\": \"snmp-usm-users-source\",\n+                                \"name\": \"Connection Timeout\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"snmp-version\": {\n+                            \"Create Directory\": {\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\": \"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\": \"snmp-version\",\n+                                \"name\": \"Create Directory\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n-                            }\n-                        },\n-                        \"sideEffectFree\": false,\n-                        \"supportedRelationships\": [\n-                            {\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-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"listen\",\n-                            \"snmp\",\n-                            \"trap\"\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-                        \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\",\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-                            }\n-                        ]\n-                    },\n-                    {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-snmp-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"f2215c6\"\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-                        \"multiProcessorUseCases\": [],\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+                            \"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\": \"snmp-authentication-passphrase\",\n+                                \"name\": \"Data Timeout\",\n                                 \"required\": true,\n-                                \"sensitive\": true\n+                                \"sensitive\": false\n                             },\n-                            \"snmp-authentication-protocol\": {\n+                            \"Dot Rename\": {\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\": \"true\",\n+                                        \"value\": \"true\"\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\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"description\": \"Hash based authentication protocol for secure authentication.\",\n-                                \"displayName\": \"SNMP Authentication Protocol\",\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\": \"snmp-authentication-protocol\",\n-                                \"required\": true,\n+                                \"name\": \"Dot Rename\",\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"snmp-community\",\n-                                \"required\": true,\n-                                \"sensitive\": true\n-                            },\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+                            \"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\": \"snmp-private-protocol\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Hostname\",\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+                            \"Http Proxy Password\": {\n+                                \"description\": \"Http Proxy Password\",\n+                                \"displayName\": \"Http Proxy Password\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"snmp-private-protocol-passphrase\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Http Proxy Password\",\n+                                \"required\": false,\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+                            \"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\": \"snmp-retries\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Http Proxy Username\",\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+                            \"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\": \"snmp-security-level\",\n-                                \"required\": true,\n+                                \"name\": \"Internal Buffer 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+                            \"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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"snmp-security-name\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Last Modified Time\",\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+                            \"Password\": {\n+                                \"description\": \"Password for the user account\",\n+                                \"displayName\": \"Password\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"snmp-timeout\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Password\",\n                                 \"required\": false,\n-                                \"sensitive\": false\n+                                \"sensitive\": true\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+                            \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"snmp-trap-agent-address\",\n-                                \"required\": true,\n+                                \"name\": \"Permissions\",\n+                                \"required\": false,\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+                            \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"snmp-trap-enterprise-oid\",\n+                                \"name\": \"Port\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"snmp-trap-generic-type\": {\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Proxy Port\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Proxy 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+                                        \"description\": \"\",\n+                                        \"displayName\": \"DIRECT\",\n+                                        \"value\": \"DIRECT\"\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+                                        \"description\": \"\",\n+                                        \"displayName\": \"HTTP\",\n+                                        \"value\": \"HTTP\"\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+                                        \"description\": \"\",\n+                                        \"displayName\": \"SOCKS\",\n+                                        \"value\": \"SOCKS\"\n                                     }\n                                 ],\n-                                \"dependencies\": [\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+                            \"Reject Zero-Byte Files\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"SNMPv1\"\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\": \"Generic trap type is an integer in the range of 0 to 6. See processor usage for details.\",\n-                                \"displayName\": \"Generic Trap Type\",\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\": \"snmp-trap-generic-type\",\n-                                \"required\": true,\n+                                \"name\": \"Reject Zero-Byte Files\",\n+                                \"required\": false,\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+                            \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"snmp-trap-manager-host\",\n-                                \"required\": true,\n+                                \"name\": \"Remote Path\",\n+                                \"required\": false,\n                                 \"sensitive\": false\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+                            \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"snmp-trap-manager-port\",\n-                                \"required\": true,\n+                                \"name\": \"Temporary Filename\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"snmp-trap-oid-value\": {\n-                                \"dependencies\": [\n+                            \"Transfer Mode\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"SNMPv3\",\n-                                            \"SNMPv2c\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"SNMP Version\",\n-                                        \"propertyName\": \"snmp-version\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Binary\",\n+                                        \"value\": \"Binary\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"ASCII\",\n+                                        \"value\": \"ASCII\"\n                                     }\n                                 ],\n-                                \"description\": \"The value of the trap OID.\",\n-                                \"displayName\": \"Trap OID Value\",\n+                                \"defaultValue\": \"Binary\",\n+                                \"description\": \"The FTP Transfer Mode\",\n+                                \"displayName\": \"Transfer Mode\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"snmp-trap-oid-value\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Transfer Mode\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"snmp-trap-specific-type\": {\n-                                \"dependencies\": [\n+                            \"Use Compression\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"6\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Generic Trap Type\",\n-                                        \"propertyName\": \"snmp-trap-generic-type\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"SNMPv1\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"SNMP Version\",\n-                                        \"propertyName\": \"snmp-version\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\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+                                \"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\": \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"snmp-trap-specific-type\",\n-                                \"required\": false,\n+                                \"name\": \"Username\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"snmp-version\": {\n+                            \"ftp-use-utf8\": {\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\": \"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\": \"snmp-version\",\n+                                \"name\": \"ftp-use-utf8\",\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\": \"2.0.0-M3\"\n+                                }\n                             }\n                         },\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.standard.GetFTP\"\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\": \"FlowFiles that are successfully sent will be 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+                                \"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                                 \"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                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"send\",\n-                            \"snmp\",\n-                            \"trap\"\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.snmp.processors.SendTrapSNMP\",\n-                        \"typeDescription\": \"Sends information to SNMP Manager.\",\n+                        \"type\": \"org.apache.nifi.processors.standard.PutFTP\",\n+                        \"typeDescription\": \"Sends FlowFiles to an FTP Server\",\n                         \"useCases\": [],\n                         \"version\": \"2.0.0-M3\"\n                     },\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-snmp-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -69068,386 +75733,186 @@\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                         \"multiProcessorUseCases\": [],\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-                                \"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+                            \"Conflict Resolution Strategy\": {\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+                                        \"description\": \"\",\n+                                        \"displayName\": \"replace\",\n+                                        \"value\": \"replace\"\n                                     },\n                                     {\n-                                        \"description\": \"Provides authentication based on the HMAC-SHA-2 algorithm.\",\n-                                        \"displayName\": \"SHA384\",\n-                                        \"value\": \"HMAC256SHA384\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"ignore\",\n+                                        \"value\": \"ignore\"\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\": \"fail\",\n+                                        \"value\": \"fail\"\n                                     }\n                                 ],\n-                                \"description\": \"Hash based authentication protocol for secure authentication.\",\n-                                \"displayName\": \"SNMP Authentication Protocol\",\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\": \"snmp-authentication-protocol\",\n+                                \"name\": \"Conflict Resolution Strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"snmp-community\": {\n-                                \"defaultValue\": \"public\",\n-                                \"dependencies\": [\n+                            \"Create Missing Directories\": {\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\": \"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\": \"snmp-community\",\n+                                \"name\": \"Create Missing Directories\",\n                                 \"required\": true,\n-                                \"sensitive\": true\n+                                \"sensitive\": false\n                             },\n-                            \"snmp-hostname\": {\n-                                \"defaultValue\": \"localhost\",\n-                                \"description\": \"Hostname or network address of the SNMP Agent.\",\n-                                \"displayName\": \"SNMP Agent Hostname\",\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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"snmp-hostname\",\n+                                \"name\": \"Directory\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"snmp-port\": {\n-                                \"defaultValue\": \"161\",\n-                                \"description\": \"Port of the SNMP Agent.\",\n-                                \"displayName\": \"SNMP Agent Port\",\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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"snmp-port\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\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\": \"snmp-private-protocol\",\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"snmp-retries\",\n+                                \"name\": \"Group\",\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+                            \"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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"snmp-security-level\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Last Modified Time\",\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+                            \"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\": \"snmp-security-name\",\n-                                \"required\": true,\n+                                \"name\": \"Maximum File Count\",\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+                            \"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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"snmp-timeout\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Owner\",\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+                            \"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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"snmp-version\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables 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.processors.standard.FetchFile\",\n+                            \"org.apache.nifi.processors.standard.GetFile\"\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\": \"Files that have been successfully written to the output directory are transferred to this relationship\",\n                                 \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"All FlowFiles that failed during the SNMP Set care 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                         ],\n-                        \"supportsBatching\": false,\n+                        \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"oid\",\n-                            \"set\",\n-                            \"snmp\"\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.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+                        \"type\": \"org.apache.nifi.processors.standard.PutFile\",\n+                        \"typeDescription\": \"Writes the contents of a FlowFile to the local file system\",\n                         \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\",\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\": \"2.0.0-M3\"\n-        },\n-        {\n-            \"artifact\": \"nifi-jslt-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [],\n-                \"processors\": [\n+                        \"version\": \"2.0.0-M3\"\n+                    },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-jslt-nar\",\n+                        \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -69460,168 +75925,109 @@\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"multiProcessorUseCases\": [],\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"jslt-transform-cache-size\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"jslt-transform-pretty_print\": {\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\": \"Apply pretty-print formatting to the output of the JSLT transform\",\n-                                \"displayName\": \"Pretty Print\",\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\": \"jslt-transform-pretty_print\",\n+                                \"name\": \"put-record-include-zero-record-results\",\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+                            \"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\": \"jslt-transform-result-filter\",\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"jslt-transform-transformation\",\n+                                \"name\": \"put-record-reader\",\n                                 \"required\": true,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\",\n-                                        \"TEXT\"\n-                                    ]\n-                                },\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\": \"2.0.0-M3\"\n+                                }\n                             },\n-                            \"jslt-transform-transformation-strategy\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Apply transformation to entire FlowFile content JSON\",\n-                                        \"displayName\": \"Entire FlowFile\",\n-                                        \"value\": \"ENTIRE_FLOWFILE\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Apply transformation each JSON Object in an array\",\n-                                        \"displayName\": \"Each JSON Object\",\n-                                        \"value\": \"EACH_OBJECT\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"EACH_OBJECT\",\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+                            \"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\": \"jslt-transform-transformation-strategy\",\n+                                \"name\": \"put-record-sink\",\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.record.sink.RecordSinkService\",\n+                                    \"version\": \"2.0.0-M3\"\n+                                }\n                             }\n                         },\n-                        \"sideEffectFree\": true,\n+                        \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"The FlowFile with transformed content will be routed to this relationship\",\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\": \"If a FlowFile fails processing for any reason (for example, the FlowFile is not valid JSON), it will be routed to this relationship\",\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                         ],\n-                        \"supportsBatching\": true,\n+                        \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": 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-                            \"jslt\",\n-                            \"json\",\n-                            \"transform\"\n+                            \"put\",\n+                            \"record\",\n+                            \"sink\"\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.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                         \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"Always set to application/json\",\n-                                \"name\": \"mime.type\"\n-                            }\n-                        ]\n-                    }\n-                ],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\n-        },\n-        {\n-            \"artifact\": \"nifi-amqp-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [],\n-                \"processors\": [\n+                        \"version\": \"2.0.0-M3\"\n+                    },\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-amqp-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -69630,682 +76036,569 @@\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                         \"multiProcessorUseCases\": [],\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+                            \"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\": \"AMQP Version\",\n+                                \"name\": \"Batch Size\",\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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+                            \"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\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Host Name\",\n+                                \"name\": \"Ciphers Allowed\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Password\": {\n-                                \"description\": \"Password used for authentication and authorization.\",\n-                                \"displayName\": \"Password\",\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                                 \"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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Port\",\n-                                \"required\": false,\n+                                \"name\": \"Conflict Resolution\",\n+                                \"required\": true,\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+                            \"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\": \"Queue\",\n+                                \"name\": \"Connection Timeout\",\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Virtual Host\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"auto.acknowledge\": {\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\": \" 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\": \"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\": \"auto.acknowledge\",\n+                                \"name\": \"Create Directory\",\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+                            \"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\": \"batch.size\",\n+                                \"name\": \"Data Timeout\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"cert-authentication\": {\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\": \"Authenticate using the SSL certificate rather than user name/password.\",\n-                                \"displayName\": \"Use Client Certificate Authentication\",\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\": \"cert-authentication\",\n+                                \"name\": \"Disable Directory Listing\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"header.format\": {\n+                            \"Dot Rename\": {\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\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\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\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\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\": \"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\": \"header.key.prefix\",\n-                                \"required\": true,\n+                                \"name\": \"Dot Rename\",\n+                                \"required\": false,\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+                            \"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\": \"header.separator\",\n+                                \"name\": \"Host Key File\",\n                                 \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"SINGLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\"\n+                                    ]\n+                                },\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+                            \"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\": \"prefetch.count\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Hostname\",\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+                            \"Http Proxy Password\": {\n+                                \"description\": \"Http Proxy Password\",\n+                                \"displayName\": \"Http Proxy Password\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"remove.curly.braces\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Http Proxy Password\",\n                                 \"required\": false,\n-                                \"sensitive\": 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+                            \"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\": \"ssl-context-service\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Http Proxy 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.ssl.SSLContextService\",\n-                                    \"version\": \"2.0.0-M3\"\n-                                }\n-                            }\n-                        },\n-                        \"sideEffectFree\": false,\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"All FlowFiles that are received from the AMQP queue 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-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\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.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-                        \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\",\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+                                \"sensitive\": false\n                             },\n-                            {\n-                                \"description\": \"The exchange from which AMQP Message was received\",\n-                                \"name\": \"amqp$exchange\"\n-                            }\n-                        ]\n-                    },\n-                    {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-amqp-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"f2215c6\"\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-                        \"multiProcessorUseCases\": [],\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+                            \"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\": \"AMQP Version\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Key Algorithms Allowed\",\n+                                \"required\": false,\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+                            \"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\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Brokers\",\n+                                \"name\": \"Key Exchange Algorithms Allowed\",\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+                            \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Exchange Name\",\n-                                \"required\": true,\n+                                \"name\": \"Last Modified Time\",\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+                            \"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\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Host Name\",\n+                                \"name\": \"Message Authentication Codes Allowed\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n                             \"Password\": {\n-                                \"description\": \"Password used for authentication and authorization.\",\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\": \"Environment variables 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\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Permissions\",\n+                                \"required\": false,\n+                                \"sensitive\": false\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+                                \"defaultValue\": \"22\",\n+                                \"description\": \"The port that the remote system is listening on for file transfers\",\n                                 \"displayName\": \"Port\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n                                 \"name\": \"Port\",\n-                                \"required\": false,\n+                                \"required\": true,\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+                            \"Private Key Passphrase\": {\n+                                \"description\": \"Password for the private key\",\n+                                \"displayName\": \"Private Key Passphrase\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Routing Key\",\n-                                \"required\": true,\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\": \"Environment variables 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-                            \"User Name\": {\n-                                \"description\": \"User Name used for authentication and authorization.\",\n-                                \"displayName\": \"User Name\",\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\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"User Name\",\n+                                \"name\": \"Proxy Host\",\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+                            \"Proxy Port\": {\n+                                \"description\": \"The port of the proxy server\",\n+                                \"displayName\": \"Proxy Port\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Virtual Host\",\n+                                \"name\": \"Proxy Port\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"cert-authentication\": {\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+                            \"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\": \"false\",\n-                                \"description\": \"Authenticate using the SSL certificate rather than user name/password.\",\n-                                \"displayName\": \"Use Client Certificate Authentication\",\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\": \"cert-authentication\",\n+                                \"name\": \"Reject Zero-Byte Files\",\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+                            \"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\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Remote Group\",\n+                                \"required\": false,\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables 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\": \"Environment variables 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\": \"header.separator\",\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+                            \"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\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Temporary Filename\",\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+                            \"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\": \"ssl-context-service\",\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\": \"Environment variables 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: 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.ssl.SSLContextService\",\n+                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n                                     \"version\": \"2.0.0-M3\"\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.standard.GetSFTP\"\n                         ],\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"All FlowFiles that are sent to the AMQP destination are routed to this relationship\",\n+                                \"description\": \"FlowFiles that are successfully sent will be routed to success\",\n                                 \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"All FlowFiles that cannot be routed to the AMQP destination are routed to this relationship\",\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                                 \"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                         \"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+                            \"archive\",\n+                            \"copy\",\n+                            \"egress\",\n+                            \"files\",\n                             \"put\",\n-                            \"rabbit\",\n-                            \"send\"\n+                            \"remote\",\n+                            \"sftp\"\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+                        \"type\": \"org.apache.nifi.processors.standard.PutSFTP\",\n+                        \"typeDescription\": \"Sends FlowFiles to an SFTP Server\",\n                         \"useCases\": [],\n                         \"version\": \"2.0.0-M3\"\n-                    }\n-                ],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"2.0.0-M3\"\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\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -70313,298 +76606,237 @@\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                         \"multiProcessorUseCases\": [],\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+                            \"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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Character Set\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Batch Size\",\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Input Language\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Target Language\": {\n-                                \"defaultValue\": \"en\",\n-                                \"description\": \"The language to translate the text into\",\n-                                \"displayName\": \"Target Language\",\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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Target Language\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\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\": \"2.0.0-M3\"\n+                                }\n                             },\n-                            \"Translate Content\": {\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\": \"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+                                \"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\": \"Translate Content\",\n-                                \"required\": true,\n+                                \"name\": \"Obtain Generated Keys\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Yandex API Key\": {\n-                                \"description\": \"The API Key that is registered with Yandex\",\n-                                \"displayName\": \"Yandex API Key\",\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                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Yandex API Key\",\n-                                \"required\": true,\n+                                \"name\": \"Support Fragmented Transactions\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n-                            }\n-                        },\n-                        \"sideEffectFree\": false,\n-                        \"supportedRelationships\": [\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-                            {\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-                        ],\n-                        \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": true,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"language\",\n-                            \"translate\",\n-                            \"translation\",\n-                            \"yandex\"\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-                        \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\",\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-                            }\n-                        ]\n-                    }\n-                ],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"2.0.0-M3\"\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\": \"f2215c6\"\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. 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-                        \"multiProcessorUseCases\": [],\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+                            \"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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"groovyx-additional-classpath\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Transaction Timeout\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"groovyx-failure-strategy\": {\n+                            \"database-session-autocommit\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"rollback\",\n-                                        \"value\": \"rollback\"\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"transfer to failure\",\n-                                        \"value\": \"transfer to failure\"\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\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+                                \"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\": \"groovyx-failure-strategy\",\n-                                \"required\": true,\n+                                \"name\": \"database-session-autocommit\",\n+                                \"required\": false,\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+                            \"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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"groovyx-script-body\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"putsql-sql-statement\",\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+                            \"rollback-on-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\": \"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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"groovyx-script-file\",\n-                                \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\"\n-                                    ]\n-                                },\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"rollback-on-failure\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"restricted\": 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.script.ExecuteScript\"\n+                            \"org.apache.nifi.processors.standard.ConvertJSONToSQL\"\n                         ],\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"FlowFiles that were successfully processed\",\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                                 \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"FlowFiles that failed to be processed\",\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                         ],\n-                        \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": true,\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"groovy\",\n-                            \"groovyx\",\n-                            \"script\"\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.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.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                         \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\"\n-                    }\n-                ],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"2.0.0-M3\"\n-        },\n-        {\n-            \"artifact\": \"nifi-email-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [],\n-                \"processors\": [\n+                        \"version\": \"2.0.0-M3\",\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\": true,\n-                        \"artifact\": \"nifi-email-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -70613,253 +76845,240 @@\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                         \"multiProcessorUseCases\": [],\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\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+                            \"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\": \"Mark Messages as Read\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Batch Size\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Use SSL\": {\n-                                \"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+                            \"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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Use SSL\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Character Set\",\n                                 \"required\": true,\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+                            \"Hostname\": {\n+                                \"defaultValue\": \"localhost\",\n+                                \"description\": \"The IP address or hostname of the Syslog server.\",\n+                                \"displayName\": \"Hostname\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"authorization-mode\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Hostname\",\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+                            \"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\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"connection.timeout\",\n+                                \"name\": \"Idle Connection Expiration\",\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+                            \"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\": \"delete.messages\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Max Size of Socket Send Buffer\",\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+                            \"Message Body\": {\n+                                \"description\": \"The body for the Syslog messages.\",\n+                                \"displayName\": \"Message Body\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"fetch.size\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Message Body\",\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+                            \"Message Hostname\": {\n+                                \"defaultValue\": \"${hostname(true)}\",\n+                                \"description\": \"The hostname for the Syslog messages.\",\n+                                \"displayName\": \"Message Hostname\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"folder\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Message Hostname\",\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+                            \"Message Priority\": {\n+                                \"description\": \"The priority for the Syslog messages, excluding < >.\",\n+                                \"displayName\": \"Message Priority\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables 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\": \"Environment variables 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\": \"Environment variables 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\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"host\",\n+                                \"name\": \"Port\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"oauth2-access-token-provider\": {\n-                                \"dependencies\": [\n+                            \"Protocol\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"oauth-based-authorization-mode\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Authorization Mode\",\n-                                        \"propertyName\": \"authorization-mode\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"TCP\",\n+                                        \"value\": \"TCP\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"UDP\",\n+                                        \"value\": \"UDP\"\n                                     }\n                                 ],\n-                                \"description\": \"OAuth2 service that can provide access tokens.\",\n-                                \"displayName\": \"OAuth2 Access Token Provider\",\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\": \"oauth2-access-token-provider\",\n+                                \"name\": \"Protocol\",\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\": \"2.0.0-M3\"\n-                                }\n+                                \"sensitive\": false\n                             },\n-                            \"password\": {\n+                            \"SSL Context Service\": {\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"password-based-authorization-mode\"\n+                                            \"TCP\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Authorization Mode\",\n-                                        \"propertyName\": \"authorization-mode\"\n+                                        \"propertyDisplayName\": \"Protocol\",\n+                                        \"propertyName\": \"Protocol\"\n                                     }\n                                 ],\n-                                \"description\": \"Password used for authentication and authorization with Email server.\",\n-                                \"displayName\": \"Password\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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+                                \"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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"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\": \"2.0.0-M3\"\n+                                }\n                             },\n-                            \"user\": {\n-                                \"description\": \"User Name used for authentication and authorization with Email server.\",\n-                                \"displayName\": \"User Name\",\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\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"user\",\n-                                \"required\": true,\n+                                \"name\": \"Timeout\",\n+                                \"required\": false,\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\": \"All messages that are the are successfully received from Email server and converted to FlowFiles are routed to this relationship\",\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+                            },\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                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"Consume\",\n-                            \"Email\",\n-                            \"Get\",\n-                            \"Imap\",\n-                            \"Ingest\",\n-                            \"Ingress\",\n-                            \"Message\"\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.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+                        \"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                         \"useCases\": [],\n                         \"version\": \"2.0.0-M3\"\n                     },\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-email-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -70868,282 +77087,270 @@\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                         \"multiProcessorUseCases\": [],\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+                            \"Character Set\": {\n+                                \"defaultValue\": \"UTF-8\",\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"Use OAuth2 to acquire access token\",\n-                                        \"displayName\": \"Use OAuth2\",\n-                                        \"value\": \"oauth-based-authorization-mode\"\n+                                        \"dependentValues\": [\n+                                            \"FLOWFILE_ORIENTED\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Transmission Strategy\",\n+                                        \"propertyName\": \"Transmission Strategy\"\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+                                \"description\": \"Specifies the character set of the data being sent.\",\n+                                \"displayName\": \"Character Set\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"connection.timeout\",\n+                                \"name\": \"Character Set\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"delete.messages\": {\n+                            \"Connection Per 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\": \"Specify whether mail messages should be deleted after retrieval.\",\n-                                \"displayName\": \"Delete Messages\",\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\": \"delete.messages\",\n+                                \"name\": \"Connection Per FlowFile\",\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+                            \"Hostname\": {\n+                                \"defaultValue\": \"localhost\",\n+                                \"description\": \"Destination hostname or IP address\",\n+                                \"displayName\": \"Hostname\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"fetch.size\",\n+                                \"name\": \"Hostname\",\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+                            \"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\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"folder\",\n+                                \"name\": \"Idle Connection Expiration\",\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+                            \"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\": \"Max Size of Socket Send Buffer\",\n+                                \"required\": true,\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables 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\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"host\",\n+                                \"name\": \"Port\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"oauth2-access-token-provider\": {\n+                            \"Record Reader\": {\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"oauth-based-authorization-mode\"\n+                                            \"RECORD_ORIENTED\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Authorization Mode\",\n-                                        \"propertyName\": \"authorization-mode\"\n+                                        \"propertyDisplayName\": \"Transmission Strategy\",\n+                                        \"propertyName\": \"Transmission Strategy\"\n                                     }\n                                 ],\n-                                \"description\": \"OAuth2 service that can provide access tokens.\",\n-                                \"displayName\": \"OAuth2 Access Token Provider\",\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\": \"oauth2-access-token-provider\",\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.oauth2.OAuth2AccessTokenProvider\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n                                     \"version\": \"2.0.0-M3\"\n                                 }\n                             },\n-                            \"password\": {\n+                            \"Record Writer\": {\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"password-based-authorization-mode\"\n+                                            \"RECORD_ORIENTED\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Authorization Mode\",\n-                                        \"propertyName\": \"authorization-mode\"\n+                                        \"propertyDisplayName\": \"Transmission Strategy\",\n+                                        \"propertyName\": \"Transmission Strategy\"\n                                     }\n                                 ],\n-                                \"description\": \"Password used for authentication and authorization with Email server.\",\n-                                \"displayName\": \"Password\",\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"password\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Record Writer\",\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.RecordSetWriterFactory\",\n+                                    \"version\": \"2.0.0-M3\"\n+                                }\n                             },\n-                            \"port\": {\n-                                \"description\": \"Numeric value identifying Port of Email server (e.g., 993)\",\n-                                \"displayName\": \"Port\",\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\": \"2.0.0-M3\"\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\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"port\",\n-                                \"required\": true,\n+                                \"name\": \"Timeout\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"user\": {\n-                                \"description\": \"User Name used for authentication and authorization with Email server.\",\n-                                \"displayName\": \"User Name\",\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"user\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Transmission Strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\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\": \"All messages that are the are successfully received from Email server and converted to 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-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\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-                        \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\"\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-email-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"f2215c6\"\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-                        \"multiProcessorUseCases\": [],\n-                        \"primaryNodeOnly\": false,\n-                        \"sideEffectFree\": true,\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"Each individual attachment will be routed to the attachments relationship\",\n-                                \"name\": \"attachments\"\n                             },\n                             {\n-                                \"description\": \"FlowFiles that could not be parsed\",\n+                                \"description\": \"FlowFiles that failed to send to the destination are sent out this relationship.\",\n                                 \"name\": \"failure\"\n-                            },\n-                            {\n-                                \"description\": \"The original file\",\n-                                \"name\": \"original\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"email\",\n-                            \"split\"\n+                            \"egress\",\n+                            \"put\",\n+                            \"remote\",\n+                            \"tcp\"\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.PutTCP\",\n+                        \"typeDescription\": \"Sends serialized FlowFiles or Records over TCP to a configurable destination with optional support for TLS\",\n                         \"useCases\": [],\n                         \"version\": \"2.0.0-M3\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"The filename of the attachment\",\n-                                \"name\": \"filename \"\n-                            },\n-                            {\n-                                \"description\": \"The filename of the parent FlowFile\",\n-                                \"name\": \"email.attachment.parent.filename \"\n-                            },\n-                            {\n-                                \"description\": \"The UUID of the original FlowFile.\",\n-                                \"name\": \"email.attachment.parent.uuid\"\n-                            },\n-                            {\n-                                \"description\": \"The mime type of the attachment.\",\n-                                \"name\": \"mime.type\"\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-email-nar\",\n+                        \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -71156,1571 +77363,1523 @@\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"multiProcessorUseCases\": [],\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+                            \"Hostname\": {\n+                                \"defaultValue\": \"localhost\",\n+                                \"description\": \"Destination hostname or IP address\",\n+                                \"displayName\": \"Hostname\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"CAPTURED_HEADERS\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Hostname\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"STRICT_ADDRESS_PARSING\": {\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-                                        \"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-                                        \"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+                            \"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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"STRICT_ADDRESS_PARSING\",\n+                                \"name\": \"Max Size of Socket Send Buffer\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Port\": {\n+                                \"description\": \"Destination port number\",\n+                                \"displayName\": \"Port\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Port\",\n+                                \"required\": true,\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Timeout\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"sideEffectFree\": 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\": \"Extraction was successful\",\n+                                \"description\": \"FlowFiles that are sent successfully to the destination are sent out this relationship.\",\n                                 \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"Flowfiles that could not be parsed as a RFC-2822 compliant message\",\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                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"email\",\n-                            \"split\"\n+                            \"egress\",\n+                            \"put\",\n+                            \"remote\",\n+                            \"udp\"\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.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                         \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\",\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-                            },\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+                        \"version\": \"2.0.0-M3\"\n                     },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-email-nar\",\n+                        \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\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\": \"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\": \"ENVIRONMENT\",\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_REQUIRED\",\n+                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n                         \"multiProcessorUseCases\": [],\n-                        \"primaryNodeOnly\": false,\n-                        \"sideEffectFree\": true,\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"Each individual attachment will be routed to the attachments relationship\",\n-                                \"name\": \"attachments\"\n-                            },\n-                            {\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-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\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-                        \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"The filename of the attachment\",\n-                                \"name\": \"filename \"\n-                            },\n-                            {\n-                                \"description\": \"The filename of the parent FlowFile\",\n-                                \"name\": \"email.tnef.attachment.parent.filename \"\n-                            },\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\": \"f2215c6\"\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-                        \"multiProcessorUseCases\": [],\n-                        \"primaryNodeOnly\": false,\n+                        \"primaryNodeOnly\": true,\n                         \"propertyDescriptors\": {\n-                            \"CLIENT_AUTH\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"NONE\",\n-                                        \"value\": \"NONE\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"REQUIRED\",\n-                                        \"value\": \"REQUIRED\"\n-                                    }\n-                                ],\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\": \"CLIENT_AUTH\",\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+                            \"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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"SMTP_HOSTNAME\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Columns to Return\",\n                                 \"required\": false,\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"SMTP_MAXIMUM_CONNECTIONS\",\n-                                \"required\": true,\n-                                \"sensitive\": false\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"SMTP_MAXIMUM_MSG_SIZE\",\n-                                \"required\": true,\n-                                \"sensitive\": false\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"SMTP_PORT\",\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+                            \"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\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"SMTP_TIMEOUT\",\n+                                \"name\": \"Database Connection Pooling Service\",\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+                                    \"type\": \"org.apache.nifi.dbcp.DBCPService\",\n                                     \"version\": \"2.0.0-M3\"\n                                 }\n-                            }\n-                        },\n-                        \"sideEffectFree\": false,\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"All new messages will be routed as FlowFiles 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-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"email\",\n-                            \"listen\",\n-                            \"smtp\"\n-                        ],\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-                        \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\",\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+                            \"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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Fetch Size\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             },\n-                            {\n-                                \"description\": \"The values used during RCPT TO (i.e. envelope)\",\n-                                \"name\": \"smtp.recipient.*\"\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\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Max Wait Time\",\n+                                \"required\": true,\n+                                \"sensitive\": false\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\": \"2.0.0-M3\"\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\": \"f2215c6\"\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+                            \"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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"domain\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Maximum-value Columns\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"enable-dfs\": {\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-                                \"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+                                \"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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"password\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Set Auto Commit\",\n                                 \"required\": false,\n-                                \"sensitive\": true\n-                            },\n-                            \"port\": {\n-                                \"defaultValue\": \"445\",\n-                                \"description\": \"Port to use for connection.\",\n-                                \"displayName\": \"Port\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"port\",\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+                            \"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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"share\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Table Name\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"smb-dialect\": {\n+                            \"db-fetch-db-type\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"AUTO\",\n-                                        \"value\": \"AUTO\"\n+                                        \"description\": \"Generates ANSI SQL\",\n+                                        \"displayName\": \"Generic\",\n+                                        \"value\": \"Generic\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SMB 2.0.2\",\n-                                        \"value\": \"SMB_2_0_2\"\n+                                        \"description\": \"Generates Oracle compliant SQL\",\n+                                        \"displayName\": \"Oracle\",\n+                                        \"value\": \"Oracle\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SMB 2.1\",\n-                                        \"value\": \"SMB_2_1\"\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\": \"SMB 3.0\",\n-                                        \"value\": \"SMB_3_0\"\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\": \"SMB 3.0.2\",\n-                                        \"value\": \"SMB_3_0_2\"\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\": \"SMB 3.1.1\",\n-                                        \"value\": \"SMB_3_1_1\"\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\": \"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+                                \"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\": \"smb-dialect\",\n+                                \"name\": \"db-fetch-db-type\",\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+                            \"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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"timeout\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"Environment variables 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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"dbf-default-precision\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"use-encryption\": {\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"dbf-default-scale\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\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\": \"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\": \"use-encryption\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\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\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\n-                    }\n-                ],\n-                \"processors\": [],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"2.0.0-M3\"\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\": \"f2215c6\"\n-                        },\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+                                \"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\": \"cache-expiration\",\n+                                \"name\": \"dbf-normalize\",\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+                            \"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 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\": \"cache-size\",\n+                                \"name\": \"dbf-user-logical-types\",\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\": \"2.0.0-M3\"\n-                                }\n-                            },\n-                            \"zendesk-authentication-type-name\": {\n+                            \"initial-load-strategy\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Password of Zendesk login user.\",\n-                                        \"displayName\": \"Password\",\n-                                        \"value\": \"password\"\n+                                        \"description\": \"Loads all existing rows from the database table.\",\n+                                        \"displayName\": \"Start at Beginning\",\n+                                        \"value\": \"Start at Beginning\"\n                                     },\n                                     {\n-                                        \"description\": \"Authentication token generated in Zendesk Admin menu for API access.\",\n-                                        \"displayName\": \"Token\",\n-                                        \"value\": \"token\"\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-                                \"description\": \"Type of authentication to Zendesk API.\",\n-                                \"displayName\": \"Authentication Type\",\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\": \"zendesk-authentication-type-name\",\n+                                \"name\": \"initial-load-strategy\",\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\": \"Environment variables 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+                            \"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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"zendesk-comment-body\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"qdbt-max-frags\",\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\": \"Environment variables 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+                            \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"zendesk-subdomain\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"qdbt-max-rows\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"zendesk-subject\": {\n-                                \"description\": \"The content or the path to the subject in the incoming record.\",\n-                                \"displayName\": \"Subject\",\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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"zendesk-subject\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"qdbt-output-batch-size\",\n+                                \"required\": true,\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+                            \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"zendesk-type\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"transaction-isolation-level\",\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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"zendesk-user\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n                             }\n                         },\n-                        \"providedApiImplementations\": [\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-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.record.sink.RecordSinkService\",\n-                                \"version\": \"2.0.0-M3\"\n+                                \"description\": \"Successfully created FlowFile from SQL query result set.\",\n+                                \"name\": \"success\"\n                             }\n                         ],\n-                        \"supportsDynamicProperties\": false,\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": false,\n+                        \"supportsDynamicProperties\": true,\n+                        \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"record\",\n-                            \"sink\",\n-                            \"zendesk\"\n+                            \"database\",\n+                            \"jdbc\",\n+                            \"query\",\n+                            \"select\",\n+                            \"sql\"\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\": \"2.0.0-M3\"\n-                    }\n-                ],\n-                \"processors\": [],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"2.0.0-M3\"\n-        },\n-        {\n-            \"artifact\": \"nifi-social-media-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [],\n-                \"processors\": [\n+                        \"triggerSerially\": true,\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 Environment/System properties 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+                        \"useCases\": [],\n+                        \"version\": \"2.0.0-M3\",\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+                    },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-social-media-nar\",\n+                        \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\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\": \"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\": \"ENVIRONMENT\",\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-                        \"multiProcessorUseCases\": [],\n+                        \"multiProcessorUseCases\": [\n+                            {\n+                                \"configurations\": [\n+                                    {\n+                                        \"configuration\": \"Configure the \\\"Database Connection Pooling Service\\\" property to specify a Connection Pool that is applicable for interacting with your database.\\n\\nSet the \\\"Catalog\\\" property to the name of the database Catalog;\\nset the \\\"Schema Pattern\\\" property to a Java Regular Expression that matches all database Schemas that should be included; and\\nset the \\\"Table Name Pattern\\\" property to a Java Regular Expression that matches the names of all tables that should be included.\\nIn order to perform an incremental load of all tables, leave the Catalog, Schema Pattern, and Table Name Pattern unset.\\n\\nLeave the RecordWriter property unset.\\n\\nConnect the 'success' relationship to QueryDatabaseTableRecord.\\n\",\n+                                        \"processorClassName\": \"org.apache.nifi.processors.standard.ListDatabaseTables\"\n+                                    },\n+                                    {\n+                                        \"configuration\": \"Configure the \\\"Database Connection Pooling Service\\\" to the same Connection Pool that was used in ListDatabaseTables.\\nSet the \\\"Database Type\\\" property to the type of database to query, or \\\"Generic\\\" if the database vendor is not listed.\\nSet the \\\"Table Name\\\" property to \\\"${db.table.fullname}\\\"\\nConfigure the \\\"Record Writer\\\" to specify a Record Writer that is appropriate for the desired output format.\\nSet the \\\"Maximum-value Columns\\\" property to a comma-separated list of columns whose values can be used to determine which values are new. For example, this might be set to\\n    an `id` column that is a one-up number, or a `last_modified` column that is a timestamp of when the row was last modified.\\nSet the \\\"Initial Load Strategy\\\" property to \\\"Start at Current Maximum Values\\\".\\nSet the \\\"Fetch Size\\\" to a number that avoids loading too much data into memory on the NiFi side. For example, a value of `1000` will load up to 1,000 rows of data.\\nSet the \\\"Max Rows Per Flow File\\\" to a value that allows efficient processing, such as `1000` or `10000`.\\nSet the \\\"Output Batch Size\\\" property to a value greater than `0`. A smaller value, such as `1` or even `20` will result in lower latency but also slightly lower throughput.\\n    A larger value such as `1000` will result in higher throughput but also higher latency. It is not recommended to set the value larger than `1000` as it can cause significant\\n    memory utilization.\\n\",\n+                                        \"processorClassName\": \"org.apache.nifi.processors.standard.QueryDatabaseTableRecord\"\n+                                    }\n+                                ],\n+                                \"description\": \"Perform an incremental load of multiple database tables, fetching only new rows as they are added to the tables.\",\n+                                \"keywords\": [\n+                                    \"incremental load\",\n+                                    \"rdbms\",\n+                                    \"jdbc\",\n+                                    \"cdc\",\n+                                    \"database\",\n+                                    \"table\",\n+                                    \"stream\"\n+                                ],\n+                                \"notes\": \"\"\n+                            }\n+                        ],\n                         \"primaryNodeOnly\": true,\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+                            \"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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"backfill-minutes\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Columns to Return\",\n+                                \"required\": false,\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+                            \"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\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"backoff-attempts\",\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\": \"2.0.0-M3\"\n+                                }\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+                            \"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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"backoff-time\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Fetch Size\",\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+                            \"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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"base-path\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Max Wait Time\",\n                                 \"required\": true,\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+                            \"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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"batch-size\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Maximum-value Columns\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\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\": \"bearer-token\",\n-                                \"required\": true,\n-                                \"sensitive\": true\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+                            \"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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"connect-timeout\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Set Auto Commit\",\n+                                \"required\": false,\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+                            \"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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"expansions\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Table Name\",\n+                                \"required\": true,\n                                 \"sensitive\": false\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+                            \"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\": \"maximum-backoff-time\",\n+                                \"name\": \"db-fetch-db-type\",\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+                            \"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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"media-fields\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"db-fetch-sql-query\",\n                                 \"required\": false,\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+                            \"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\": \"place-fields\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"db-fetch-where-clause\",\n                                 \"required\": false,\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+                            \"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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"poll-fields\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"dbf-default-precision\",\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+                            \"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\": \"queue-size\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"dbf-default-scale\",\n                                 \"required\": true,\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+                            \"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 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\": \"read-timeout\",\n+                                \"name\": \"dbf-user-logical-types\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"stream-endpoint\": {\n+                            \"initial-load-strategy\": {\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\": \"Loads all existing rows from the database table.\",\n+                                        \"displayName\": \"Start at Beginning\",\n+                                        \"value\": \"Start at Beginning\"\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\": \"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\": \"Sample Endpoint\",\n-                                \"description\": \"The source from which the processor will consume Tweets.\",\n-                                \"displayName\": \"Stream Endpoint\",\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\": \"stream-endpoint\",\n+                                \"name\": \"initial-load-strategy\",\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+                            \"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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"qdbt-max-rows\",\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"qdbt-output-batch-size\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\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 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\": \"tweet-fields\",\n-                                \"required\": false,\n+                                \"name\": \"qdbtr-normalize\",\n+                                \"required\": true,\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+                            \"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\": \"user-fields\",\n-                                \"required\": false,\n-                                \"sensitive\": false\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\": \"2.0.0-M3\"\n+                                }\n                             }\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\": \"FlowFiles containing an array of one or more Tweets\",\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\": true,\n-                        \"supportsDynamicProperties\": false,\n+                        \"supportsBatching\": false,\n+                        \"supportsDynamicProperties\": true,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"json\",\n-                            \"social media\",\n-                            \"status\",\n-                            \"tweets\",\n-                            \"twitter\"\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.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-                        \"useCases\": [],\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 Environment/System properties 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+                        \"useCases\": [\n+                            {\n+                                \"configuration\": \"Configure the \\\"Database Connection Pooling Service\\\" to specify a Connection Pooling Service so that the Processor knows how to connect to the database.\\nSet the \\\"Database Type\\\" property to the type of database to query, or \\\"Generic\\\" if the database vendor is not listed.\\nSet the \\\"Table Name\\\" property to the name of the table to retrieve records from.\\nConfigure the \\\"Record Writer\\\" to specify a Record Writer that is appropriate for the desired output format.\\nSet the \\\"Maximum-value Columns\\\" property to a comma-separated list of columns whose values can be used to determine which values are new. For example, this might be set to\\n    an `id` column that is a one-up number, or a `last_modified` column that is a timestamp of when the row was last modified.\\nSet the \\\"Initial Load Strategy\\\" property to \\\"Start at Beginning\\\".\\nSet the \\\"Fetch Size\\\" to a number that avoids loading too much data into memory on the NiFi side. For example, a value of `1000` will load up to 1,000 rows of data.\\nSet the \\\"Max Rows Per Flow File\\\" to a value that allows efficient processing, such as `1000` or `10000`.\\nSet the \\\"Output Batch Size\\\" property to a value greater than `0`. A smaller value, such as `1` or even `20` will result in lower latency but also slightly lower throughput.\\n    A larger value such as `1000` will result in higher throughput but also higher latency. It is not recommended to set the value larger than `1000` as it can cause significant\\n    memory utilization.\\n\",\n+                                \"description\": \"Retrieve all rows from a database table.\",\n+                                \"keywords\": [\n+                                    \"jdbc\",\n+                                    \"rdbms\",\n+                                    \"cdc\",\n+                                    \"database\",\n+                                    \"table\",\n+                                    \"stream\"\n+                                ],\n+                                \"notes\": \"\"\n+                            },\n+                            {\n+                                \"configuration\": \"Configure the \\\"Database Connection Pooling Service\\\" to specify a Connection Pooling Service so that the Processor knows how to connect to the database.\\nSet the \\\"Database Type\\\" property to the type of database to query, or \\\"Generic\\\" if the database vendor is not listed.\\nSet the \\\"Table Name\\\" property to the name of the table to retrieve records from.\\nConfigure the \\\"Record Writer\\\" to specify a Record Writer that is appropriate for the desired output format.\\nSet the \\\"Maximum-value Columns\\\" property to a comma-separated list of columns whose values can be used to determine which values are new. For example, this might be set to\\n    an `id` column that is a one-up number, or a `last_modified` column that is a timestamp of when the row was last modified.\\nSet the \\\"Initial Load Strategy\\\" property to \\\"Start at Current Maximum Values\\\".\\nSet the \\\"Fetch Size\\\" to a number that avoids loading too much data into memory on the NiFi side. For example, a value of `1000` will load up to 1,000 rows of data.\\nSet the \\\"Max Rows Per Flow File\\\" to a value that allows efficient processing, such as `1000` or `10000`.\\nSet the \\\"Output Batch Size\\\" property to a value greater than `0`. A smaller value, such as `1` or even `20` will result in lower latency but also slightly lower throughput.\\n    A larger value such as `1000` will result in higher throughput but also higher latency. It is not recommended to set the value larger than `1000` as it can cause significant\\n    memory utilization.\\n\",\n+                                \"description\": \"Perform an incremental load of a single database table, fetching only new rows as they are added to the table.\",\n+                                \"keywords\": [\n+                                    \"incremental load\",\n+                                    \"rdbms\",\n+                                    \"jdbc\",\n+                                    \"cdc\",\n+                                    \"database\",\n+                                    \"table\",\n+                                    \"stream\"\n+                                ],\n+                                \"notes\": \"\"\n+                            }\n+                        ],\n                         \"version\": \"2.0.0-M3\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"The MIME Type set to application/json\",\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                             },\n                             {\n-                                \"description\": \"The number of Tweets in the FlowFile\",\n-                                \"name\": \"tweets\"\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\": \"2.0.0-M3\"\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\": \"f2215c6\"\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\": \"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+                        \"multiProcessorUseCases\": [],\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Date Format\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\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\": \"Password\",\n-                                \"required\": true,\n-                                \"sensitive\": true\n-                            },\n-                            \"Protection Type\": {\n+                            \"cache-schema\": {\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\": \"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\": \"Protection Type\",\n+                                \"name\": \"cache-schema\",\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+                            \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Required Sheets\",\n-                                \"required\": false,\n+                                \"name\": \"dbf-default-precision\",\n+                                \"required\": true,\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+                            \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Starting Row\",\n+                                \"name\": \"dbf-default-scale\",\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+                            \"include-zero-record-flowfiles\": {\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 schema reference information will be provided through a configured Schema Reference Reader service implementation.\",\n-                                        \"displayName\": \"Schema Reference Reader\",\n-                                        \"value\": \"schema-reference-reader\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\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\": \"\",\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\": \"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                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"schema-access-strategy\",\n+                                \"name\": \"include-zero-record-flowfiles\",\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\": \"Environment variables 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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"schema-name\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"schema-reference-reader\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"schema-reference-reader\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"Service implementation responsible for reading FlowFile attributes or content to determine the Schema Reference Identifier\",\n-                                \"displayName\": \"Schema Reference Reader\",\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\": \"schema-reference-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.schemaregistry.services.SchemaReferenceReader\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n                                     \"version\": \"2.0.0-M3\"\n                                 }\n                             },\n-                            \"schema-registry\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"schema-reference-reader\",\n-                                            \"schema-name\"\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+                            \"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\": \"schema-registry\",\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.schemaregistry.services.SchemaRegistry\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n                                     \"version\": \"2.0.0-M3\"\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\": \"Environment variables 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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"schema-version\",\n-                                \"required\": false,\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\": \"2.0.0-M3\"\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-                        \"supportsDynamicProperties\": false,\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": true,\n+                        \"supportsDynamicRelationships\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"cell\",\n-                            \"excel\",\n-                            \"parse\",\n-                            \"reader\",\n+                            \"aggregate\",\n+                            \"avro\",\n+                            \"calcite\",\n+                            \"csv\",\n+                            \"etl\",\n+                            \"filter\",\n+                            \"json\",\n+                            \"logs\",\n+                            \"modify\",\n+                            \"query\",\n                             \"record\",\n-                            \"row\",\n-                            \"spreadsheet\",\n-                            \"values\",\n-                            \"xlsx\"\n+                            \"route\",\n+                            \"select\",\n+                            \"sql\",\n+                            \"text\",\n+                            \"transform\",\n+                            \"update\"\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-                        \"version\": \"2.0.0-M3\"\n-                    }\n-                ],\n-                \"processors\": [],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"2.0.0-M3\"\n-        },\n-        {\n-            \"artifact\": \"nifi-kafka-2-6-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [\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+                        \"useCases\": [\n+                            {\n+                                \"configuration\": \"\\\"Record Reader\\\" should be set to a Record Reader that is appropriate for your data.\\n\\\"Record Writer\\\" should be set to a Record Writer that writes out data in the desired format.\\n\\nOne additional property should be added.\\nThe name of the property should be a short description of the data to keep.\\nIts value is a SQL statement that selects all columns from a table named `FLOW_FILE` for relevant rows.\\nThe WHERE clause selects the data to keep. I.e., it is the exact opposite of what we want to remove.\\nIt is recommended to always quote column names using double-quotes in order to avoid conflicts with SQL keywords.\\nFor example, to remove records where either the name is George OR the age is less than 18, we would add a   property named \\\"adults not george\\\" with a value that selects records where the name is not George AND the age is greater than or equal to 18.   So the value would be `SELECT * FROM FLOWFILE WHERE \\\"name\\\" <> 'George' AND \\\"age\\\" >= 18`\\n\\nAdding this property now gives us a new Relationship whose name is the same as the property name. So, the \\\"adults not george\\\" Relationship should be connected to the next Processor in our flow.\\n\",\n+                                \"description\": \"Filter out records based on the values of the records' fields\",\n+                                \"keywords\": [\n+                                    \"filter out\",\n+                                    \"remove\",\n+                                    \"drop\",\n+                                    \"strip out\",\n+                                    \"record field\",\n+                                    \"sql\"\n+                                ],\n+                                \"notes\": \"\"\n+                            },\n+                            {\n+                                \"configuration\": \"\\\"Record Reader\\\" should be set to a Record Reader that is appropriate for your data.\\n\\\"Record Writer\\\" should be set to a Record Writer that writes out data in the desired format.\\n\\nOne additional property should be added.\\nThe name of the property should be a short description of the data to keep.\\nIts value is a SQL statement that selects all columns from a table named `FLOW_FILE` for relevant rows.\\nThe WHERE clause selects the data to keep.\\nIt is recommended to always quote column names using double-quotes in order to avoid conflicts with SQL keywords.\\nFor example, to keep only records where the person is an adult (aged 18 or older), add a property named \\\"adults\\\"   with a value that is a SQL statement that selects records where the age is at least 18.   So the value would be `SELECT * FROM FLOWFILE WHERE \\\"age\\\" >= 18`\\n\\nAdding this property now gives us a new Relationship whose name is the same as the property name. So, the \\\"adults\\\" Relationship should be connected to the next Processor in our flow.\\n\",\n+                                \"description\": \"Keep only specific records\",\n+                                \"keywords\": [\n+                                    \"keep\",\n+                                    \"filter\",\n+                                    \"retain\",\n+                                    \"select\",\n+                                    \"include\",\n+                                    \"record\",\n+                                    \"sql\"\n+                                ],\n+                                \"notes\": \"\"\n+                            },\n+                            {\n+                                \"configuration\": \"\\\"Record Reader\\\" should be set to a Record Reader that is appropriate for your data.\\n\\\"Record Writer\\\" should be set to a Record Writer that writes out data in the desired format.\\n\\nOne additional property should be added.\\nThe name of the property should be a short description of the data to keep, such as `relevant fields`.\\nIts value is a SQL statement that selects the desired columns from a table named `FLOW_FILE` for relevant rows.\\nThere is no WHERE clause.\\nIt is recommended to always quote column names using double-quotes in order to avoid conflicts with SQL keywords.\\nFor example, to keep only the `name`, `age`, and `address` fields, add a property named `relevant fields`   with a value of `SELECT \\\"name\\\", \\\"age\\\", \\\"address\\\" FROM FLOWFILE`\\n\\nAdding this property now gives us a new Relationship whose name is the same as the property name. So, the `relevant fields` Relationship should be connected to the next Processor in our flow.\\n\",\n+                                \"description\": \"Keep only specific fields in a a Record, where the names of the fields to keep are known\",\n+                                \"keywords\": [\n+                                    \"keep\",\n+                                    \"filter\",\n+                                    \"retain\",\n+                                    \"select\",\n+                                    \"include\",\n+                                    \"record\",\n+                                    \"fields\",\n+                                    \"sql\"\n+                                ],\n+                                \"notes\": \"\"\n+                            },\n+                            {\n+                                \"configuration\": \"\\\"Record Reader\\\" should be set to a Record Reader that is appropriate for your data.\\n\\\"Record Writer\\\" should be set to a Record Writer that writes out data in the desired format.\\n\\nFor each route that you want to create, add a new property.\\nThe name of the property should be a short description of the data that should be selected for the route.\\nIts value is a SQL statement that selects all columns from a table named `FLOW_FILE`. The WHERE clause selects the data that should be included in the route.\\nIt is recommended to always quote column names using double-quotes in order to avoid conflicts with SQL keywords.\\n\\nA new outbound relationship is created for each property that is added. The name of the relationship is the same as the property name.\\n\\nFor example, to route data based on whether or not it is a large transaction, we would add two properties:\\n`small transaction` would have a value such as `SELECT * FROM FLOWFILE WHERE transactionTotal < 100`\\n`large transaction` would have a value of `SELECT * FROM FLOWFILE WHERE transactionTotal >= 100`\\n\",\n+                                \"description\": \"Route record-oriented data for processing based on its contents\",\n+                                \"keywords\": [\n+                                    \"record\",\n+                                    \"route\",\n+                                    \"conditional processing\",\n+                                    \"field\"\n+                                ],\n+                                \"notes\": \"\"\n+                            }\n+                        ],\n+                        \"version\": \"2.0.0-M3\",\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+                            },\n+                            {\n+                                \"description\": \"The relation to which the FlowFile was routed\",\n+                                \"name\": \"QueryRecord.Route\"\n+                            }\n+                        ]\n+                    },\n                     {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-kafka-2-6-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\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\": \"ENVIRONMENT\",\n-                                \"name\": \"The name of a Kafka configuration property.\",\n-                                \"value\": \"The value of a given Kafka configuration property.\"\n+                                \"description\": \"Any field that matches the RecordPath set as the value will be removed.\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"name\": \"A description of the field to remove\",\n+                                \"value\": \"A RecordPath to the field to be removed.\"\n                             }\n                         ],\n                         \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"multiProcessorUseCases\": [],\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-                                \"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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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+                            \"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\": \"compression.type\",\n+                                \"name\": \"Record Reader\",\n                                 \"required\": true,\n-                                \"sensitive\": false\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+                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n                                     \"version\": \"2.0.0-M3\"\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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+                            \"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\": \"2.0.0-M3\"\n                                 }\n+                            }\n+                        },\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.standard.UpdateRecord\"\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-                            \"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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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+                                \"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+                        \"supportsDynamicRelationships\": 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+                        ],\n+                        \"triggerSerially\": false,\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+                        \"useCases\": [\n+                            {\n+                                \"configuration\": \"Configure the Record Reader according to the incoming data format.\\nConfigure the Record Writer according to the desired output format.\\n\\nFor each field that you want to remove, add a single new property to the Processor.\\nThe name of the property can be anything but it's recommended to use a brief description of the field.\\nThe value of the property is a RecordPath that matches the field to remove.\\n\\nFor example, to remove the `name` and `email` fields, add two Properties:\\n`name` = `/name`\\n`email` = `/email`\\n\",\n+                                \"description\": \"Remove one or more fields from a Record, where the names of the fields to remove are known.\",\n+                                \"keywords\": [\n+                                    \"record\",\n+                                    \"field\",\n+                                    \"drop\",\n+                                    \"remove\",\n+                                    \"delete\",\n+                                    \"expunge\",\n+                                    \"recordpath\"\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+                                \"notes\": \"\"\n+                            }\n+                        ],\n+                        \"version\": \"2.0.0-M3\",\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+                            }\n+                        ]\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-standard-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"f2215c6\"\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 a new name for each field that matches the RecordPath.\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"name\": \"A RecordPath that identifies which field(s) to update\",\n+                                \"value\": \"The new name to assign to the Record field\"\n+                            }\n+                        ],\n+                        \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"multiProcessorUseCases\": [],\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                                 \"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\": \"2.0.0-M3\"\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 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\": \"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\": \"2.0.0-M3\"\n                                 }\n-                            },\n-                            \"topic\": {\n-                                \"description\": \"The name of the Kafka Topic to publish to.\",\n-                                \"displayName\": \"Topic Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"topic\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n                             }\n                         },\n-                        \"providedApiImplementations\": [\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.standard.RemoveRecordField\",\n+                            \"org.apache.nifi.processors.standard.UpdateRecord\"\n+                        ],\n+                        \"sideEffectFree\": true,\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\": \"2.0.0-M3\"\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+                        ],\n+                        \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": true,\n+                        \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"kafka\",\n+                            \"avro\",\n+                            \"csv\",\n+                            \"field\",\n+                            \"generic\",\n+                            \"json\",\n+                            \"log\",\n+                            \"logs\",\n                             \"record\",\n-                            \"sink\"\n+                            \"rename\",\n+                            \"schema\",\n+                            \"update\"\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\": \"2.0.0-M3\"\n-                    }\n-                ],\n-                \"processors\": [\n+                        \"triggerSerially\": false,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.standard.RenameRecordField\",\n+                        \"typeDescription\": \"Renames one or more fields in each Record of a FlowFile. 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 the new name to assign to the Record Field that matches the RecordPath. The property value may use Expression Language to reference FlowFile attributes as well as the variables `field.name`, `field.value`, `field.type`, and `record.index`\",\n+                        \"useCases\": [\n+                            {\n+                                \"configuration\": \"Configure the 'Record Reader' according to the input format.\\nConfigure the 'Record Writer' according to the desired output format.\\n\\nAdd a property to the Processor such that the name of the property is a RecordPath to identifies the field to rename. The value of the property is the new name of the property.\\n\\nFor example, to rename the `name` field to `full_name`, add a property with a name of `/name` and a value of `full_name`.\\n\\nMany properties can be added following this pattern in order to rename multiple fields.\\n\",\n+                                \"description\": \"Rename a field in each Record to a specific, known name.\",\n+                                \"keywords\": [\n+                                    \"rename\",\n+                                    \"field\",\n+                                    \"static\",\n+                                    \"specific\",\n+                                    \"name\"\n+                                ],\n+                                \"notes\": \"\"\n+                            },\n+                            {\n+                                \"configuration\": \"Configure the 'Record Reader' according to the input format.\\nConfigure the 'Record Writer' according to the desired output format.\\n\\nAdd a property to the Processor such that the name of the property is a RecordPath to identifies the field to rename. The value of the property is an Expression Language expression that can be used to determine the new name of the field.\\n\\nFor example, to rename the `addr` field to whatever value is stored in the `preferred_address_name` attribute, add a property with a name of `/name` and a value of `${preferred_address_name}`.\\n\\nMany properties can be added following this pattern in order to rename multiple fields.\\n\",\n+                                \"description\": \"Rename a field in each Record to a name that is derived from a FlowFile attribute.\",\n+                                \"keywords\": [\n+                                    \"rename\",\n+                                    \"field\",\n+                                    \"expression language\",\n+                                    \"EL\",\n+                                    \"flowfile\",\n+                                    \"attribute\"\n+                                ],\n+                                \"notes\": \"\"\n+                            },\n+                            {\n+                                \"configuration\": \"Configure the 'Record Reader' according to the input format.\\nConfigure the 'Record Writer' according to the desired output format.\\n\\nAdd a property to the Processor such that the name of the property is a RecordPath to identifies the field to rename. The value of the property is an Expression Language expression that references the `field.name` property.\\n\\nFor example, to rename all fields with a prefix of `pre_`, we add a property named `/*` and a value of `pre_${field.name}`. If we would like this to happen recursively, to nested fields as well, we use a property name of `//*` with the value of `pre_${field.name}`.\\n\\nTo make all field names uppercase, we can add a property named `//*` with a value of `${field.name:toUpper()}`.\\n\\nMany properties can be added following this pattern in order to rename multiple fields.\\n\",\n+                                \"description\": \"Rename a field in each Record to a new name that is derived from the current field name.\",\n+                                \"keywords\": [\n+                                    \"rename\",\n+                                    \"field\",\n+                                    \"expression language\",\n+                                    \"EL\",\n+                                    \"field.name\"\n+                                ],\n+                                \"notes\": \"This might be used, for example, to add a prefix or a suffix to some fields, or to transform the name of the field by making it uppercase.\"\n+                            }\n+                        ],\n+                        \"version\": \"2.0.0-M3\",\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+                    },\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-kafka-2-6-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -72728,678 +78887,641 @@\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\": \"ENVIRONMENT\",\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                         \"multiProcessorUseCases\": [],\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Commit Offsets\": {\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+                            \"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\": \"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+                                \"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\": \"Communications Timeout\",\n+                                \"name\": \"Evaluation Mode\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"auto.offset.reset\": {\n+                            \"Line-by-Line Evaluation Mode\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Automatically reset the offset to the earliest offset\",\n-                                        \"displayName\": \"earliest\",\n-                                        \"value\": \"earliest\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"All\",\n+                                        \"value\": \"All\"\n                                     },\n                                     {\n-                                        \"description\": \"Automatically reset the offset to the latest offset\",\n-                                        \"displayName\": \"latest\",\n-                                        \"value\": \"latest\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"First-Line\",\n+                                        \"value\": \"First-Line\"\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\": \"Last-Line\",\n+                                        \"value\": \"Last-Line\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Except-First-Line\",\n+                                        \"value\": \"Except-First-Line\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Except-Last-Line\",\n+                                        \"value\": \"Except-Last-Line\"\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\": \"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\": \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"aws.profile.name\",\n+                                \"name\": \"Line-by-Line Evaluation Mode\",\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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+                            \"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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"group.id\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Maximum Buffer Size\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"header-name-regex\": {\n+                            \"Regular Expression\": {\n+                                \"defaultValue\": \"(?s)(^.*$)\",\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"USE_VALUE\"\n+                                            \"Regex Replace\",\n+                                            \"Literal Replace\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Output Strategy\",\n-                                        \"propertyName\": \"output-strategy\"\n+                                        \"propertyDisplayName\": \"Replacement Strategy\",\n+                                        \"propertyName\": \"Replacement 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+                                \"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\": \"header-name-regex\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Regular Expression\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"honor-transactions\": {\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\": \"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-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\": \"2.0.0-M3\"\n-                                }\n-                            },\n-                            \"key-attribute-encoding\": {\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\": \"The key is interpreted as a UTF-8 Encoded string.\",\n-                                        \"displayName\": \"UTF-8 Encoded\",\n-                                        \"value\": \"utf-8\"\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\": \"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\": \"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\": \"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+                                        \"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-                                        \"dependentValues\": [\n-                                            \"USE_VALUE\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Output Strategy\",\n-                                        \"propertyName\": \"output-strategy\"\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-                                \"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\": \"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\": \"key-attribute-encoding\",\n+                                \"name\": \"Replacement Strategy\",\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+                            \"Replacement Value\": {\n+                                \"defaultValue\": \"$1\",\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"USE_WRAPPER\"\n+                                            \"Prepend\",\n+                                            \"Regex Replace\",\n+                                            \"Always Replace\",\n+                                            \"Append\",\n+                                            \"Literal Replace\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Output Strategy\",\n-                                        \"propertyName\": \"output-strategy\"\n+                                        \"propertyDisplayName\": \"Replacement Strategy\",\n+                                        \"propertyName\": \"Replacement Strategy\"\n                                     }\n                                 ],\n-                                \"description\": \"Specifies how to represent the Kafka Record's Key in the output\",\n-                                \"displayName\": \"Key Format\",\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\": \"key-format\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Replacement Value\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"key-record-reader\": {\n+                            \"Text to Append\": {\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"record\"\n+                                            \"Surround\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Key Format\",\n-                                        \"propertyName\": \"key-format\"\n+                                        \"propertyDisplayName\": \"Replacement Strategy\",\n+                                        \"propertyName\": \"Replacement Strategy\"\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 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\": \"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\": \"2.0.0-M3\"\n-                                }\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Text to Append\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             },\n-                            \"max-uncommit-offset-wait\": {\n-                                \"defaultValue\": \"1 secs\",\n+                            \"Text to Prepend\": {\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"true\"\n+                                            \"Surround\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Commit Offsets\",\n-                                        \"propertyName\": \"Commit Offsets\"\n+                                        \"propertyDisplayName\": \"Replacement Strategy\",\n+                                        \"propertyName\": \"Replacement Strategy\"\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+                                \"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\": \"max-uncommit-offset-wait\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables 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-                            \"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+                                \"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+                        ],\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": 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+                            \"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+                        \"useCases\": [\n+                            {\n+                                \"configuration\": \"\\\"Evaluation Mode\\\" = \\\"Line-by-Line\\\"\\n\\\"Replacement Strategy\\\" = \\\"Append\\\"\\n\\n\\\"Replacement Value\\\" is set to whatever text should be appended to the line.\\nFor example, to insert the text `<fin>` at the end of every line, we would set \\\"Replacement Value\\\" to `<fin>`.\\nWe can also use Expression Language. So to insert the filename at the end of every line, we set \\\"Replacement Value\\\" to `${filename}`\\n\",\n+                                \"description\": \"Append text to the end of every line in a FlowFile\",\n+                                \"keywords\": [\n+                                    \"raw text\",\n+                                    \"append\",\n+                                    \"line\"\n+                                ],\n+                                \"notes\": \"\"\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+                                \"configuration\": \"\\\"Evaluation Mode\\\" = \\\"Line-by-Line\\\"\\n\\\"Replacement Strategy\\\" = \\\"Prepend\\\"\\n\\n\\\"Replacement Value\\\" is set to whatever text should be prepended to the line.\\nFor example, to insert the text `<start>` at the beginning of every line, we would set \\\"Replacement Value\\\" to `<start>`.\\nWe can also use Expression Language. So to insert the filename at the beginning of every line, we set \\\"Replacement Value\\\" to `${filename}`\\n\",\n+                                \"description\": \"Prepend text to the beginning of every line in a FlowFile\",\n+                                \"keywords\": [\n+                                    \"raw text\",\n+                                    \"prepend\",\n+                                    \"line\"\n+                                ],\n+                                \"notes\": \"\"\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+                                \"configuration\": \"\\\"Evaluation Mode\\\" = \\\"Line-by-Line\\\"\\n\\\"Replacement Strategy\\\" = \\\"Literal Replace\\\"\\n\\\"Search Value\\\" is set to whatever text is in the FlowFile that needs to be replaced.\\n\\\"Replacement Value\\\" is set to the text that should replace the current text.\\n\\nFor example, to replace the word \\\"spider\\\" with \\\"arachnid\\\" we set \\\"Search Value\\\" to `spider` and set \\\"Replacement Value\\\" to `arachnid`.\\n\",\n+                                \"description\": \"Replace every occurrence of a literal string in the FlowFile with a different value\",\n+                                \"keywords\": [\n+                                    \"replace\",\n+                                    \"string\",\n+                                    \"text\",\n+                                    \"literal\"\n                                 ],\n-                                \"defaultValue\": \"USE_VALUE\",\n-                                \"description\": \"The format used to output the Kafka record into a FlowFile record.\",\n-                                \"displayName\": \"Output Strategy\",\n+                                \"notes\": \"\"\n+                            },\n+                            {\n+                                \"configuration\": \"\\\"Evaluation Mode\\\" = \\\"Line-by-Line\\\"\\n\\\"Replacement Strategy\\\" = \\\"Regex Replace\\\"\\n\\\"Search Value\\\" is set to a regular expression that matches the text that should be transformed in a capturing group.\\n\\\"Replacement Value\\\" is set to a NiFi Expression Language expression that references `$1` (in quotes to escape the reference name).\\n\\nFor example, if we wanted to lowercase any occurrence of WOLF, TIGER, or LION, we would use a \\\"Search Value\\\" of `(WOLF|TIGER|LION)` and a \\\"Replacement Value\\\" of `${'$1':toLower()}`.\\nIf we want to replace any identifier with a hash of that identifier, we might use a \\\"Search Value\\\" of `identifier: (.*)` and a \\\"Replacement Value\\\" of `identifier: ${'$1':hash('sha256')}`\\n\",\n+                                \"description\": \"Transform every occurrence of a literal string in a FlowFile\",\n+                                \"keywords\": [\n+                                    \"replace\",\n+                                    \"transform\",\n+                                    \"raw text\"\n+                                ],\n+                                \"notes\": \"\"\n+                            },\n+                            {\n+                                \"configuration\": \"\\\"Evaluation Mode\\\" = \\\"Entire text\\\"\\n\\\"Replacement Strategy\\\" = \\\"Always Replace\\\"\\n\\n\\\"Replacement Value\\\" is set to the new text that should be written to the FlowFile. This text might include NiFi Expression Language to reference one or more attributes.\\n\",\n+                                \"description\": \"Completely replace the contents of a FlowFile to a specific text\",\n+                                \"keywords\": [\n+                                    \"replace\",\n+                                    \"raw text\"\n+                                ],\n+                                \"notes\": \"\"\n+                            }\n+                        ],\n+                        \"version\": \"2.0.0-M3\"\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-standard-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"f2215c6\"\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+                        \"multiProcessorUseCases\": [],\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\": \"output-strategy\",\n+                                \"name\": \"Character Set\",\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+                            \"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\": \"record-reader\",\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.serialization.RecordReaderFactory\",\n-                                    \"version\": \"2.0.0-M3\"\n-                                }\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"SINGLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\"\n+                                    ]\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 Value Writer\",\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\": \"record-writer\",\n+                                \"name\": \"Mapping File Refresh 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.RecordSetWriterFactory\",\n-                                    \"version\": \"2.0.0-M3\"\n-                                }\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+                            \"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\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"sasl.kerberos.service.name\",\n-                                \"required\": false,\n+                                \"name\": \"Matching Group\",\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+                            \"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\": \"sasl.mechanism\",\n+                                \"name\": \"Maximum Buffer Size\",\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+                            \"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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"sasl.password\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Regular Expression\",\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-                            \"sasl.token.auth\": {\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+                        ],\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\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+                        \"useCases\": [],\n+                        \"version\": \"2.0.0-M3\"\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-standard-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"f2215c6\"\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+                        \"multiProcessorUseCases\": [],\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-                                \"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 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\": \"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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"sasl.username\",\n-                                \"required\": false,\n+                                \"name\": \"Fail on Non-numerical Overwrite\",\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+                            \"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\": \"security.protocol\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"maximum-retries\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"separate-by-key\": {\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\": \"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+                                \"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\": \"separate-by-key\",\n-                                \"required\": false,\n+                                \"name\": \"penalize-retries\",\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\": \"2.0.0-M3\"\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+                            \"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\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"topic\",\n+                                \"name\": \"retry-attribute\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"topic_type\": {\n+                            \"reuse-mode\": {\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\": \"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\": \"Topic is a regex using the Java Pattern syntax\",\n-                                        \"displayName\": \"pattern\",\n-                                        \"value\": \"pattern\"\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\": \"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\": \"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\": \"topic_type\",\n+                                \"name\": \"reuse-mode\",\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+                        \"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\": 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-                                \"name\": \"success\"\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\": \"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\": \"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+                            {\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\": false,\n+                        \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": true,\n                         \"supportsDynamicRelationships\": 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+                            \"FlowFile\",\n+                            \"Retry\"\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+                        \"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                         \"useCases\": [],\n                         \"version\": \"2.0.0-M3\",\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+                                \"description\": \"User defined retry attribute is updated with the current retry count\",\n+                                \"name\": \"Retry Attribute\"\n                             },\n                             {\n-                                \"description\": \"The topic records are from\",\n-                                \"name\": \"kafka.topic\"\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-kafka-2-6-nar\",\n+                        \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -73409,546 +79531,533 @@\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\": \"ENVIRONMENT\",\n-                                \"name\": \"The name of a Kafka configuration property.\",\n-                                \"value\": \"The value of a given Kafka configuration property.\"\n+                                \"description\": \"Routes FlowFiles whose attributes match the 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\": \"Expression Language expression that returns a boolean value indicating whether or not the FlowFile should be routed to this Relationship\"\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_FORBIDDEN\",\n-                        \"multiProcessorUseCases\": [],\n-                        \"primaryNodeOnly\": false,\n-                        \"propertyDescriptors\": {\n-                            \"Commit Offsets\": {\n-                                \"allowableValues\": [\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"multiProcessorUseCases\": [\n+                            {\n+                                \"configurations\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"configuration\": \"Choose a RecordReader that is appropriate based on the format of the incoming data.\\nChoose a RecordWriter that writes the data in the desired output format.\\n\\nAdd a single additional property. The name of the property should describe the criteria to route on. The property's value should be a RecordPath that returns `true` if the Record meets the criteria or `false` otherwise. This adds a new attribute to the FlowFile whose name is equal to the property name.\\n\\nConnect the 'success' Relationship to RouteOnAttribute.\\n\",\n+                                        \"processorClassName\": \"org.apache.nifi.processors.standard.PartitionRecord\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"configuration\": \"Set \\\"Routing Strategy\\\" to \\\"Route to Property name\\\"\\n\\nAdd two additional properties. For the first one, the name of the property should describe data that matches the criteria. The value is an Expression Language expression that checks if the attribute added by the PartitionRecord processor has a value of `true`. For example, `${criteria:equals('true')}`.\\nThe second property should have a name that describes data that does not match the criteria. The value is an Expression Language that evaluates to the opposite of the first property value. For example, `${criteria:equals('true'):not()}`.\\n\\nConnect each of the newly created Relationships to the appropriate downstream processors.\\n\",\n+                                        \"processorClassName\": \"org.apache.nifi.processors.standard.RouteOnAttribute\"\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+                                \"description\": \"Route record-oriented data based on whether or not the record's values meet some criteria\",\n+                                \"keywords\": [\n+                                    \"record\",\n+                                    \"route\",\n+                                    \"content\",\n+                                    \"data\"\n+                                ],\n+                                \"notes\": \"\"\n+                            }\n+                        ],\n+                        \"primaryNodeOnly\": false,\n+                        \"propertyDescriptors\": {\n+                            \"Routing Strategy\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Automatically reset the offset to the earliest offset\",\n-                                        \"displayName\": \"earliest\",\n-                                        \"value\": \"earliest\"\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\": \"Automatically reset the offset to the latest offset\",\n-                                        \"displayName\": \"latest\",\n-                                        \"value\": \"latest\"\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\": \"Throw exception to the consumer if no previous offset is found for the consumer's group\",\n-                                        \"displayName\": \"none\",\n-                                        \"value\": \"none\"\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\": \"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\": \"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\": \"auto.offset.reset\",\n+                                \"name\": \"Routing Strategy\",\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+                        },\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+                        ],\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": true,\n+                        \"supportsDynamicRelationships\": 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+                        \"useCases\": [\n+                            {\n+                                \"configuration\": \"Set the \\\"Routing Strategy\\\" property to \\\"Route to Property name\\\".\\nFor each route that a FlowFile might be routed to, add a new property. The name of the property should describe the route.\\nThe value of the property is an Attribute Expression Language expression that returns a boolean value indicating whether or not a given FlowFile will be routed to the associated relationship.\\n\\nFor example, we might route data based on its file extension using the following properties:\\n    - \\\"Routing Strategy\\\" = \\\"Route to Property Name\\\"\\n    - \\\"jpg\\\" = \\\"${filename:endsWith('.jpg')}\\\"\\n    - \\\"png\\\" = \\\"${filename:endsWith('.png')}\\\"\\n    - \\\"pdf\\\" = \\\"${filename:endsWith('.pdf')}\\\"\\n\\nThe Processor will now have 3 relationships: `jpg`, `png`, and `pdf`. Each of these should be connected to the appropriate downstream processor.\\n\",\n+                                \"description\": \"Route data to one or more relationships based on its attributes using the NiFi Expression Language.\",\n+                                \"keywords\": [\n+                                    \"attributes\",\n+                                    \"routing\",\n+                                    \"expression language\"\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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"aws.profile.name\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n+                                \"notes\": \"\"\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"bootstrap.servers\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n+                            {\n+                                \"configuration\": \"Add a new property for each condition that must be satisfied in order to keep the data.\\nIf the data should be kept in the case that any of the provided conditions is met, set the \\\"Routing Strategy\\\" property to \\\"Route to 'matched' if any matches\\\".\\nIf all conditions must be met in order to keep the data, set the \\\"Routing Strategy\\\" property  to \\\"Route to 'matched' if all match\\\".\\n\\nFor example, to keep files whose filename ends with .txt and have a file size of at least 1000 bytes, we will use the following properties:\\n    - \\\"ends_with_txt\\\" = \\\"${filename:endsWith('.txt')}\\\"\\n    - \\\"large_enough\\\" = \\\"${fileSize:ge(1000)}\\n    - \\\"Routing Strategy\\\" = \\\"Route to 'matched' if all match\\\"\\n\\nAuto-terminate the 'unmatched' relationship.\\nConnect the 'matched' relationship to the next processor in the flow.\\n\",\n+                                \"description\": \"Keep data only if its attributes meet some criteria, such as its filename ends with .txt.\",\n+                                \"keywords\": [\n+                                    \"keep\",\n+                                    \"filter\",\n+                                    \"remove\",\n+                                    \"delete\",\n+                                    \"expression language\"\n+                                ],\n+                                \"notes\": \"\"\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+                            {\n+                                \"configuration\": \"Add a new property for each condition that must be satisfied in order to drop the data.\\nIf the data should be dropped in the case that any of the provided conditions is met, set the \\\"Routing Strategy\\\" property to \\\"Route to 'matched' if any matches\\\".\\nIf all conditions must be met in order to drop the data, set the \\\"Routing Strategy\\\" property  to \\\"Route to 'matched' if all match\\\".\\n\\nHere are a couple of examples for configuring the properties:\\n    Example 1 Use Case: Data should be dropped if its \\\"uuid\\\" attribute has an 'a' in it or ends with '0'.\\n      Here, we will use the following properties:\\n        - \\\"has_a\\\" = \\\"${uuid:contains('a')}\\\"\\n        - \\\"ends_with_0\\\" = \\\"${uuid:endsWith('0')}\\n        - \\\"Routing Strategy\\\" = \\\"Route to 'matched' if any matches\\\"\\n    Example 2 Use Case: Data should be dropped if its 'uuid' attribute has an 'a' AND it ends with a '1'.\\n      Here, we will use the following properties:\\n        - \\\"has_a\\\" = \\\"${uuid:contains('a')}\\\"\\n        - \\\"ends_with_1\\\" = \\\"${uuid:endsWith('1')}\\n        - \\\"Routing Strategy\\\" = \\\"Route to 'matched' if all match\\\"\\n\\nAuto-terminate the 'matched' relationship.\\nConnect the 'unmatched' relationship to the next processor in the flow.\\n\",\n+                                \"description\": \"Discard or drop a file based on attributes, such as filename.\",\n+                                \"keywords\": [\n+                                    \"discard\",\n+                                    \"drop\",\n+                                    \"filter\",\n+                                    \"remove\",\n+                                    \"delete\",\n+                                    \"expression language\"\n+                                ],\n+                                \"notes\": \"\"\n+                            }\n+                        ],\n+                        \"version\": \"2.0.0-M3\",\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\": \"f2215c6\"\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\": \"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+                        \"multiProcessorUseCases\": [],\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"group.id\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Character Set\",\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+                            \"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\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"header-name-regex\",\n-                                \"required\": false,\n+                                \"name\": \"Content Buffer Size\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"honor-transactions\": {\n+                            \"Match Requirement\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"displayName\": \"content must match exactly\",\n+                                        \"value\": \"content must match exactly\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"displayName\": \"content must contain match\",\n+                                        \"value\": \"content must contain match\"\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\": \"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\": \"honor-transactions\",\n+                                \"name\": \"Match Requirement\",\n                                 \"required\": true,\n                                 \"sensitive\": false\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\": \"2.0.0-M3\"\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+                            }\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+                        ],\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": true,\n+                        \"supportsDynamicRelationships\": 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+                        \"useCases\": [],\n+                        \"version\": \"2.0.0-M3\"\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-standard-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"f2215c6\"\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\": \"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+                        \"multiProcessorUseCases\": [],\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\": \"key-attribute-encoding\",\n+                                \"name\": \"Character Set\",\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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+                            \"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\": \"message-header-encoding\",\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"sasl.kerberos.service.name\",\n+                                \"name\": \"Grouping Regular Expression\",\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"sasl.password\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n-                            },\n-                            \"sasl.token.auth\": {\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-                                \"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 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\": \"sasl.token.auth\",\n-                                \"required\": false,\n+                                \"name\": \"Ignore Case\",\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+                            \"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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"sasl.username\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Ignore Leading/Trailing Whitespace\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"security.protocol\": {\n+                            \"Matching Strategy\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"PLAINTEXT\",\n-                                        \"value\": \"PLAINTEXT\"\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\": \"SSL\",\n-                                        \"value\": \"SSL\"\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\": \"SASL_PLAINTEXT\",\n-                                        \"value\": \"SASL_PLAINTEXT\"\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\": \"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+                                        \"description\": \"Match lines based on whether the line contains the property value\",\n+                                        \"displayName\": \"Contains\",\n+                                        \"value\": \"Contains\"\n+                                    },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\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\": \"false\",\n-                                        \"value\": \"false\"\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-                                \"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+                                \"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\": \"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\": \"2.0.0-M3\"\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"topic\",\n+                                \"name\": \"Matching Strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"topic_type\": {\n+                            \"Routing 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\": \"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\": \"Topic is a regex using the Java Pattern syntax\",\n-                                        \"displayName\": \"pattern\",\n-                                        \"value\": \"pattern\"\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\": \"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\": \"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\": \"topic_type\",\n+                                \"name\": \"Routing Strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             }\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-                                \"name\": \"success\"\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\": \"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                         ],\n-                        \"supportsBatching\": false,\n+                        \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": true,\n-                        \"supportsDynamicRelationships\": false,\n+                        \"supportsDynamicRelationships\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"2.6\",\n-                            \"Consume\",\n-                            \"Get\",\n-                            \"Ingest\",\n-                            \"Ingress\",\n-                            \"Kafka\",\n-                            \"PubSub\",\n-                            \"Topic\"\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.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-                        \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\",\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+                        \"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+                        \"useCases\": [\n                             {\n-                                \"description\": \"The timestamp of the message in the partition of the topic.\",\n-                                \"name\": \"kafka.timestamp\"\n+                                \"configuration\": \"\\\"Routing Strategy\\\" = \\\"Route to each matching Property Name\\\"\\n\\\"Matching Strategy\\\" = \\\"Matches Regular Expression\\\"\\n\\\"Empty Line\\\" = \\\"^$\\\"\\n\\nAuto-terminate the \\\"Empty Line\\\" relationship.\\nConnect the \\\"unmatched\\\" relationship to the next processor in your flow.\\n\",\n+                                \"description\": \"Drop blank or empty lines from the FlowFile's content.\",\n+                                \"keywords\": [\n+                                    \"filter\",\n+                                    \"drop\",\n+                                    \"empty\",\n+                                    \"blank\",\n+                                    \"remove\",\n+                                    \"delete\",\n+                                    \"strip out\",\n+                                    \"lines\",\n+                                    \"text\"\n+                                ],\n+                                \"notes\": \"\"\n                             },\n                             {\n-                                \"description\": \"The partition of the topic the message or message bundle is from\",\n-                                \"name\": \"kafka.partition\"\n-                            },\n+                                \"configuration\": \"\\\"Routing Strategy\\\" = \\\"Route to each matching Property Name\\\"\\n\\\"Matching Strategy\\\" = \\\"Satisfies Expression\\\"\\n\\nAn additional property should be added named \\\"Filter Out.\\\" The value should be a NiFi Expression Language Expression that can refer to two variables (in addition to FlowFile attributes): `line`, which is the line of text being evaluated; and `lineNo`, which is the line number in the file (starting with 1). The Expression should return `true` for any line that should be dropped.\\n\\nFor example, to remove any line that starts with a # symbol, we can set \\\"Filter Out\\\" to `${line:startsWith(\\\"#\\\")}`.\\nWe could also remove the first 2 lines of text by setting \\\"Filter Out\\\" to `${lineNo:le(2)}`. Note that we use the `le` function because we want lines numbers less than or equal to `2`, since the line index is 1-based.\\n\\nAuto-terminate the \\\"Filter Out\\\" relationship.\\nConnect the \\\"unmatched\\\" relationship to the next processor in your flow.\\n\",\n+                                \"description\": \"Remove specific lines of text from a file, such as those containing a specific word or having a line length over some threshold.\",\n+                                \"keywords\": [\n+                                    \"filter\",\n+                                    \"drop\",\n+                                    \"empty\",\n+                                    \"blank\",\n+                                    \"remove\",\n+                                    \"delete\",\n+                                    \"strip out\",\n+                                    \"lines\",\n+                                    \"text\",\n+                                    \"expression language\"\n+                                ],\n+                                \"notes\": \"\"\n+                            }\n+                        ],\n+                        \"version\": \"2.0.0-M3\",\n+                        \"writesAttributes\": [\n                             {\n-                                \"description\": \"The topic the message or message bundle is from\",\n-                                \"name\": \"kafka.topic\"\n+                                \"description\": \"The name of the relationship to which the FlowFile was routed.\",\n+                                \"name\": \"RouteText.Route\"\n                             },\n                             {\n-                                \"description\": \"Set to true if the consumed message is a tombstone message\",\n-                                \"name\": \"kafka.tombstone\"\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\": true,\n-                        \"artifact\": \"nifi-kafka-2-6-nar\",\n+                        \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -73956,1244 +80065,1707 @@\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\": \"ENVIRONMENT\",\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                         \"multiProcessorUseCases\": [],\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+                            \"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\": \"Failure Strategy\",\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\": \"2.0.0-M3\"\n+                                }\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+                            \"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\": \"2.0.0-M3\"\n+                                }\n+                            },\n+                            \"sample-record-interval\": {\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"USE_WRAPPER\"\n+                                            \"interval\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Publish Strategy\",\n-                                        \"propertyName\": \"publish-strategy\"\n+                                        \"propertyDisplayName\": \"Sampling Strategy\",\n+                                        \"propertyName\": \"sample-record-sampling-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+                                \"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\": \"ack.wait.time\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"sample-record-interval\",\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+                            \"sample-record-probability\": {\n+                                \"dependencies\": [\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+                                        \"dependentValues\": [\n+                                            \"probabilistic\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Sampling Strategy\",\n+                                        \"propertyName\": \"sample-record-sampling-strategy\"\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+                                \"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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"acks\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"sample-record-probability\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"attribute-name-regex\": {\n+                            \"sample-record-random-seed\": {\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"USE_VALUE\"\n+                                            \"probabilistic\",\n+                                            \"reservoir\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Publish Strategy\",\n-                                        \"propertyName\": \"publish-strategy\"\n+                                        \"propertyDisplayName\": \"Sampling Strategy\",\n+                                        \"propertyName\": \"sample-record-sampling-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\": \"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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"attribute-name-regex\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"sample-record-random-seed\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"aws.profile.name\": {\n+                            \"sample-record-range\": {\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"AWS_MSK_IAM\"\n+                                            \"range\"\n                                         ],\n-                                        \"propertyDisplayName\": \"SASL Mechanism\",\n-                                        \"propertyName\": \"sasl.mechanism\"\n+                                        \"propertyDisplayName\": \"Sampling Strategy\",\n+                                        \"propertyName\": \"sample-record-sampling-strategy\"\n                                     }\n                                 ],\n-                                \"description\": \"The Amazon Web Services Profile to select when multiple profiles are available.\",\n-                                \"displayName\": \"AWS Profile Name\",\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\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"aws.profile.name\",\n-                                \"required\": false,\n+                                \"name\": \"sample-record-range\",\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+                            \"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                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"bootstrap.servers\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"sample-record-reservoir\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"compression.type\": {\n+                            \"sample-record-sampling-strategy\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"none\",\n-                                        \"value\": \"none\"\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\": \"\",\n-                                        \"displayName\": \"gzip\",\n-                                        \"value\": \"gzip\"\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\": \"\",\n-                                        \"displayName\": \"snappy\",\n-                                        \"value\": \"snappy\"\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\": \"\",\n-                                        \"displayName\": \"lz4\",\n-                                        \"value\": \"lz4\"\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\": \"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\": \"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\": \"compression.type\",\n+                                \"name\": \"sample-record-sampling-strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n+                            }\n+                        },\n+                        \"sideEffectFree\": true,\n+                        \"supportedRelationships\": [\n+                            {\n+                                \"description\": \"The FlowFile is routed to this relationship if the sampling completed successfully\",\n+                                \"name\": \"success\"\n                             },\n-                            \"kerberos-user-service\": {\n-                                \"description\": \"Service supporting user authentication with Kerberos\",\n-                                \"displayName\": \"Kerberos User Service\",\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+                        ],\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": 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+                        ],\n+                        \"triggerSerially\": false,\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+                        \"useCases\": [],\n+                        \"version\": \"2.0.0-M3\",\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\": \"f2215c6\"\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+                        \"multiProcessorUseCases\": [],\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                                 \"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\": \"2.0.0-M3\"\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"max.block.ms\",\n+                                \"name\": \"Attribute Pattern\",\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+                            \"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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"max.request.size\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Dictionary File\",\n                                 \"required\": true,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"SINGLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\"\n+                                    ]\n+                                },\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+                            \"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\": \"message-header-encoding\",\n+                                \"name\": \"Dictionary Filter Pattern\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"message-key-field\": {\n-                                \"dependencies\": [\n+                            \"Match Criteria\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"USE_VALUE\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Publish Strategy\",\n-                                        \"propertyName\": \"publish-strategy\"\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-                                \"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\": \"Environment variables 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\": \"Environment variables 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 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+                                \"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\": \"partitioner.class\",\n-                                \"required\": false,\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-                            \"publish-strategy\": {\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+                        ],\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\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+                        \"useCases\": [],\n+                        \"version\": \"2.0.0-M3\"\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-standard-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"f2215c6\"\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+                        \"multiProcessorUseCases\": [],\n+                        \"primaryNodeOnly\": false,\n+                        \"propertyDescriptors\": {\n+                            \"Dictionary Encoding\": {\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+                                        \"description\": \"\",\n+                                        \"displayName\": \"text\",\n+                                        \"value\": \"text\"\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+                                        \"description\": \"\",\n+                                        \"displayName\": \"binary\",\n+                                        \"value\": \"binary\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"USE_VALUE\",\n-                                \"description\": \"The format used to publish the incoming FlowFile record to Kafka.\",\n-                                \"displayName\": \"Publish Strategy\",\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\": \"publish-strategy\",\n+                                \"name\": \"Dictionary Encoding\",\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+                            \"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\": \"record-key-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\": \"2.0.0-M3\"\n-                                }\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-                            \"record-reader\": {\n-                                \"description\": \"The Record Reader to use for incoming FlowFiles\",\n-                                \"displayName\": \"Record Reader\",\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+                        ],\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\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+                        \"useCases\": [],\n+                        \"version\": \"2.0.0-M3\",\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\": \"f2215c6\"\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+                        \"multiProcessorUseCases\": [],\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\": \"record-reader\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Segment 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\": \"2.0.0-M3\"\n-                                }\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-                            \"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 original FlowFile will be sent 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+                        \"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+                        \"useCases\": [],\n+                        \"version\": \"2.0.0-M3\",\n+                        \"writesAttributes\": [\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+                            },\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+                            },\n+                            {\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\": \"f2215c6\"\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+                        \"multiProcessorUseCases\": [],\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                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"record-writer\",\n+                                \"name\": \"Byte Sequence\",\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\": \"2.0.0-M3\"\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"sasl.kerberos.service.name\",\n-                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"sasl.mechanism\": {\n+                            \"Byte Sequence Format\": {\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\": \"The Byte Sequence will be interpreted as a hexadecimal representation of bytes\",\n+                                        \"displayName\": \"Hexadecimal\",\n+                                        \"value\": \"Hexadecimal\"\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\": \"The Byte Sequence will be interpreted as UTF-8 Encoded text\",\n+                                        \"displayName\": \"Text\",\n+                                        \"value\": \"Text\"\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\": \"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\": \"sasl.mechanism\",\n+                                \"name\": \"Byte Sequence Format\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"sasl.password\": {\n-                                \"dependencies\": [\n+                            \"Byte Sequence Location\": {\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\": \"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\": \"Password provided with configured username when using PLAIN or SCRAM SASL Mechanisms\",\n-                                \"displayName\": \"Password\",\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"sasl.password\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Byte Sequence Location\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             },\n-                            \"sasl.token.auth\": {\n+                            \"Keep Byte Sequence\": {\n                                 \"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\": \"Determines whether or not the Byte Sequence should be included with each Split\",\n+                                \"displayName\": \"Keep Byte Sequence\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"sasl.token.auth\",\n-                                \"required\": false,\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 Splits will be routed to the splits relationship\",\n+                                \"name\": \"splits\"\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+                            {\n+                                \"description\": \"The original file\",\n+                                \"name\": \"original\"\n+                            }\n+                        ],\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\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+                        ],\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+                        \"useCases\": [],\n+                        \"version\": \"2.0.0-M3\",\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\": \"f2215c6\"\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+                        \"multiProcessorUseCases\": [],\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                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"sasl.username\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"JsonPath Expression\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"security.protocol\": {\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\": \"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+                                        \"displayName\": \"empty string\",\n+                                        \"value\": \"empty string\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"SASL_SSL\",\n-                                        \"value\": \"SASL_SSL\"\n+                                        \"displayName\": \"the string 'null'\",\n+                                        \"value\": \"the string 'null'\"\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\": \"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\": \"security.protocol\",\n+                                \"name\": \"Null Value Representation\",\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 JSON or the specified path does not exist), it will be routed to this relationship\",\n+                                \"name\": \"failure\"\n                             },\n-                            \"ssl.context.service\": {\n-                                \"description\": \"Service supporting SSL communication with Kafka brokers\",\n-                                \"displayName\": \"SSL Context Service\",\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\": \"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+                        ],\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\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+                        ],\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+                        \"useCases\": [],\n+                        \"version\": \"2.0.0-M3\",\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\": \"f2215c6\"\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+                        \"multiProcessorUseCases\": [],\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                                 \"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\": \"2.0.0-M3\"\n                                 }\n                             },\n-                            \"topic\": {\n-                                \"description\": \"The name of the Kafka Topic to publish to.\",\n-                                \"displayName\": \"Topic Name\",\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\": \"2.0.0-M3\"\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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"topic\",\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                             },\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+                            {\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+                        ],\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": 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+                        ],\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+                        \"useCases\": [],\n+                        \"version\": \"2.0.0-M3\",\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+                            },\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\": \"f2215c6\"\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+                        \"multiProcessorUseCases\": [],\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                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"transactional-id-prefix\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Header Line Count\",\n+                                \"required\": true,\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Header Line Marker Characters\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"use-transactions\": {\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\": \"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\": \"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\": \"use-transactions\",\n+                                \"name\": \"Remove Trailing Newlines\",\n                                 \"required\": true,\n                                 \"sensitive\": false\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.standard.MergeContent\"\n                         ],\n-                        \"sideEffectFree\": false,\n+                        \"sideEffectFree\": true,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"FlowFiles for which all content was sent to Kafka.\",\n-                                \"name\": \"success\"\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\": \"Any FlowFile that cannot be sent to Kafka will be routed to this Relationship\",\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+                            {\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+                        ],\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\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+                        \"useCases\": [],\n+                        \"version\": \"2.0.0-M3\",\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\": \"f2215c6\"\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+                        \"multiProcessorUseCases\": [],\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\": \"Split Depth\",\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+                            {\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                         ],\n-                        \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": true,\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\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-                            \"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+                            \"split\",\n+                            \"xml\"\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.standard.SplitXml\",\n+                        \"typeDescription\": \"Splits an XML File into multiple separate FlowFiles, each comprising a child or descendant of the original root element\",\n                         \"useCases\": [],\n                         \"version\": \"2.0.0-M3\",\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\": \"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-                        \"artifact\": \"nifi-kafka-2-6-nar\",\n+                        \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\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\": \"30 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n-                        \"dynamicProperties\": [\n+                        \"explicitRestrictions\": [\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\": \"ENVIRONMENT\",\n-                                \"name\": \"The name of a Kafka configuration property.\",\n-                                \"value\": \"The value of a given Kafka configuration property.\"\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+                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n                         \"multiProcessorUseCases\": [],\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Failure Strategy\": {\n+                            \"File Location\": {\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+                                        \"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\": \"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+                                        \"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\": \"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+                                \"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\": \"Failure Strategy\",\n+                                \"name\": \"File Location\",\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+                            \"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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"ack.wait.time\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"File to Tail\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"acks\": {\n+                            \"Initial Start Position\": {\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\": \"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\": \"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\": \"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\": \"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\": \"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\": \"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+                                \"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\": \"acks\",\n+                                \"name\": \"Initial Start Position\",\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+                            \"Line Start Pattern\": {\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"AWS_MSK_IAM\"\n+                                            \"Single file\"\n                                         ],\n-                                        \"propertyDisplayName\": \"SASL Mechanism\",\n-                                        \"propertyName\": \"sasl.mechanism\"\n+                                        \"propertyDisplayName\": \"Tailing mode\",\n+                                        \"propertyName\": \"tail-mode\"\n                                     }\n                                 ],\n-                                \"description\": \"The Amazon Web Services Profile to select when multiple profiles are available.\",\n-                                \"displayName\": \"AWS Profile Name\",\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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"aws.profile.name\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Line Start Pattern\",\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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+                            \"Max Buffer Size\": {\n+                                \"defaultValue\": \"64 KB\",\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"lz4\",\n-                                        \"value\": \"lz4\"\n+                                        \"propertyDisplayName\": \"Line Start Pattern\",\n+                                        \"propertyName\": \"Line Start Pattern\"\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\": \"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\": \"compression.type\",\n+                                \"name\": \"Max Buffer Size\",\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+                            \"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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"kafka-key\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Post-Rollover Tail Period\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"kerberos-user-service\": {\n-                                \"description\": \"Service supporting user authentication with Kerberos\",\n-                                \"displayName\": \"Kerberos User Service\",\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\": \"kerberos-user-service\",\n+                                \"name\": \"Rolling Filename Pattern\",\n                                 \"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\": \"2.0.0-M3\"\n-                                }\n+                                \"sensitive\": false\n                             },\n-                            \"key-attribute-encoding\": {\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\": \"The key is interpreted as a UTF-8 Encoded string.\",\n-                                        \"displayName\": \"UTF-8 Encoded\",\n-                                        \"value\": \"utf-8\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\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\": \"false\",\n+                                        \"value\": \"false\"\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\": \"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                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"key-attribute-encoding\",\n-                                \"required\": true,\n+                                \"name\": \"reread-on-nul\",\n+                                \"required\": false,\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+                            \"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\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"max.block.ms\",\n-                                \"required\": true,\n+                                \"name\": \"tail-base-directory\",\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+                            \"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\": \"max.request.size\",\n+                                \"name\": \"tail-mode\",\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\": \"Environment variables 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+                            \"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\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"message-header-encoding\",\n+                                \"name\": \"tailfile-lookup-frequency\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"partition\": {\n-                                \"description\": \"Specifies which Partition Records will go to.\",\n-                                \"displayName\": \"Partition\",\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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"partition\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"tailfile-maximum-age\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"partitioner.class\": {\n+                            \"tailfile-recursive-lookup\": {\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+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\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\": \"\",\n+                                        \"displayName\": \"false\",\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\": \"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\": \"partitioner.class\",\n-                                \"required\": false,\n+                                \"name\": \"tailfile-recursive-lookup\",\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+                            }\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\": \"All 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+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"file\",\n+                            \"log\",\n+                            \"source\",\n+                            \"tail\",\n+                            \"text\"\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+                        \"useCases\": [],\n+                        \"version\": \"2.0.0-M3\",\n+                        \"writesAttributes\": [\n+                            {\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\": \"f2215c6\"\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 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+                        \"multiProcessorUseCases\": [],\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                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"sasl.kerberos.service.name\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables 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-                            \"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+                            \"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\": \"sasl.mechanism\",\n+                                \"name\": \"cache-size\",\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+                            \"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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"sasl.password\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"cache-ttl-after-last-access\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             },\n-                            \"sasl.token.auth\": {\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\": \"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 or not to indent the output.\",\n+                                \"displayName\": \"Indent\",\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"sasl.username\",\n-                                \"required\": false,\n+                                \"name\": \"indent-output\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"security.protocol\": {\n+                            \"secure-processing\": {\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+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"SASL_SSL\",\n-                                        \"value\": \"SASL_SSL\"\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\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\": \"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\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"security.protocol\",\n+                                \"name\": \"secure-processing\",\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+                            \"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\": \"ssl.context.service\",\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.ssl.SSLContextService\",\n+                                    \"type\": \"org.apache.nifi.lookup.StringLookupService\",\n                                     \"version\": \"2.0.0-M3\"\n                                 }\n                             },\n-                            \"topic\": {\n-                                \"description\": \"The name of the Kafka Topic to publish to.\",\n-                                \"displayName\": \"Topic Name\",\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\": \"Environment variables 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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"transactional-id-prefix\",\n+                                \"name\": \"xslt-controller-key\",\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\": \"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+                        \"sideEffectFree\": true,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"FlowFiles for which all content was sent to Kafka.\",\n+                                \"description\": \"The FlowFile with transformed content will be routed 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\": \"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                         ],\n-                        \"supportsBatching\": false,\n+                        \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": true,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"2.6\",\n-                            \"Apache\",\n-                            \"Kafka\",\n-                            \"Message\",\n-                            \"PubSub\",\n-                            \"Put\",\n-                            \"Send\"\n+                            \"transform\",\n+                            \"xml\",\n+                            \"xslt\"\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.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                         \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\",\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\": \"2.0.0-M3\"\n-        },\n-        {\n-            \"artifact\": \"nifi-cipher-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [],\n-                \"processors\": [\n+                        \"version\": \"2.0.0-M3\"\n+                    },\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-cipher-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -75206,139 +81778,237 @@\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"multiProcessorUseCases\": [],\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+                            \"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\": \"File Filter\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Filename Character Set\": {\n+                                \"defaultValue\": \"UTF-8\",\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"Galois/Counter Mode supporting Authenticated Encryption with Associated Data\",\n-                                        \"displayName\": \"GCM\",\n-                                        \"value\": \"GCM\"\n+                                        \"dependentValues\": [\n+                                            \"zip\",\n+                                            \"use mime.type attribute\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Packaging Format\",\n+                                        \"propertyName\": \"Packaging Format\"\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+                                \"description\": \"If supplied this character set will be supplied to the Zip utility to attempt to decode filenames using the specific character set. If not specified the default platform character set will be used. This is useful if a Zip was created with a different character set than the platform default and the zip uses non standard values to specify.\",\n+                                \"displayName\": \"Filename Character Set\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"cipher-algorithm-mode\",\n-                                \"required\": true,\n+                                \"name\": \"Filename Character Set\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"cipher-algorithm-padding\": {\n+                            \"Packaging Format\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"NoPadding\",\n-                                        \"displayName\": \"NoPadding\",\n-                                        \"value\": \"NoPadding\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"use mime.type attribute\",\n+                                        \"value\": \"use mime.type attribute\"\n                                     },\n                                     {\n-                                        \"description\": \"PKCS5Padding\",\n-                                        \"displayName\": \"PKCS5Padding\",\n-                                        \"value\": \"PKCS5Padding\"\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+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"flowfile-tar-v1\",\n+                                        \"value\": \"flowfile-tar-v1\"\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\": \"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\": \"cipher-algorithm-padding\",\n+                                \"name\": \"Packaging Format\",\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+                            \"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\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"key-specification\",\n-                                \"required\": true,\n+                                \"name\": \"Password\",\n+                                \"required\": false,\n                                 \"sensitive\": true\n                             },\n-                            \"key-specification-format\": {\n+                            \"allow-stored-entries-wdd\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Raw secret key provided as a hexadecimal string\",\n-                                        \"displayName\": \"RAW\",\n-                                        \"value\": \"RAW\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\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+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"PASSWORD\",\n-                                \"description\": \"Format describing the configured Key Specification\",\n-                                \"displayName\": \"Key Specification Format\",\n+                                \"defaultValue\": \"false\",\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\": \"key-specification-format\",\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.MergeContent\"\n+                        ],\n                         \"sideEffectFree\": true,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"Decryption succeeded\",\n-                                \"name\": \"success\"\n+                                \"description\": \"The original FlowFile is sent to this relationship after it has been successfully unpacked\",\n+                                \"name\": \"original\"\n                             },\n                             {\n-                                \"description\": \"Decryption failed\",\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\": \"Unpacked FlowFiles are sent 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                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"AES\",\n-                            \"Argon2\",\n-                            \"PBKDF2\",\n-                            \"bcrypt\",\n-                            \"cryptography\",\n-                            \"decipher\",\n-                            \"decrypt\",\n-                            \"scrypt\"\n+                            \"Unpack\",\n+                            \"archive\",\n+                            \"flowfile-stream\",\n+                            \"flowfile-stream-v3\",\n+                            \"tar\",\n+                            \"un-merge\",\n+                            \"zip\"\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-                        \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\"\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+                        \"useCases\": [\n+                            {\n+                                \"configuration\": \"Set \\\"Packaging Format\\\" value to \\\"zip\\\" or \\\"use mime.type attribute\\\".\\nSet \\\"Filename Character Set\\\" value to \\\"Cp437\\\" or \\\"IBM437\\\".\\n\",\n+                                \"description\": \"Unpack Zip containing filenames with special characters, created on Windows with filename charset 'Cp437' or 'IBM437'.\",\n+                                \"keywords\": [],\n+                                \"notes\": \"\"\n+                            }\n+                        ],\n+                        \"version\": \"2.0.0-M3\",\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+                                \"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                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-cipher-nar\",\n+                        \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -75351,129 +82021,73 @@\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"multiProcessorUseCases\": [],\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-                            },\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+                            \"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\": \"Private Key Identity Resources\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"counter-name\",\n                                 \"required\": true,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"MULTIPLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\",\n-                                        \"URL\"\n-                                    ]\n-                                },\n                                 \"sensitive\": false\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+                            \"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\": \"Private Key Source\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"delta\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.cipher.EncryptContentAge\"\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\": \"Decryption Completed\",\n+                                \"description\": \"Counter was updated/retrieved\",\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+                        \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"ChaCha20-Poly1305\",\n-                            \"X25519\",\n-                            \"age\",\n-                            \"age-encryption.org\",\n-                            \"encryption\"\n+                            \"counter\",\n+                            \"debug\",\n+                            \"instrumentation\"\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+                        \"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                         \"useCases\": [],\n                         \"version\": \"2.0.0-M3\"\n                     },\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-cipher-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -75486,212 +82100,356 @@\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"multiProcessorUseCases\": [],\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"encryption-scheme\": {\n+                            \"db-type\": {\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+                                        \"description\": \"Generates ANSI SQL\",\n+                                        \"displayName\": \"Generic\",\n+                                        \"value\": \"Generic\"\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+                                        \"description\": \"Generates Oracle compliant SQL\",\n+                                        \"displayName\": \"Oracle\",\n+                                        \"value\": \"Oracle\"\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+                                        \"description\": \"Generates Oracle compliant SQL for version 12 or greater\",\n+                                        \"displayName\": \"Oracle 12+\",\n+                                        \"value\": \"Oracle 12+\"\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+                                        \"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\": \"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+                                        \"description\": \"Generates MS SQL Compatible SQL for version 2008\",\n+                                        \"displayName\": \"MS SQL 2008\",\n+                                        \"value\": \"MS SQL 2008\"\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+                                        \"description\": \"Generates MySQL compatible SQL\",\n+                                        \"displayName\": \"MySQL\",\n+                                        \"value\": \"MySQL\"\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+                                        \"description\": \"Generates PostgreSQL compatible SQL\",\n+                                        \"displayName\": \"PostgreSQL\",\n+                                        \"value\": \"PostgreSQL\"\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+                                        \"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-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+                                \"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\": \"2.0.0-M3\"\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\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"updatedatabasetable-catalog-name\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"updatedatabasetable-create-table\": {\n+                                \"allowableValues\": [\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+                                        \"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\": \"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+                                        \"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\": \"2.0.0-M3\"\n+                                }\n+                            },\n+                            \"updatedatabasetable-primary-keys\": {\n+                                \"dependencies\": [\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+                                        \"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\": \"Environment variables 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\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"updatedatabasetable-query-timeout\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"updatedatabasetable-quoted-column-identifiers\": {\n+                                \"allowableValues\": [\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+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\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+                                        \"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                                     {\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\": \"true\",\n+                                        \"value\": \"true\"\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+                                        \"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 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+                                \"dependencies\": [\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+                                        \"dependentValues\": [\n+                                            \"true\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Update Field Names\",\n+                                        \"propertyName\": \"updatedatabasetable-update-field-names\"\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+                                \"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\": \"encryption-scheme\",\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\": \"2.0.0-M3\"\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\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"updatedatabasetable-schema-name\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"key-derivation-strategy\": {\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\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"updatedatabasetable-table-name\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"updatedatabasetable-translate-field-names\": {\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\": \"true\",\n+                                        \"value\": \"true\"\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+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\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+                                \"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\": \"key-derivation-strategy\",\n+                                \"name\": \"updatedatabasetable-translate-field-names\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"password\": {\n-                                \"description\": \"Password required for Password-Based Encryption Schemes\",\n-                                \"displayName\": \"Password\",\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\": \"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\": \"password\",\n+                                \"name\": \"updatedatabasetable-update-field-names\",\n                                 \"required\": true,\n-                                \"sensitive\": true\n+                                \"sensitive\": false\n                             }\n                         },\n-                        \"sideEffectFree\": true,\n+                        \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"Decryption succeeded\",\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\": \"Decryption failed\",\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\": true,\n+                        \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"Jasypt\",\n-                            \"OpenSSL\",\n-                            \"PBES1\",\n-                            \"PKCS5\",\n-                            \"cryptography\",\n-                            \"decipher\",\n-                            \"decrypt\"\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.cipher.DecryptContentCompatibility\",\n-                        \"typeDescription\": \"Decrypt content using password-based encryption schemes with legacy algorithms supporting historical compatibility modes.\",\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                         \"useCases\": [],\n                         \"version\": \"2.0.0-M3\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"Password-Based Encryption Scheme\",\n-                                \"name\": \"pbe.scheme\"\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\": \"Password-Based Encryption Block Cipher\",\n-                                \"name\": \"pbe.symmetric.cipher\"\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\": \"Password-Based Encryption Digest Algorithm\",\n-                                \"name\": \"pbe.digest.algorithm\"\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\": \"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-                        \"artifact\": \"nifi-cipher-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -75699,157 +82457,204 @@\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                         \"multiProcessorUseCases\": [],\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"File Encoding\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Binary encoding\",\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-                                \"displayName\": \"File Encoding\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\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+                            \"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\": \"Public Key Recipient Resources\",\n+                                \"name\": \"Record Reader\",\n                                 \"required\": true,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"MULTIPLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\",\n-                                        \"URL\"\n-                                    ]\n-                                },\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\": \"2.0.0-M3\"\n+                                }\n                             },\n-                            \"Public Key Recipients\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"PROPERTIES\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Public Key Source\",\n-                                        \"propertyName\": \"Public Key Source\"\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+                            \"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\": \"Public Key Recipients\",\n+                                \"name\": \"Record Writer\",\n                                 \"required\": true,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"TEXT\"\n-                                    ]\n-                                },\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\": \"2.0.0-M3\"\n+                                }\n                             },\n-                            \"Public Key Source\": {\n+                            \"Replacement Value Strategy\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Load one or more keys from configured properties\",\n-                                        \"displayName\": \"PROPERTIES\",\n-                                        \"value\": \"PROPERTIES\"\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\": \"Load one or more keys from files or URLs\",\n-                                        \"displayName\": \"RESOURCES\",\n-                                        \"value\": \"RESOURCES\"\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\": \"PROPERTIES\",\n-                                \"description\": \"Source of information determines the loading strategy for X25519 Public Key Recipients\",\n-                                \"displayName\": \"Public Key Source\",\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\": \"Public Key Source\",\n+                                \"name\": \"Replacement Value Strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n                         \"seeAlso\": [\n-                            \"org.apache.nifi.processors.cipher.DecryptContentAge\"\n+                            \"org.apache.nifi.processors.standard.ConvertRecord\"\n                         ],\n-                        \"sideEffectFree\": false,\n+                        \"sideEffectFree\": true,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"Encryption Completed\",\n+                                \"description\": \"FlowFiles that are successfully transformed will be routed to this relationship\",\n                                 \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"Encryption Failed\",\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                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"ChaCha20-Poly1305\",\n-                            \"X25519\",\n-                            \"age\",\n-                            \"age-encryption.org\",\n-                            \"encryption\"\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.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-                        \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\"\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+                        \"useCases\": [\n+                            {\n+                                \"configuration\": \"\\\"Replacement Value Strategy\\\" = \\\"Record Path Value\\\"\\n\\nA single additional property is added to the Processor. The name of the property is a RecordPath identifying the field to place the result in.\\nThe value of the property uses the CONCAT Record Path function to concatenate multiple values together, potentially using other string literal values.\\nFor example, to combine the `title`, `firstName` and `lastName` fields into a single field named `fullName`, we add a property with the name `/fullName` and a value of `CONCAT(/title, ' ', /firstName, ' ', /lastName)`\\n\",\n+                                \"description\": \"Combine multiple fields into a single field.\",\n+                                \"keywords\": [\n+                                    \"combine\",\n+                                    \"concatenate\",\n+                                    \"recordpath\"\n+                                ],\n+                                \"notes\": \"\"\n+                            },\n+                            {\n+                                \"configuration\": \"    \\\"Replacement Value Strategy\\\" = \\\"Literal Value\\\"\\n\\n    A single additional property is added to the Processor. The name of the property is a RecordPath identifying the field to place the result in.\\n    The value of the property is the explicit value to set the field to. For example, we can set any field with a name of `txId`, regardless of its level in the data's hierarchy,     to `1111-1111` by adding a property with a name of `//txId` and a value of `1111-1111`\\n\",\n+                                \"description\": \"Change the value of a record field to an explicit value.\",\n+                                \"keywords\": [\n+                                    \"change\",\n+                                    \"update\",\n+                                    \"replace\",\n+                                    \"transform\"\n+                                ],\n+                                \"notes\": \"\"\n+                            },\n+                            {\n+                                \"configuration\": \"    \\\"Replacement Value Strategy\\\" = \\\"Record Path Value\\\"\\n\\n    A single additional property is added to the Processor. The name of the property is a RecordPath identifying the field to update.\\n    The value of the property is a RecordPath identifying the field to copy the value from.\\n    For example, we can copy the value of `/identifiers/all/imei` to the `identifier` field at the root level, by adding a property named     `/identifier` with a value of `/identifiers/all/imei`.\\n\",\n+                                \"description\": \"Copy the value of one record field to another record field.\",\n+                                \"keywords\": [\n+                                    \"change\",\n+                                    \"update\",\n+                                    \"copy\",\n+                                    \"recordpath\",\n+                                    \"hierarchy\",\n+                                    \"transform\"\n+                                ],\n+                                \"notes\": \"\"\n+                            },\n+                            {\n+                                \"configuration\": \"\\\"Replacement Value Strategy\\\" = \\\"Literal Value\\\"\\n\\nA single additional property is added to the Processor. The name of the property is a RecordPath identifying the field to place the result in.\\nThe value of the property is an Expression Language expression that references the attribute of interest. We can, for example, insert a new field name `filename` into each record by adding a property named `/filename` with a value of `${filename}`\\n\",\n+                                \"description\": \"Enrich data by injecting the value of an attribute into each Record.\",\n+                                \"keywords\": [\n+                                    \"enrich\",\n+                                    \"attribute\",\n+                                    \"change\",\n+                                    \"update\",\n+                                    \"replace\",\n+                                    \"insert\",\n+                                    \"transform\"\n+                                ],\n+                                \"notes\": \"\"\n+                            },\n+                            {\n+                                \"configuration\": \"\\\"Replacement Value Strategy\\\" = \\\"Literal Value\\\"\\n\\nA single additional property is added to the Processor. The name of the property is a RecordPath identifying the field to update.\\nThe value is an Expression Language expression that references the `field.value` variable. For example, to change the date/time format of a field named `txDate` from `year-month-day` format to `month/day/year` format, we add a property named `/txDate` with a value of `${field.value:toDate('yyyy-MM-dd'):format('MM/dd/yyyy')}`. We could also change the timezone of a timestamp field (and insert the timezone for clarity) by using a value of `${field.value:toDate('yyyy-MM-dd HH:mm:ss', 'UTC-0400'):format('yyyy-MM-dd HH:mm:ss Z', 'UTC')}`.\\n\",\n+                                \"description\": \"Change the format of a record field's value.\",\n+                                \"keywords\": [\n+                                    \"change\",\n+                                    \"update\",\n+                                    \"replace\",\n+                                    \"insert\",\n+                                    \"transform\",\n+                                    \"format\",\n+                                    \"date/time\",\n+                                    \"timezone\",\n+                                    \"expression language\"\n+                                ],\n+                                \"notes\": \"Use the RenameRecordField Processor in order to change a field's name.\"\n+                            }\n+                        ],\n+                        \"version\": \"2.0.0-M3\",\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\": false,\n-                        \"artifact\": \"nifi-cipher-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -75862,383 +82667,401 @@\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"multiProcessorUseCases\": [],\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"mac-algorithm\": {\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\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"validate-csv-delimiter\",\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables 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\": \"HmacSHA256\",\n-                                        \"value\": \"HmacSHA256\"\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"HmacSHA512\",\n-                                        \"value\": \"HmacSHA512\"\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"description\": \"Hashed Message Authentication Code Function\",\n-                                \"displayName\": \"Message Authentication Code Algorithm\",\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\": \"mac-algorithm\",\n+                                \"name\": \"validate-csv-header\",\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+                            \"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\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"message-authentication-code\",\n+                                \"name\": \"validate-csv-quote\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"message-authentication-code-encoding\": {\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\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"validate-csv-schema\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"validate-csv-strategy\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"HEXADECIMAL\",\n-                                        \"value\": \"HEXADECIMAL\"\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\": \"\",\n-                                        \"displayName\": \"BASE64\",\n-                                        \"value\": \"BASE64\"\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\": \"HEXADECIMAL\",\n-                                \"description\": \"Encoding of the Message Authentication Code\",\n-                                \"displayName\": \"Message Authentication Code Encoding\",\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\": \"message-authentication-code-encoding\",\n+                                \"name\": \"validate-csv-strategy\",\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+                            \"validate-csv-violations\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"UTF8\",\n-                                        \"value\": \"UTF8\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"HEXADECIMAL\",\n-                                        \"value\": \"HEXADECIMAL\"\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"BASE64\",\n-                                        \"value\": \"BASE64\"\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"HEXADECIMAL\",\n-                                \"description\": \"Encoding of the Secret Key\",\n-                                \"displayName\": \"Secret Key Encoding\",\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\": \"secret-key-encoding\",\n+                                \"name\": \"validate-csv-violations\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"sideEffectFree\": false,\n+                        \"sideEffectFree\": true,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"Signature Verification Succeeded\",\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\": \"Signature Verification Failed\",\n-                                \"name\": \"failure\"\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                         ],\n                         \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"Authentication\",\n-                            \"HMAC\",\n-                            \"MAC\",\n-                            \"Signing\"\n+                            \"csv\",\n+                            \"schema\",\n+                            \"validation\"\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.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                         \"useCases\": [],\n                         \"version\": \"2.0.0-M3\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"Calculated Message Authentication Code encoded by the selected encoding\",\n-                                \"name\": \"mac.calculated\"\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 Encoding of the Hashed Message Authentication Code\",\n-                                \"name\": \"mac.encoding\"\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\": \"Hashed Message Authentication Code Algorithm\",\n-                                \"name\": \"mac.algorithm\"\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-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"2.0.0-M3\"\n-        },\n-        {\n-            \"artifact\": \"nifi-zendesk-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [],\n-                \"processors\": [\n+                    },\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-zendesk-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\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\": \"20 sec\",\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_FORBIDDEN\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"multiProcessorUseCases\": [],\n-                        \"primaryNodeOnly\": true,\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-                                \"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\": \"2.0.0-M3\"\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+                            \"JSON Schema\": {\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"Authentication token generated in Zendesk Admin menu for API access.\",\n-                                        \"displayName\": \"Token\",\n-                                        \"value\": \"token\"\n+                                        \"dependentValues\": [\n+                                            \"SCHEMA_CONTENT_PROPERTY\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"Schema Access Strategy\"\n                                     }\n                                 ],\n-                                \"description\": \"Type of authentication to Zendesk API.\",\n-                                \"displayName\": \"Authentication Type\",\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\": \"zendesk-authentication-type-name\",\n+                                \"name\": \"JSON Schema\",\n                                 \"required\": true,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"SINGLE\",\n+                                    \"resourceTypes\": [\n+                                        \"TEXT\",\n+                                        \"FILE\",\n+                                        \"URL\"\n+                                    ]\n+                                },\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\": \"Environment variables and FlowFile Attributes\",\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+                            \"JSON Schema Registry\": {\n+                                \"dependencies\": [\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+                                        \"dependentValues\": [\n+                                            \"SCHEMA_NAME_PROPERTY\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"Schema Access Strategy\"\n                                     }\n                                 ],\n-                                \"description\": \"Method for incremental export.\",\n-                                \"displayName\": \"Export Method\",\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\": \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"zendesk-query-start-timestamp\",\n+                                \"name\": \"JSON Schema Registry\",\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.schemaregistry.services.JsonSchemaRegistry\",\n+                                    \"version\": \"2.0.0-M3\"\n+                                }\n                             },\n-                            \"zendesk-resource\": {\n+                            \"JSON Schema Version\": {\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-                                    },\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-                                    },\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\": \"Draft Version 4\",\n+                                        \"displayName\": \"Draft 4\",\n+                                        \"value\": \"DRAFT_4\"\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\": \"Draft Version 6\",\n+                                        \"displayName\": \"Draft 6\",\n+                                        \"value\": \"DRAFT_6\"\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\": \"Draft Version 7\",\n+                                        \"displayName\": \"Draft 7\",\n+                                        \"value\": \"DRAFT_7\"\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\": \"Draft Version 2019-09\",\n+                                        \"displayName\": \"Draft 2019-09\",\n+                                        \"value\": \"DRAFT_2019_09\"\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+                                        \"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-                                        \"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+                                        \"dependentValues\": [\n+                                            \"SCHEMA_CONTENT_PROPERTY\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"Schema Access Strategy\"\n                                     }\n                                 ],\n-                                \"description\": \"The particular Zendesk resource which is meant to be exported.\",\n-                                \"displayName\": \"Resource\",\n+                                \"description\": \"The JSON schema specification\",\n+                                \"displayName\": \"JSON Schema Version\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"zendesk-resource\",\n+                                \"name\": \"JSON Schema Version\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"zendesk-subdomain\": {\n-                                \"description\": \"Name of the Zendesk subdomain.\",\n-                                \"displayName\": \"Subdomain Name\",\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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"zendesk-subdomain\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Schema Access Strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"zendesk-user\": {\n-                                \"description\": \"Login user to Zendesk subdomain.\",\n-                                \"displayName\": \"User Name\",\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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"zendesk-user\",\n+                                \"name\": \"Schema Name\",\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+                        \"restricted\": true,\n+                        \"sideEffectFree\": true,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"For FlowFiles created as a result of a successful HTTP request.\",\n-                                \"name\": \"success\"\n+                                \"description\": \"FlowFiles that cannot be read as JSON are routed to this relationship\",\n+                                \"name\": \"failure\"\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 are successfully validated against the schema are routed to this relationship\",\n+                                \"name\": \"valid\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": false,\n+                        \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": 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-                            \"zendesk\"\n+                            \"JSON\",\n+                            \"schema\",\n+                            \"validation\"\n                         ],\n-                        \"triggerSerially\": true,\n+                        \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.zendesk.GetZendesk\",\n-                        \"typeDescription\": \"Incrementally fetches data from Zendesk API.\",\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                         \"useCases\": [],\n                         \"version\": \"2.0.0-M3\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"The number of records fetched by the processor.\",\n-                                \"name\": \"record.count\"\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-zendesk-nar\",\n+                        \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -76246,303 +83069,273 @@\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+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"multiProcessorUseCases\": [],\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+                            \"allow-extra-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\": \"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\": \"web-client-service-provider\",\n+                                \"name\": \"allow-extra-fields\",\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\": \"2.0.0-M3\"\n-                                }\n+                                \"sensitive\": false\n                             },\n-                            \"zendesk-authentication-type-name\": {\n+                            \"coerce-types\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Password of Zendesk login user.\",\n-                                        \"displayName\": \"Password\",\n-                                        \"value\": \"password\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n-                                        \"description\": \"Authentication token generated in Zendesk Admin menu for API access.\",\n-                                        \"displayName\": \"Token\",\n-                                        \"value\": \"token\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"description\": \"Type of authentication to Zendesk API.\",\n-                                \"displayName\": \"Authentication Type\",\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\": \"zendesk-authentication-type-name\",\n+                                \"name\": \"coerce-types\",\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+                            \"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\": \"2.0.0-M3\"\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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"zendesk-authentication-value-name\",\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\": 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\": \"2.0.0-M3\"\n+                                }\n                             },\n-                            \"zendesk-comment-body\": {\n-                                \"dependencies\": [\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\": \"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\": \"2.0.0-M3\"\n+                                }\n+                            },\n+                            \"schema-access-strategy\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"propertyDisplayName\": \"Record Reader\",\n-                                        \"propertyName\": \"zendesk-record-reader\"\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-                                \"description\": \"The content or the path to the comment body in the incoming record.\",\n-                                \"displayName\": \"Comment Body\",\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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"zendesk-comment-body\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"schema-access-strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"zendesk-priority\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"propertyDisplayName\": \"Record Reader\",\n-                                        \"propertyName\": \"zendesk-record-reader\"\n-                                    }\n-                                ],\n-                                \"description\": \"The content or the path to the priority in the incoming record.\",\n-                                \"displayName\": \"Priority\",\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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"zendesk-priority\",\n+                                \"name\": \"schema-name\",\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+                            \"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\": \"zendesk-record-reader\",\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\": \"2.0.0-M3\"\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\": \"Environment variables 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+                            \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"zendesk-subject\",\n+                                \"name\": \"schema-text\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"zendesk-type\": {\n-                                \"dependencies\": [\n+                            \"strict-type-checking\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"propertyDisplayName\": \"Record Reader\",\n-                                        \"propertyName\": \"zendesk-record-reader\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"description\": \"The content or the path to the type in the incoming record.\",\n-                                \"displayName\": \"Type\",\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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"zendesk-type\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"strict-type-checking\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"zendesk-user\": {\n-                                \"description\": \"Login user to Zendesk subdomain.\",\n-                                \"displayName\": \"User Name\",\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\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"zendesk-user\",\n-                                \"required\": true,\n+                                \"name\": \"validation-details-attribute-name\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"sideEffectFree\": false,\n+                        \"sideEffectFree\": true,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"For FlowFiles created as a result of a successful HTTP request.\",\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\": \"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\": \"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                         ],\n-                        \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": true,\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"zendesk, ticket\"\n+                            \"record\",\n+                            \"schema\",\n+                            \"validate\"\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+                        \"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                         \"useCases\": [],\n                         \"version\": \"2.0.0-M3\",\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+                                \"description\": \"Sets the mime.type attribute to the MIME Type specified by the Record Writer\",\n+                                \"name\": \"mime.type\"\n                             },\n                             {\n-                                \"description\": \"The error message of from the response.\",\n-                                \"name\": \"error.message\"\n+                                \"description\": \"The number of records in the FlowFile routed to a relationship\",\n+                                \"name\": \"record.count\"\n                             }\n                         ]\n-                    }\n-                ],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"2.0.0-M3\"\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\": \"f2215c6\"\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-                            },\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-                            \"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\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\n-                    }\n-                ],\n-                \"processors\": [],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"2.0.0-M3\"\n-        },\n-        {\n-            \"artifact\": \"nifi-windows-event-log-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [],\n-                \"processors\": [\n+                    },\n                     {\n                         \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-windows-event-log-nar\",\n+                        \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -76550,133 +83343,102 @@\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_FORBIDDEN\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"multiProcessorUseCases\": [],\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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+                            \"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\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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+                                \"name\": \"Schema File\",\n+                                \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"SINGLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\",\n+                                        \"URL\"\n+                                    ]\n+                                },\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+                            \"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\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"query\",\n-                                \"required\": true,\n+                                \"name\": \"XML Source Attribute\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"sideEffectFree\": false,\n+                        \"restricted\": true,\n+                        \"sideEffectFree\": true,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"Relationship for successfully consumed events.\",\n-                                \"name\": \"success\"\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+                            {\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                         ],\n-                        \"supportsBatching\": false,\n+                        \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\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-                            \"event\",\n-                            \"ingest\",\n-                            \"windows\"\n+                            \"schema\",\n+                            \"validation\",\n+                            \"xml\",\n+                            \"xsd\"\n                         ],\n-                        \"triggerSerially\": true,\n+                        \"triggerSerially\": false,\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+                        \"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                         \"useCases\": [],\n                         \"version\": \"2.0.0-M3\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"Will set a MIME type value of application/xml.\",\n-                                \"name\": \"mime.type\"\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-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\n-        },\n-        {\n-            \"artifact\": \"nifi-smb-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [],\n-                \"processors\": [\n+                    },\n                     {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-smb-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -76689,464 +83451,1281 @@\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"multiProcessorUseCases\": [],\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Completion Strategy\": {\n+                            \"attribute-copy-mode\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Leaves the file as-is.\",\n-                                        \"displayName\": \"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-                                        \"displayName\": \"Move File\",\n-                                        \"value\": \"MOVE\"\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\": \"Deletes the file from the remote system.\",\n-                                        \"displayName\": \"Delete File\",\n-                                        \"value\": \"DELETE\"\n+                                        \"description\": \"Attributes on released FlowFiles are not overwritten by copied cached attributes.\",\n+                                        \"displayName\": \"Keep original\",\n+                                        \"value\": \"keeporiginal\"\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-                                \"displayName\": \"Completion Strategy\",\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\": \"Completion Strategy\",\n+                                \"name\": \"attribute-copy-mode\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\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-                                \"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+                            \"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\": \"Create Destination Directory\",\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\": \"2.0.0-M3\"\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"expiration-duration\",\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+                            \"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\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Destination Directory\",\n+                                \"name\": \"releasable-flowfile-count\",\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+                            \"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\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"remote-file\",\n+                                \"name\": \"release-signal-id\",\n                                 \"required\": true,\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+                            \"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\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"signal-counter-name\",\n+                                \"required\": false,\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"target-signal-count\",\n+                                \"required\": true,\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                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"smb-client-provider-service\",\n+                                \"name\": \"wait-buffer-count\",\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\": \"2.0.0-M3\"\n-                                }\n+                                \"sensitive\": false\n+                            },\n+                            \"wait-mode\": {\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+                                    },\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+                                    }\n+                                ],\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\": \"wait-mode\",\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.processors.smb.GetSmbFile\",\n-                            \"org.apache.nifi.processors.smb.ListSmb\",\n-                            \"org.apache.nifi.processors.smb.PutSmbFile\"\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 will be routed here for each successfully fetched file.\",\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 will be routed here when failed to fetch its content.\",\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                         ],\n-                        \"supportsBatching\": false,\n+                        \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"cifs\",\n-                            \"fetch\",\n-                            \"files\",\n-                            \"samba\",\n-                            \"smb\"\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.smb.FetchSmb\",\n-                        \"typeDescription\": \"Fetches files from a SMB Share. Designed to be used in tandem with ListSmb.\",\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                         \"useCases\": [],\n                         \"version\": \"2.0.0-M3\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"The error code returned by SMB when the fetch of a file fails.\",\n-                                \"name\": \"error.code\"\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 error message returned by SMB when the fetch of a file fails.\",\n-                                \"name\": \"error.message\"\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+                ],\n+                \"reportingTasks\": [\n                     {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-smb-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\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-                        \"multiProcessorUseCases\": [],\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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-                                \"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-                            \"Ignore Hidden Files\": {\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\": \"Indicates whether or not hidden files should be ignored\",\n-                                \"displayName\": \"Ignore Hidden Files\",\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\": \"Ignore Hidden Files\",\n+                                \"name\": \"Show Deltas\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Keep Source File\": {\n+                            \"reporting-granularity\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\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\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\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\": \"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\": \"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\": \"Keep Source File\",\n-                                \"required\": true,\n+                                \"name\": \"reporting-granularity\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n-                            },\n-                            \"Password\": {\n-                                \"description\": \"The password used for authentication. Required if Username is set.\",\n-                                \"displayName\": \"Password\",\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\": \"2.0.0-M3\"\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-standard-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"f2215c6\"\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\": \"Password\",\n+                                \"name\": \"Directory Display Name\",\n                                 \"required\": false,\n-                                \"sensitive\": 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+                            \"Directory Location\": {\n+                                \"description\": \"The directory path of the partition to be monitored.\",\n+                                \"displayName\": \"Directory Location\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Path Filter\",\n-                                \"required\": false,\n+                                \"name\": \"Directory Location\",\n+                                \"required\": true,\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+                            \"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\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Polling Interval\",\n+                                \"name\": \"Threshold\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n-                            },\n-                            \"Recurse Subdirectories\": {\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\": \"2.0.0-M3\"\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-standard-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"f2215c6\"\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\": \"G1 Eden Space\",\n+                                        \"value\": \"G1 Eden Space\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"displayName\": \"G1 Old Gen\",\n+                                        \"value\": \"G1 Old Gen\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"G1 Survivor Space\",\n+                                        \"value\": \"G1 Survivor Space\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"Indicates whether or not to pull files from subdirectories\",\n-                                \"displayName\": \"Recurse Subdirectories\",\n+                                \"defaultValue\": \"G1 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\": \"Recurse Subdirectories\",\n+                                \"name\": \"Memory Pool\",\n                                 \"required\": true,\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+                            \"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\": \"Share\",\n-                                \"required\": true,\n+                                \"name\": \"Reporting Interval\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Share Access Strategy\": {\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-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"read, write, delete\",\n-                                        \"value\": \"read, write, delete\"\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+                            \"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\": \"Share Access Strategy\",\n+                                \"name\": \"Usage Threshold\",\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+                            }\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\": \"2.0.0-M3\"\n+                    },\n+                    {\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-standard-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"f2215c6\"\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\": \"Username\",\n-                                \"required\": false,\n+                                \"name\": \"Hostname\",\n+                                \"required\": true,\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-                                \"description\": \"Enables accessing Distributed File System (DFS) and following DFS links during SMB operations.\",\n-                                \"displayName\": \"Enable DFS\",\n+                            \"Port\": {\n+                                \"defaultValue\": \"8649\",\n+                                \"description\": \"The Port on which Ganglia is listening for incoming connections\",\n+                                \"displayName\": \"Port\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"enable-dfs\",\n+                                \"name\": \"Port\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"smb-dialect\": {\n+                            \"Send JVM Metrics\": {\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+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"SMB 3.1.1\",\n-                                        \"value\": \"SMB_3_1_1\"\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\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+                                \"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\": \"smb-dialect\",\n+                                \"name\": \"Send JVM Metrics\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n-                            },\n-                            \"timeout\": {\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\": \"2.0.0-M3\"\n+                    }\n+                ]\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\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\": \"f2215c6\"\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+                        \"multiProcessorUseCases\": [],\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\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Character Encoding\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\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\": \"hl7-input-version\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\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\": \"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\": \"parse-segment-fields\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\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 HL7 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+                            \"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\": \"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\": \"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+                            {\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+                        \"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+                        \"useCases\": [],\n+                        \"version\": \"2.0.0-M3\"\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-hl7-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"f2215c6\"\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\": \"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+                        \"multiProcessorUseCases\": [],\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\": \"Environment variables 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+                        ],\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": true,\n+                        \"supportsDynamicRelationships\": false,\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+                        \"useCases\": [],\n+                        \"version\": \"2.0.0-M3\",\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\": \"2.0.0-M3\"\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\": \"f2215c6\"\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+                        \"multiProcessorUseCases\": [],\n+                        \"primaryNodeOnly\": false,\n+                        \"propertyDescriptors\": {\n+                            \"Completion Strategy\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Leaves the file as-is.\",\n+                                        \"displayName\": \"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+                                        \"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\": \"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\": \"Completion Strategy\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\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+                                \"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\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Destination Directory\",\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"remote-file\",\n+                                \"required\": true,\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\": \"2.0.0-M3\"\n+                                }\n+                            }\n+                        },\n+                        \"seeAlso\": [\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\": \"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+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"cifs\",\n+                            \"fetch\",\n+                            \"files\",\n+                            \"samba\",\n+                            \"smb\"\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+                        \"useCases\": [],\n+                        \"version\": \"2.0.0-M3\",\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+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-smb-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"f2215c6\"\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+                        \"multiProcessorUseCases\": [],\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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+                                \"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+                            \"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\": \"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\": \"Ignore Hidden 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\": \"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\": \"Keep Source File\",\n+                                \"required\": true,\n+                                \"sensitive\": false\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+                            \"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+                                \"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\": \"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\": \"Recurse Subdirectories\",\n+                                \"required\": true,\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Share\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Share Access Strategy\": {\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+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"read, write, delete\",\n+                                        \"value\": \"read, write, delete\"\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Share Access Strategy\",\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+                                \"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+                                \"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+                            \"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+                                \"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                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n                                 \"name\": \"timeout\",\n@@ -77875,272 +85454,560 @@\n                 ],\n                 \"reportingTasks\": []\n             },\n             \"group\": \"org.apache.nifi\",\n             \"version\": \"2.0.0-M3\"\n         },\n         {\n-            \"artifact\": \"nifi-kerberos-user-service-nar\",\n+            \"artifact\": \"nifi-azure-services-api-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n+                \"processors\": [],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"2.0.0-M3\"\n+        },\n+        {\n+            \"artifact\": \"nifi-elasticsearch-client-service-nar\",\n             \"componentManifest\": {\n                 \"controllerServices\": [\n                     {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-kerberos-user-service-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-elasticsearch-client-service-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n-                        \"explicitRestrictions\": [\n+                        \"dynamicProperties\": [\n                             {\n-                                \"explanation\": \"Allows user to define a Keytab and principal that can then be used by other components.\",\n-                                \"requiredPermission\": \"access keytab\"\n+                                \"description\": \"Adds the specified property name/value as a Request Header in the Elasticsearch requests.\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\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-                            \"Kerberos Keytab\": {\n-                                \"description\": \"Kerberos keytab associated with the principal.\",\n-                                \"displayName\": \"Kerberos Keytab\",\n+                            \"api-key\": {\n+                                \"dependencies\": [\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Kerberos Keytab\",\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+                                    {\n+                                        \"dependentValues\": [\n+                                            \"API_KEY\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Authorization Scheme\",\n+                                        \"propertyName\": \"authorization-scheme\"\n+                                    }\n+                                ],\n+                                \"description\": \"Unique identifier of the API key.\",\n+                                \"displayName\": \"API Key ID\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"api-key-id\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\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\": \"authorization-scheme\",\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+                            \"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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Kerberos Principal\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"el-cs-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.KerberosUserService\",\n-                                \"version\": \"2.0.0-M3\"\n                             },\n-                            {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.kerberos.SelfContainedKerberosUserService\",\n-                                \"version\": \"2.0.0-M3\"\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.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\": \"2.0.0-M3\"\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-kerberos-user-service-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"f2215c6\"\n-                        },\n-                        \"group\": \"org.apache.nifi\",\n-                        \"propertyDescriptors\": {\n-                            \"Kerberos Password\": {\n-                                \"description\": \"Kerberos password associated with the principal.\",\n-                                \"displayName\": \"Kerberos Password\",\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\": \"Kerberos Password\",\n+                                \"name\": \"el-cs-connect-timeout\",\n                                 \"required\": true,\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+                            \"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+                                \"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\": \"el-cs-enable-compression\",\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                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Kerberos Principal\",\n+                                \"name\": \"el-cs-http-hosts\",\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\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-kerberos-user-service-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"f2215c6\"\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+                            },\n+                            \"el-cs-node-selector\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Select any Elasticsearch node to handle requests\",\n+                                        \"displayName\": \"Any\",\n+                                        \"value\": \"ANY\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Skip dedicated Elasticsearch master nodes for handling request\",\n+                                        \"displayName\": \"Skip Dedicated Masters\",\n+                                        \"value\": \"SKIP_DEDICATED_MASTERS\"\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"el-cs-node-selector\",\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                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Kerberos Principal\",\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\": \"el-cs-path-prefix\",\n+                                \"required\": false,\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"el-cs-send-meta-header\",\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+                            \"el-cs-sniff-cluster-nodes\": {\n+                                \"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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"el-cs-sniff-cluster-nodes\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\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+                                \"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\": \"el-cs-sniff-failure\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"el-cs-sniffer-failure-delay\": {\n+                                \"defaultValue\": \"1 min\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"true\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Sniff on Failure\",\n+                                        \"propertyName\": \"el-cs-sniff-failure\"\n+                                    }\n+                                ],\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\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"el-cs-sniffer-failure-delay\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"el-cs-sniffer-interval\": {\n+                                \"defaultValue\": \"5 mins\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"true\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Sniff Cluster Nodes\",\n+                                        \"propertyName\": \"el-cs-sniff-cluster-nodes\"\n+                                    }\n+                                ],\n+                                \"description\": \"Interval between Cluster sniffer operations\",\n+                                \"displayName\": \"Sniffer Interval\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"el-cs-sniffer-interval\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\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\": \"el-cs-sniffer-request-timeout\",\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"el-cs-socket-timeout\",\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\": \"2.0.0-M3\"\n+                                }\n+                            },\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\": \"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\": \"el-cs-strict-deprecation\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"el-cs-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/empty, will be written out as a null/empty 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/empty, will not be written out\",\n+                                        \"displayName\": \"Always Suppress\",\n+                                        \"value\": \"always-suppress\"\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"el-cs-suppress-nulls\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"el-cs-username\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"BASIC\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Authorization Scheme\",\n+                                        \"propertyName\": \"authorization-scheme\"\n+                                    }\n+                                ],\n+                                \"description\": \"The username to use with XPack security.\",\n+                                \"displayName\": \"Username\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Kerberos Ticket Cache File\",\n-                                \"required\": true,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\"\n-                                    ]\n-                                },\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\": \"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\": \"2.0.0-M3\"\n+                                }\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\": \"2.0.0-M3\"\n-                            },\n-                            {\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.kerberos.SelfContainedKerberosUserService\",\n+                                \"type\": \"org.apache.nifi.elasticsearch.ElasticSearchClientService\",\n                                 \"version\": \"2.0.0-M3\"\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+                            \"client\",\n+                            \"elasticsearch\",\n+                            \"elasticsearch6\",\n+                            \"elasticsearch7\",\n+                            \"elasticsearch8\"\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.elasticsearch.ElasticSearchClientServiceImpl\",\n+                        \"typeDescription\": \"A controller service for accessing an Elasticsearch client, using the Elasticsearch (low-level) REST Client.\",\n                         \"version\": \"2.0.0-M3\"\n-                    }\n-                ],\n-                \"processors\": [],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"2.0.0-M3\"\n-        },\n-        {\n-            \"artifact\": \"nifi-protobuf-services-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [\n+                    },\n                     {\n                         \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-protobuf-services-nar\",\n+                        \"artifact\": \"nifi-elasticsearch-client-service-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\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                         \"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+                            \"el-lookup-index\": {\n+                                \"description\": \"The name of the index to read from\",\n+                                \"displayName\": \"Index\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Message Type\",\n+                                \"name\": \"el-lookup-index\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Proto Directory\": {\n-                                \"description\": \"Directory containing Protocol Buffers message definition (.proto) file(s).\",\n-                                \"displayName\": \"Proto 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\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Proto Directory\",\n-                                \"required\": true,\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\": \"2.0.0-M3\"\n+                                }\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 schema reference information will be provided through a configured Schema Reference Reader service implementation.\",\n-                                        \"displayName\": \"Schema Reference Reader\",\n-                                        \"value\": \"schema-reference-reader\"\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\": \"Infer from Result\",\n+                                        \"value\": \"infer\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"generate-from-proto-file\",\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\": \"schema-access-strategy\",\n                                 \"required\": true,\n@@ -78181,39 +86048,14 @@\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n                                 \"name\": \"schema-name\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"schema-reference-reader\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"schema-reference-reader\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"Service implementation responsible for reading FlowFile attributes or content to determine the Schema Reference Identifier\",\n-                                \"displayName\": \"Schema Reference Reader\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"schema-reference-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.schemaregistry.services.SchemaReferenceReader\",\n-                                    \"version\": \"2.0.0-M3\"\n-                                }\n-                            },\n                             \"schema-registry\": {\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n                                             \"schema-reference-reader\",\n                                             \"schema-name\"\n                                         ],\n@@ -78276,3215 +86118,2378 @@\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.lookup.LookupService\",\n                                 \"version\": \"2.0.0-M3\"\n                             }\n                         ],\n-                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicProperties\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"parser\",\n-                            \"protobuf\",\n-                            \"reader\",\n+                            \"elasticsearch\",\n+                            \"enrich\",\n+                            \"lookup\",\n                             \"record\"\n                         ],\n-                        \"type\": \"org.apache.nifi.services.protobuf.ProtobufReader\",\n-                        \"typeDescription\": \"Parses a Protocol Buffers message from binary format.\",\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\": \"2.0.0-M3\"\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-elasticsearch-client-service-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"f2215c6\"\n+                        },\n+                        \"group\": \"org.apache.nifi\",\n+                        \"propertyDescriptors\": {\n+                            \"el-lookup-index\": {\n+                                \"description\": \"The name of the index to read from\",\n+                                \"displayName\": \"Index\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\n+                            },\n+                            {\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.lookup.LookupService\",\n+                                \"version\": \"2.0.0-M3\"\n+                            }\n+                        ],\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"elasticsearch\",\n+                            \"enrich\",\n+                            \"key\",\n+                            \"lookup\",\n+                            \"value\"\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\": \"2.0.0-M3\"\n                     }\n                 ],\n                 \"processors\": [],\n                 \"reportingTasks\": []\n             },\n             \"group\": \"org.apache.nifi\",\n             \"version\": \"2.0.0-M3\"\n         },\n         {\n-            \"artifact\": \"nifi-prometheus-nar\",\n+            \"artifact\": \"nifi-dropbox-processors-nar\",\n             \"componentManifest\": {\n-                \"controllerServices\": [\n+                \"controllerServices\": [],\n+                \"processors\": [\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-prometheus-nar\",\n+                        \"artifact\": \"nifi-dropbox-processors-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\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+                        \"multiProcessorUseCases\": [],\n+                        \"primaryNodeOnly\": false,\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-                                    {\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+                            \"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\": \"prometheus-reporting-task-client-auth\",\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"prometheus-reporting-task-instance-id\",\n+                                \"name\": \"dropbox-credential-service\",\n                                 \"required\": true,\n-                                \"sensitive\": false\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\": \"2.0.0-M3\"\n+                                }\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+                            \"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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"prometheus-reporting-task-metrics-endpoint-port\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"file\",\n                                 \"required\": true,\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-                                \"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\": \"prometheus-reporting-task-ssl-context\",\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\": \"2.0.0-M3\"\n                                 }\n                             }\n                         },\n-                        \"providedApiImplementations\": [\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.dropbox.ListDropbox\",\n+                            \"org.apache.nifi.processors.dropbox.PutDropbox\"\n+                        ],\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\": \"2.0.0-M3\"\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                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"prometheus\",\n-                            \"record\",\n-                            \"send\",\n-                            \"write\"\n+                            \"dropbox\",\n+                            \"fetch\",\n+                            \"storage\"\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-                        \"version\": \"2.0.0-M3\"\n-                    }\n-                ],\n-                \"processors\": [],\n-                \"reportingTasks\": [\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+                        \"useCases\": [],\n+                        \"version\": \"2.0.0-M3\",\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-prometheus-nar\",\n+                        \"artifact\": \"nifi-dropbox-processors-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\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\": \"60 sec\"\n+                            \"TIMER_DRIVEN\": \"1 min\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n+                        \"multiProcessorUseCases\": [],\n+                        \"primaryNodeOnly\": true,\n                         \"propertyDescriptors\": {\n-                            \"prometheus-reporting-task-client-auth\": {\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\": \"2.0.0-M3\"\n+                                }\n+                            },\n+                            \"et-initial-listing-target\": {\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\": \"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\": \"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+                                        \"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-                                        \"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+                                        \"dependentValues\": [\n+                                            \"entities\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Listing Strategy\",\n+                                        \"propertyName\": \"listing-strategy\"\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\": \"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\": \"prometheus-reporting-task-client-auth\",\n-                                \"required\": true,\n+                                \"name\": \"et-initial-listing-target\",\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+                            \"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+                                \"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\": \"2.0.0-M3\"\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\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"prometheus-reporting-task-instance-id\",\n-                                \"required\": true,\n+                                \"name\": \"et-time-window\",\n+                                \"required\": false,\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+                            \"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\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"prometheus-reporting-task-metrics-endpoint-port\",\n+                                \"name\": \"folder\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"prometheus-reporting-task-metrics-send-jvm\": {\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+                                \"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. 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\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\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\": \"false\",\n-                                \"description\": \"Send JVM metrics in addition to the NiFi metrics\",\n-                                \"displayName\": \"Send JVM metrics\",\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\": \"prometheus-reporting-task-metrics-send-jvm\",\n+                                \"name\": \"recursive-search\",\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+                            {\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+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"dropbox\",\n+                            \"storage\"\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+                        \"useCases\": [],\n+                        \"version\": \"2.0.0-M3\",\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+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-dropbox-processors-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"f2215c6\"\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+                        \"multiProcessorUseCases\": [],\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-                            \"prometheus-reporting-task-metrics-strategy\": {\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\": \"Send rollup metrics for the entire root process group\",\n-                                        \"displayName\": \"Root Process Group\",\n-                                        \"value\": \"Root Process Group\"\n+                                        \"description\": \"Handle file conflict as failure.\",\n+                                        \"displayName\": \"fail\",\n+                                        \"value\": \"fail\"\n                                     },\n                                     {\n-                                        \"description\": \"Send metrics for each process group\",\n-                                        \"displayName\": \"All Process Groups\",\n-                                        \"value\": \"All Process Groups\"\n+                                        \"description\": \"Ignore conflict, do not change the original file.\",\n+                                        \"displayName\": \"ignore\",\n+                                        \"value\": \"ignore\"\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+                                        \"description\": \"Replace existing file in case of conflict.\",\n+                                        \"displayName\": \"replace\",\n+                                        \"value\": \"replace\"\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+                                \"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\": \"prometheus-reporting-task-metrics-strategy\",\n+                                \"name\": \"conflict-resolution-strategy\",\n                                 \"required\": true,\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-                                \"displayName\": \"SSL Context 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\": \"prometheus-reporting-task-ssl-context\",\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\": \"2.0.0-M3\"\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\": \"Environment variables 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\": \"Environment variables 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.ssl.RestrictedSSLContextService\",\n+                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n                                     \"version\": \"2.0.0-M3\"\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\": \"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                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"metrics\",\n-                            \"prometheus\",\n-                            \"reporting\",\n-                            \"time series data\"\n+                            \"dropbox\",\n+                            \"put\",\n+                            \"storage\"\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-                        \"version\": \"2.0.0-M3\"\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+                        \"useCases\": [],\n+                        \"version\": \"2.0.0-M3\",\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+                ],\n+                \"reportingTasks\": []\n             },\n             \"group\": \"org.apache.nifi\",\n             \"version\": \"2.0.0-M3\"\n         },\n         {\n-            \"artifact\": \"nifi-aws-nar\",\n+            \"artifact\": \"nifi-github-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n+                \"processors\": [],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"2.0.0-M3\"\n+        },\n+        {\n+            \"artifact\": \"nifi-jms-processors-nar\",\n             \"componentManifest\": {\n                 \"controllerServices\": [\n                     {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-aws-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-jms-processors-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\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\": \"ENVIRONMENT\",\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-                            \"aws-credentials-provider-service\": {\n-                                \"description\": \"The Controller Service that is used to obtain AWS credentials provider\",\n-                                \"displayName\": \"AWS Credentials Provider Service\",\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\": \"aws-credentials-provider-service\",\n+                                \"name\": \"SSL Context Service\",\n                                 \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-aws-service-api-nar\",\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.processors.aws.credentials.provider.service.AWSCredentialsProviderService\",\n+                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n                                     \"version\": \"2.0.0-M3\"\n                                 }\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+                            \"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\": \"cache-expiration\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"cf\",\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+                            \"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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"cflib\",\n+                                \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"MULTIPLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\",\n+                                        \"URL\",\n+                                        \"DIRECTORY\"\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\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\n+                    },\n+                    {\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-jms-processors-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"f2215c6\"\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\": \"ENVIRONMENT\",\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"cache-size\",\n-                                \"required\": true,\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"java.naming.security.principal\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"communications-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+                            \"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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"naming.factory.libraries\",\n+                                \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"MULTIPLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\",\n+                                        \"URL\",\n+                                        \"DIRECTORY\"\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\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\n+                    }\n+                ],\n+                \"processors\": [\n+                    {\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-jms-processors-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"f2215c6\"\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 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\": \"ENVIRONMENT\",\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+                        \"multiProcessorUseCases\": [],\n+                        \"primaryNodeOnly\": false,\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                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"communications-timeout\",\n+                                \"name\": \"Acknowledgement Mode\",\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+                            \"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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"proxy-configuration-service\",\n+                                \"name\": \"Connection Factory Service\",\n                                 \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"artifact\": \"nifi-jms-cf-service-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n+                                    \"type\": \"org.apache.nifi.jms.cf.JMSConnectionFactoryProviderDefinition\",\n                                     \"version\": \"2.0.0-M3\"\n                                 }\n                             },\n-                            \"region\": {\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\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Destination Name\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Destination Type\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"AWS Region Code : us-gov-east-1\",\n-                                        \"displayName\": \"AWS GovCloud (US-East)\",\n-                                        \"value\": \"us-gov-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-gov-west-1\",\n-                                        \"displayName\": \"AWS GovCloud (US-West)\",\n-                                        \"value\": \"us-gov-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : af-south-1\",\n-                                        \"displayName\": \"Africa (Cape Town)\",\n-                                        \"value\": \"af-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-east-1\",\n-                                        \"displayName\": \"Asia Pacific (Hong Kong)\",\n-                                        \"value\": \"ap-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-south-2\",\n-                                        \"displayName\": \"Asia Pacific (Hyderabad)\",\n-                                        \"value\": \"ap-south-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-3\",\n-                                        \"displayName\": \"Asia Pacific (Jakarta)\",\n-                                        \"value\": \"ap-southeast-3\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-4\",\n-                                        \"displayName\": \"Asia Pacific (Melbourne)\",\n-                                        \"value\": \"ap-southeast-4\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-south-1\",\n-                                        \"displayName\": \"Asia Pacific (Mumbai)\",\n-                                        \"value\": \"ap-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-northeast-3\",\n-                                        \"displayName\": \"Asia Pacific (Osaka)\",\n-                                        \"value\": \"ap-northeast-3\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-northeast-2\",\n-                                        \"displayName\": \"Asia Pacific (Seoul)\",\n-                                        \"value\": \"ap-northeast-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-1\",\n-                                        \"displayName\": \"Asia Pacific (Singapore)\",\n-                                        \"value\": \"ap-southeast-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-2\",\n-                                        \"displayName\": \"Asia Pacific (Sydney)\",\n-                                        \"value\": \"ap-southeast-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-northeast-1\",\n-                                        \"displayName\": \"Asia Pacific (Tokyo)\",\n-                                        \"value\": \"ap-northeast-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ca-central-1\",\n-                                        \"displayName\": \"Canada (Central)\",\n-                                        \"value\": \"ca-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ca-west-1\",\n-                                        \"displayName\": \"Canada West (Calgary)\",\n-                                        \"value\": \"ca-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : cn-north-1\",\n-                                        \"displayName\": \"China (Beijing)\",\n-                                        \"value\": \"cn-north-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : cn-northwest-1\",\n-                                        \"displayName\": \"China (Ningxia)\",\n-                                        \"value\": \"cn-northwest-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-central-1\",\n-                                        \"displayName\": \"Europe (Frankfurt)\",\n-                                        \"value\": \"eu-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-west-1\",\n-                                        \"displayName\": \"Europe (Ireland)\",\n-                                        \"value\": \"eu-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-west-2\",\n-                                        \"displayName\": \"Europe (London)\",\n-                                        \"value\": \"eu-west-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-south-1\",\n-                                        \"displayName\": \"Europe (Milan)\",\n-                                        \"value\": \"eu-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-west-3\",\n-                                        \"displayName\": \"Europe (Paris)\",\n-                                        \"value\": \"eu-west-3\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-south-2\",\n-                                        \"displayName\": \"Europe (Spain)\",\n-                                        \"value\": \"eu-south-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-north-1\",\n-                                        \"displayName\": \"Europe (Stockholm)\",\n-                                        \"value\": \"eu-north-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-central-2\",\n-                                        \"displayName\": \"Europe (Zurich)\",\n-                                        \"value\": \"eu-central-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : il-central-1\",\n-                                        \"displayName\": \"Israel (Tel Aviv)\",\n-                                        \"value\": \"il-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : me-south-1\",\n-                                        \"displayName\": \"Middle East (Bahrain)\",\n-                                        \"value\": \"me-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : me-central-1\",\n-                                        \"displayName\": \"Middle East (UAE)\",\n-                                        \"value\": \"me-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : sa-east-1\",\n-                                        \"displayName\": \"South America (Sao Paulo)\",\n-                                        \"value\": \"sa-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-east-1\",\n-                                        \"displayName\": \"US East (N. Virginia)\",\n-                                        \"value\": \"us-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-east-2\",\n-                                        \"displayName\": \"US East (Ohio)\",\n-                                        \"value\": \"us-east-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-iso-east-1\",\n-                                        \"displayName\": \"US ISO East\",\n-                                        \"value\": \"us-iso-east-1\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"QUEUE\",\n+                                        \"value\": \"QUEUE\"\n                                     },\n                                     {\n-                                        \"description\": \"AWS Region Code : us-iso-west-1\",\n-                                        \"displayName\": \"US ISO WEST\",\n-                                        \"value\": \"us-iso-west-1\"\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\": \"Destination Type\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Durable subscription\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"description\": \"AWS Region Code : us-isob-east-1\",\n-                                        \"displayName\": \"US ISOB East (Ohio)\",\n-                                        \"value\": \"us-isob-east-1\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n-                                        \"description\": \"AWS Region Code : us-west-1\",\n-                                        \"displayName\": \"US West (N. California)\",\n-                                        \"value\": \"us-west-1\"\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://jakarta.ee/specifications/platform/9/apidocs/jakarta/jms/session#createDurableConsumer-jakarta.jms.Topic-java.lang.String-\",\n+                                \"displayName\": \"Durable Subscription\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"Environment variables 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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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+                                \"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 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\": \"2.0.0-M3\"\n+                                }\n+                            },\n+                            \"Shared subscription\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"description\": \"AWS Region Code : us-west-2\",\n-                                        \"displayName\": \"US West (Oregon)\",\n-                                        \"value\": \"us-west-2\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n-                                        \"description\": \"AWS Region Code : aws-cn-global\",\n-                                        \"displayName\": \"aws-cn-global\",\n-                                        \"value\": \"aws-cn-global\"\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://jakarta.ee/specifications/platform/9/apidocs/jakarta/jms/session#createSharedConsumer-jakarta.jms.Topic-java.lang.String-\",\n+                                \"displayName\": \"Shared Subscription\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Timeout\",\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"cflib\",\n+                                \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"MULTIPLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\",\n+                                        \"URL\",\n+                                        \"DIRECTORY\"\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\": \"Environment variables 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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"java.naming.provider.url\",\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+                                \"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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"naming.factory.libraries\",\n+                                \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"MULTIPLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\",\n+                                        \"URL\",\n+                                        \"DIRECTORY\"\n+                                    ]\n+                                },\n+                                \"sensitive\": false\n+                            },\n+                            \"output-strategy\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"description\": \"AWS Region Code : aws-global\",\n-                                        \"displayName\": \"aws-global\",\n-                                        \"value\": \"aws-global\"\n+                                        \"description\": \"Write only the message to the FlowFile record.\",\n+                                        \"displayName\": \"Use Content as Value\",\n+                                        \"value\": \"USE_VALUE\"\n                                     },\n                                     {\n-                                        \"description\": \"AWS Region Code : aws-iso-b-global\",\n-                                        \"displayName\": \"aws-iso-b-global\",\n-                                        \"value\": \"aws-iso-b-global\"\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\": \"AWS Region Code : aws-iso-global\",\n-                                        \"displayName\": \"aws-iso-global\",\n-                                        \"value\": \"aws-iso-global\"\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\": \"AWS Region Code : aws-us-gov-global\",\n-                                        \"displayName\": \"aws-us-gov-global\",\n-                                        \"value\": \"aws-us-gov-global\"\n+                                        \"propertyDisplayName\": \"Record Reader\",\n+                                        \"propertyName\": \"record-reader\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"us-west-2\",\n-                                \"description\": \"The region of the cloud resources\",\n-                                \"displayName\": \"Region\",\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\": \"region\",\n+                                \"name\": \"output-strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"schema-registry-name\": {\n-                                \"description\": \"The name of the Schema Registry\",\n-                                \"displayName\": \"Schema Registry Name\",\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\": \"schema-registry-name\",\n-                                \"required\": true,\n-                                \"sensitive\": false\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\": \"2.0.0-M3\"\n+                                }\n                             },\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+                            \"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                                 \"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\": \"2.0.0-M3\"\n                                 }\n                             }\n                         },\n-                        \"providedApiImplementations\": [\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-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.schemaregistry.services.SchemaRegistry\",\n-                                \"version\": \"2.0.0-M3\"\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-                        \"supportsDynamicProperties\": false,\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": false,\n+                        \"supportsDynamicProperties\": true,\n+                        \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"avro\",\n-                            \"aws\",\n-                            \"glue\",\n-                            \"registry\",\n-                            \"schema\"\n+                            \"consume\",\n+                            \"get\",\n+                            \"jms\",\n+                            \"message\",\n+                            \"receive\"\n                         ],\n-                        \"type\": \"org.apache.nifi.aws.schemaregistry.AmazonGlueSchemaRegistry\",\n-                        \"typeDescription\": \"Provides a Schema Registry that interacts with the AWS Glue Schema Registry so that those Schemas that are stored in the Glue Schema Registry can be used in NiFi. When a Schema is looked up by name by this registry, it will find a Schema in the Glue Schema Registry with their names.\",\n-                        \"version\": \"2.0.0-M3\"\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+                        \"useCases\": [],\n+                        \"version\": \"2.0.0-M3\",\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+                            },\n+                            {\n+                                \"description\": \"Each message property is written to an attribute.\",\n+                                \"name\": \"other attributes\"\n+                            }\n+                        ]\n                     },\n                     {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-aws-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-jms-processors-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\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 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\": \"ENVIRONMENT\",\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\": \"The default configuration can read environment variables and system properties for credentials\",\n-                                \"requiredPermission\": \"access environment credentials\"\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_REQUIRED\",\n+                        \"multiProcessorUseCases\": [],\n+                        \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Access Key\": {\n-                                \"description\": \"\",\n-                                \"displayName\": \"Access Key ID\",\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\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Access Key\",\n+                                \"name\": \"Connection Client ID\",\n                                 \"required\": false,\n-                                \"sensitive\": true\n+                                \"sensitive\": false\n                             },\n-                            \"Assume Role ARN\": {\n-                                \"description\": \"The AWS Role ARN for cross account access. This is used in conjunction with Assume Role Session Name and other Assume Role properties.\",\n-                                \"displayName\": \"Assume Role ARN\",\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\": \"Assume Role ARN\",\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\": \"2.0.0-M3\"\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\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Destination Name\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Assume Role Session Name\": {\n-                                \"dependencies\": [\n+                            \"Destination Type\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"propertyDisplayName\": \"Assume Role ARN\",\n-                                        \"propertyName\": \"Assume Role ARN\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"QUEUE\",\n+                                        \"value\": \"QUEUE\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"TOPIC\",\n+                                        \"value\": \"TOPIC\"\n                                     }\n                                 ],\n-                                \"description\": \"The AWS Role Session Name for cross account access. This is used in conjunction with Assume Role ARN.\",\n-                                \"displayName\": \"Assume Role Session Name\",\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\": \"Assume Role Session Name\",\n+                                \"name\": \"Destination Type\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Credentials File\": {\n-                                \"description\": \"Path to a file containing AWS access key and secret key in properties file format.\",\n-                                \"displayName\": \"Credentials File\",\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\": \"Credentials File\",\n-                                \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\"\n-                                    ]\n-                                },\n-                                \"sensitive\": false\n-                            },\n-                            \"Secret Key\": {\n-                                \"description\": \"\",\n-                                \"displayName\": \"Secret Access Key\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Secret Key\",\n+                                \"name\": \"Password\",\n                                 \"required\": false,\n                                 \"sensitive\": true\n                             },\n-                            \"Session Time\": {\n-                                \"defaultValue\": \"3600\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"propertyDisplayName\": \"Assume Role ARN\",\n-                                        \"propertyName\": \"Assume Role ARN\"\n-                                    }\n-                                ],\n-                                \"description\": \"Session time for role based session (between 900 and 3600 seconds). This is used in conjunction with Assume Role ARN.\",\n-                                \"displayName\": \"Assume Role Session Time\",\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\": \"Session 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\": \"2.0.0-M3\"\n+                                }\n+                            },\n+                            \"User Name\": {\n+                                \"description\": \"User Name used for authentication and authorization.\",\n+                                \"displayName\": \"User Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"User Name\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"anonymous-credentials\": {\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\": \"If true, uses Anonymous credentials\",\n-                                \"displayName\": \"Use Anonymous Credentials\",\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\": \"anonymous-credentials\",\n-                                \"required\": false,\n+                                \"name\": \"allow-illegal-chars-in-jms-header-names\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"assume-role-external-id\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"propertyDisplayName\": \"Assume Role ARN\",\n-                                        \"propertyName\": \"Assume Role ARN\"\n-                                    }\n-                                ],\n-                                \"description\": \"External ID for cross-account access. This is used in conjunction with Assume Role ARN.\",\n-                                \"displayName\": \"Assume Role External ID\",\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\": \"assume-role-external-id\",\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"broker\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"assume-role-proxy-host\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"propertyDisplayName\": \"Assume Role ARN\",\n-                                        \"propertyName\": \"Assume Role ARN\"\n-                                    }\n-                                ],\n-                                \"description\": \"Proxy host for cross-account access, if needed within your environment. This will configure a proxy to request for temporary access keys into another AWS account.\",\n-                                \"displayName\": \"Assume Role Proxy Host\",\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"cflib\",\n+                                \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"MULTIPLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\",\n+                                        \"URL\",\n+                                        \"DIRECTORY\"\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\": \"Environment variables 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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"java.naming.provider.url\",\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                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"assume-role-proxy-host\",\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"java.naming.security.principal\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"assume-role-proxy-port\": {\n-                                \"dependencies\": [\n+                            \"message-body-type\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"propertyDisplayName\": \"Assume Role ARN\",\n-                                        \"propertyName\": \"Assume Role ARN\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"bytes\",\n+                                        \"value\": \"bytes\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"text\",\n+                                        \"value\": \"text\"\n                                     }\n                                 ],\n-                                \"description\": \"Proxy port for cross-account access, if needed within your environment. This will configure a proxy to request for temporary access keys into another AWS account.\",\n-                                \"displayName\": \"Assume Role Proxy Port\",\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\": \"assume-role-proxy-port\",\n+                                \"name\": \"message-body-type\",\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"naming.factory.libraries\",\n                                 \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"MULTIPLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\",\n+                                        \"URL\",\n+                                        \"DIRECTORY\"\n+                                    ]\n+                                },\n                                 \"sensitive\": false\n                             },\n-                            \"assume-role-ssl-context-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\": \"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\": \"2.0.0-M3\"\n+                                }\n+                            },\n+                            \"record-writer\": {\n                                 \"dependencies\": [\n                                     {\n-                                        \"propertyDisplayName\": \"Assume Role ARN\",\n-                                        \"propertyName\": \"Assume Role ARN\"\n+                                        \"propertyDisplayName\": \"Record Reader\",\n+                                        \"propertyName\": \"record-reader\"\n                                     }\n                                 ],\n-                                \"description\": \"SSL Context Service used when connecting to the STS Endpoint.\",\n-                                \"displayName\": \"Assume Role SSL Context Service\",\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\": \"assume-role-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\": \"2.0.0-M3\"\n                                 }\n+                            }\n+                        },\n+                        \"readsAttributes\": [\n+                            {\n+                                \"description\": \"This attribute becomes the JMSDeliveryMode message header. Must be an integer.\",\n+                                \"name\": \"jms_deliveryMode\"\n                             },\n-                            \"assume-role-sts-endpoint\": {\n+                            {\n+                                \"description\": \"This attribute becomes the JMSExpiration message header. Must be a long.\",\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+                                \"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\": true,\n+                        \"supportsDynamicRelationships\": 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+                        ],\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+                        \"useCases\": [],\n+                        \"version\": \"2.0.0-M3\"\n+                    }\n+                ],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"2.0.0-M3\"\n+        },\n+        {\n+            \"artifact\": \"nifi-snmp-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n+                \"processors\": [\n+                    {\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-snmp-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"f2215c6\"\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+                        \"multiProcessorUseCases\": [],\n+                        \"primaryNodeOnly\": false,\n+                        \"propertyDescriptors\": {\n+                            \"snmp-authentication-passphrase\": {\n                                 \"dependencies\": [\n                                     {\n-                                        \"propertyDisplayName\": \"Assume Role ARN\",\n-                                        \"propertyName\": \"Assume Role ARN\"\n+                                        \"dependentValues\": [\n+                                            \"authPriv\",\n+                                            \"authNoPriv\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"SNMP Security Level\",\n+                                        \"propertyName\": \"snmp-security-level\"\n                                     }\n                                 ],\n-                                \"description\": \"The default AWS Security Token Service (STS) endpoint (\\\"sts.amazonaws.com\\\") works for all accounts that are not for China (Beijing) region or GovCloud. You only need to set this property to \\\"sts.cn-north-1.amazonaws.com.cn\\\" when you are requesting session credentials for services in China(Beijing) region or to \\\"sts.us-gov-west-1.amazonaws.com\\\" for GovCloud.\",\n-                                \"displayName\": \"Assume Role STS Endpoint Override\",\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\": \"assume-role-sts-endpoint\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n+                                \"name\": \"snmp-authentication-passphrase\",\n+                                \"required\": true,\n+                                \"sensitive\": true\n                             },\n-                            \"assume-role-sts-region\": {\n+                            \"snmp-authentication-protocol\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"AWS Region Code : ap-south-2\",\n-                                        \"displayName\": \"Asia Pacific (Hyderabad)\",\n-                                        \"value\": \"ap-south-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-south-1\",\n-                                        \"displayName\": \"Asia Pacific (Mumbai)\",\n-                                        \"value\": \"ap-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-south-1\",\n-                                        \"displayName\": \"Europe (Milan)\",\n-                                        \"value\": \"eu-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-south-2\",\n-                                        \"displayName\": \"Europe (Spain)\",\n-                                        \"value\": \"eu-south-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-gov-east-1\",\n-                                        \"displayName\": \"AWS GovCloud (US-East)\",\n-                                        \"value\": \"us-gov-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : me-central-1\",\n-                                        \"displayName\": \"Middle East (UAE)\",\n-                                        \"value\": \"me-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : il-central-1\",\n-                                        \"displayName\": \"Israel (Tel Aviv)\",\n-                                        \"value\": \"il-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ca-central-1\",\n-                                        \"displayName\": \"Canada (Central)\",\n-                                        \"value\": \"ca-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-central-1\",\n-                                        \"displayName\": \"Europe (Frankfurt)\",\n-                                        \"value\": \"eu-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-iso-west-1\",\n-                                        \"displayName\": \"US ISO WEST\",\n-                                        \"value\": \"us-iso-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-central-2\",\n-                                        \"displayName\": \"Europe (Zurich)\",\n-                                        \"value\": \"eu-central-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-west-1\",\n-                                        \"displayName\": \"US West (N. California)\",\n-                                        \"value\": \"us-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-west-2\",\n-                                        \"displayName\": \"US West (Oregon)\",\n-                                        \"value\": \"us-west-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : af-south-1\",\n-                                        \"displayName\": \"Africa (Cape Town)\",\n-                                        \"value\": \"af-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-north-1\",\n-                                        \"displayName\": \"Europe (Stockholm)\",\n-                                        \"value\": \"eu-north-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-west-3\",\n-                                        \"displayName\": \"Europe (Paris)\",\n-                                        \"value\": \"eu-west-3\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-west-2\",\n-                                        \"displayName\": \"Europe (London)\",\n-                                        \"value\": \"eu-west-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-west-1\",\n-                                        \"displayName\": \"Europe (Ireland)\",\n-                                        \"value\": \"eu-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-northeast-3\",\n-                                        \"displayName\": \"Asia Pacific (Osaka)\",\n-                                        \"value\": \"ap-northeast-3\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-northeast-2\",\n-                                        \"displayName\": \"Asia Pacific (Seoul)\",\n-                                        \"value\": \"ap-northeast-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-northeast-1\",\n-                                        \"displayName\": \"Asia Pacific (Tokyo)\",\n-                                        \"value\": \"ap-northeast-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : me-south-1\",\n-                                        \"displayName\": \"Middle East (Bahrain)\",\n-                                        \"value\": \"me-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : sa-east-1\",\n-                                        \"displayName\": \"South America (Sao Paulo)\",\n-                                        \"value\": \"sa-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-east-1\",\n-                                        \"displayName\": \"Asia Pacific (Hong Kong)\",\n-                                        \"value\": \"ap-east-1\"\n+                                        \"description\": \"Provides authentication based on the HMAC-MD5 algorithm.\",\n+                                        \"displayName\": \"MD5\",\n+                                        \"value\": \"MD5\"\n                                     },\n                                     {\n-                                        \"description\": \"AWS Region Code : cn-north-1\",\n-                                        \"displayName\": \"China (Beijing)\",\n-                                        \"value\": \"cn-north-1\"\n+                                        \"description\": \"Provides authentication based on the HMAC-SHA algorithm.\",\n+                                        \"displayName\": \"SHA\",\n+                                        \"value\": \"SHA\"\n                                     },\n                                     {\n-                                        \"description\": \"AWS Region Code : ca-west-1\",\n-                                        \"displayName\": \"Canada West (Calgary)\",\n-                                        \"value\": \"ca-west-1\"\n+                                        \"description\": \"Provides authentication based on the HMAC-SHA-2 algorithm.\",\n+                                        \"displayName\": \"SHA224\",\n+                                        \"value\": \"HMAC128SHA224\"\n                                     },\n                                     {\n-                                        \"description\": \"AWS Region Code : us-gov-west-1\",\n-                                        \"displayName\": \"AWS GovCloud (US-West)\",\n-                                        \"value\": \"us-gov-west-1\"\n+                                        \"description\": \"Provides authentication based on the HMAC-SHA-2 algorithm.\",\n+                                        \"displayName\": \"SHA256\",\n+                                        \"value\": \"HMAC192SHA256\"\n                                     },\n                                     {\n-                                        \"description\": \"AWS Region Code : ap-southeast-1\",\n-                                        \"displayName\": \"Asia Pacific (Singapore)\",\n-                                        \"value\": \"ap-southeast-1\"\n+                                        \"description\": \"Provides authentication based on the HMAC-SHA-2 algorithm.\",\n+                                        \"displayName\": \"SHA384\",\n+                                        \"value\": \"HMAC256SHA384\"\n                                     },\n                                     {\n-                                        \"description\": \"AWS Region Code : ap-southeast-2\",\n-                                        \"displayName\": \"Asia Pacific (Sydney)\",\n-                                        \"value\": \"ap-southeast-2\"\n-                                    },\n+                                        \"description\": \"Provides authentication based on the HMAC-SHA-2 algorithm.\",\n+                                        \"displayName\": \"SHA512\",\n+                                        \"value\": \"HMAC384SHA512\"\n+                                    }\n+                                ],\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"AWS Region Code : us-iso-east-1\",\n-                                        \"displayName\": \"US ISO East\",\n-                                        \"value\": \"us-iso-east-1\"\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\": \"snmp-authentication-protocol\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"snmp-community\": {\n+                                \"defaultValue\": \"public\",\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"AWS Region Code : ap-southeast-3\",\n-                                        \"displayName\": \"Asia Pacific (Jakarta)\",\n-                                        \"value\": \"ap-southeast-3\"\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\": \"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\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"snmp-hostname\",\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"snmp-port\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"snmp-private-protocol\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"description\": \"AWS Region Code : ap-southeast-4\",\n-                                        \"displayName\": \"Asia Pacific (Melbourne)\",\n-                                        \"value\": \"ap-southeast-4\"\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\": \"AWS Region Code : us-east-1\",\n-                                        \"displayName\": \"US East (N. Virginia)\",\n-                                        \"value\": \"us-east-1\"\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\": \"AWS Region Code : us-east-2\",\n-                                        \"displayName\": \"US East (Ohio)\",\n-                                        \"value\": \"us-east-2\"\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\": \"AWS Region Code : cn-northwest-1\",\n-                                        \"displayName\": \"China (Ningxia)\",\n-                                        \"value\": \"cn-northwest-1\"\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\": \"AWS Region Code : us-isob-east-1\",\n-                                        \"displayName\": \"US ISOB East (Ohio)\",\n-                                        \"value\": \"us-isob-east-1\"\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-                                \"defaultValue\": \"us-west-2\",\n                                 \"dependencies\": [\n                                     {\n-                                        \"propertyDisplayName\": \"Assume Role ARN\",\n-                                        \"propertyName\": \"Assume Role ARN\"\n+                                        \"dependentValues\": [\n+                                            \"authPriv\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"SNMP Security Level\",\n+                                        \"propertyName\": \"snmp-security-level\"\n                                     }\n                                 ],\n-                                \"description\": \"The AWS Security Token Service (STS) region\",\n-                                \"displayName\": \"Assume Role STS Region\",\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\": \"assume-role-sts-region\",\n-                                \"required\": false,\n+                                \"name\": \"snmp-private-protocol\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"assume-role-sts-signer-override\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Default Signature\",\n-                                        \"value\": \"Default Signature\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Signature Version 4\",\n-                                        \"value\": \"AWS4SignerType\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Custom Signature\",\n-                                        \"value\": \"CustomSignerType\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"Default Signature\",\n+                            \"snmp-private-protocol-passphrase\": {\n                                 \"dependencies\": [\n                                     {\n-                                        \"propertyDisplayName\": \"Assume Role ARN\",\n-                                        \"propertyName\": \"Assume Role ARN\"\n+                                        \"dependentValues\": [\n+                                            \"authPriv\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"SNMP Security Level\",\n+                                        \"propertyName\": \"snmp-security-level\"\n                                     }\n                                 ],\n-                                \"description\": \"The AWS STS library uses Signature Version 4 by default. This property allows you to plug in your own custom signer implementation.\",\n-                                \"displayName\": \"Assume Role STS Signer Override\",\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\": \"assume-role-sts-signer-override\",\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-                            \"custom-signer-class-name\": {\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-                                            \"CustomSignerType\"\n+                                            \"SNMPv3\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Assume Role STS Signer Override\",\n-                                        \"propertyName\": \"assume-role-sts-signer-override\"\n+                                        \"propertyDisplayName\": \"SNMP Version\",\n+                                        \"propertyName\": \"snmp-version\"\n                                     }\n                                 ],\n-                                \"description\": \"Fully qualified class name of the custom signer class. The signer must implement com.amazonaws.auth.Signer interface.\",\n-                                \"displayName\": \"Custom Signer Class Name\",\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"custom-signer-class-name\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"snmp-security-level\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"custom-signer-module-location\": {\n+                            \"snmp-security-name\": {\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"CustomSignerType\"\n+                                            \"SNMPv3\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Assume Role STS Signer Override\",\n-                                        \"propertyName\": \"assume-role-sts-signer-override\"\n+                                        \"propertyDisplayName\": \"SNMP Version\",\n+                                        \"propertyName\": \"snmp-version\"\n                                     }\n                                 ],\n-                                \"description\": \"Comma-separated list of paths to files and/or directories which contain the custom signer's JAR file and its dependencies (if any).\",\n-                                \"displayName\": \"Custom Signer Module Location\",\n+                                \"description\": \"User name used for SNMP v3 Authentication.\",\n+                                \"displayName\": \"SNMP Security Name\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"custom-signer-module-location\",\n-                                \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"MULTIPLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\",\n-                                        \"DIRECTORY\"\n-                                    ]\n-                                },\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"snmp-security-name\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"default-credentials\": {\n+                            \"snmp-strategy\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\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\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\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\": \"false\",\n-                                \"description\": \"If true, uses the Default Credential chain, including EC2 instance profiles or roles, environment variables, default user credentials, etc.\",\n-                                \"displayName\": \"Use Default Credentials\",\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\": \"default-credentials\",\n+                                \"name\": \"snmp-strategy\",\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"snmp-textual-oid\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"profile-name\": {\n-                                \"description\": \"The AWS profile name for credentials from the profile configuration file.\",\n-                                \"displayName\": \"Profile Name\",\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"profile-name\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"snmp-timeout\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n-                            }\n-                        },\n-                        \"providedApiImplementations\": [\n-                            {\n-                                \"artifact\": \"nifi-aws-service-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.processors.aws.credentials.provider.service.AWSCredentialsProviderService\",\n-                                \"version\": \"2.0.0-M3\"\n                             },\n-                            {\n-                                \"artifact\": \"nifi-aws-service-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.processors.aws.credentials.provider.AwsCredentialsProviderService\",\n-                                \"version\": \"2.0.0-M3\"\n-                            }\n-                        ],\n-                        \"restricted\": true,\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"aws\",\n-                            \"credentials\",\n-                            \"provider\"\n-                        ],\n-                        \"type\": \"org.apache.nifi.processors.aws.credentials.provider.service.AWSCredentialsProviderControllerService\",\n-                        \"typeDescription\": \"Defines credentials for Amazon Web Services processors. Uses default credentials without configuration. Default credentials support EC2 instance profile/role, default user profile, environment variables, etc. Additional options include access key / secret key pairs, credentials file, named profile, and assume role credentials.\",\n-                        \"version\": \"2.0.0-M3\"\n-                    },\n-                    {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-aws-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"f2215c6\"\n-                        },\n-                        \"group\": \"org.apache.nifi\",\n-                        \"propertyDescriptors\": {\n-                            \"encryption-strategy\": {\n+                            \"snmp-version\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"No encryption.\",\n-                                        \"displayName\": \"None\",\n-                                        \"value\": \"NONE\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Use server-side, S3-managed encryption.\",\n-                                        \"displayName\": \"Server-side S3\",\n-                                        \"value\": \"SSE_S3\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Use server-side, KMS key to perform encryption.\",\n-                                        \"displayName\": \"Server-side KMS\",\n-                                        \"value\": \"SSE_KMS\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Use server-side, customer-supplied key to perform encryption.\",\n-                                        \"displayName\": \"Server-side Customer Key\",\n-                                        \"value\": \"SSE_C\"\n+                                        \"description\": \"SNMP version 1\",\n+                                        \"displayName\": \"v1\",\n+                                        \"value\": \"SNMPv1\"\n                                     },\n                                     {\n-                                        \"description\": \"Use client-side, KMS key to perform encryption.\",\n-                                        \"displayName\": \"Client-side KMS\",\n-                                        \"value\": \"CSE_KMS\"\n+                                        \"description\": \"SNMP version 2c\",\n+                                        \"displayName\": \"v2c\",\n+                                        \"value\": \"SNMPv2c\"\n                                     },\n                                     {\n-                                        \"description\": \"Use client-side, customer-supplied key to perform encryption.\",\n-                                        \"displayName\": \"Client-side Customer Key\",\n-                                        \"value\": \"CSE_C\"\n+                                        \"description\": \"SNMP version 3 with improved security\",\n+                                        \"displayName\": \"v3\",\n+                                        \"value\": \"SNMPv3\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"NONE\",\n-                                \"description\": \"Strategy to use for S3 data encryption and decryption.\",\n-                                \"displayName\": \"Encryption Strategy\",\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\": \"encryption-strategy\",\n+                                \"name\": \"snmp-version\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n+                            }\n+                        },\n+                        \"sideEffectFree\": false,\n+                        \"supportedRelationships\": [\n+                            {\n+                                \"description\": \"All FlowFiles that are received from the SNMP agent are routed to this relationship.\",\n+                                \"name\": \"success\"\n                             },\n-                            \"key-id-or-key-material\": {\n-                                \"description\": \"For None and Server-side S3: not used. For Server-side KMS and Client-side KMS: the KMS Key ID must be configured. For Server-side Customer Key and Client-side Customer Key: the Key Material must be specified in Base64 encoded form. In case of Server-side Customer Key, the key must be an AES-256 key. In case of Client-side Customer Key, it can be an AES-256, AES-192 or AES-128 key.\",\n-                                \"displayName\": \"Key ID or Key Material\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"key-id-or-key-material\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n-                            },\n-                            \"kms-region\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-gov-west-1\",\n-                                        \"displayName\": \"AWS GovCloud (US)\",\n-                                        \"value\": \"us-gov-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-gov-east-1\",\n-                                        \"displayName\": \"AWS GovCloud (US-East)\",\n-                                        \"value\": \"us-gov-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-east-1\",\n-                                        \"displayName\": \"US East (N. Virginia)\",\n-                                        \"value\": \"us-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-east-2\",\n-                                        \"displayName\": \"US East (Ohio)\",\n-                                        \"value\": \"us-east-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-west-1\",\n-                                        \"displayName\": \"US West (N. California)\",\n-                                        \"value\": \"us-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-west-2\",\n-                                        \"displayName\": \"US West (Oregon)\",\n-                                        \"value\": \"us-west-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-west-1\",\n-                                        \"displayName\": \"EU (Ireland)\",\n-                                        \"value\": \"eu-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-west-2\",\n-                                        \"displayName\": \"EU (London)\",\n-                                        \"value\": \"eu-west-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-west-3\",\n-                                        \"displayName\": \"EU (Paris)\",\n-                                        \"value\": \"eu-west-3\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-central-1\",\n-                                        \"displayName\": \"EU (Frankfurt)\",\n-                                        \"value\": \"eu-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-central-2\",\n-                                        \"displayName\": \"EU (Zurich)\",\n-                                        \"value\": \"eu-central-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-north-1\",\n-                                        \"displayName\": \"EU (Stockholm)\",\n-                                        \"value\": \"eu-north-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-south-1\",\n-                                        \"displayName\": \"EU (Milan)\",\n-                                        \"value\": \"eu-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-south-2\",\n-                                        \"displayName\": \"EU (Spain)\",\n-                                        \"value\": \"eu-south-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-east-1\",\n-                                        \"displayName\": \"Asia Pacific (Hong Kong)\",\n-                                        \"value\": \"ap-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-south-1\",\n-                                        \"displayName\": \"Asia Pacific (Mumbai)\",\n-                                        \"value\": \"ap-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-south-2\",\n-                                        \"displayName\": \"Asia Pacific (Hyderabad)\",\n-                                        \"value\": \"ap-south-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-1\",\n-                                        \"displayName\": \"Asia Pacific (Singapore)\",\n-                                        \"value\": \"ap-southeast-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-2\",\n-                                        \"displayName\": \"Asia Pacific (Sydney)\",\n-                                        \"value\": \"ap-southeast-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-3\",\n-                                        \"displayName\": \"Asia Pacific (Jakarta)\",\n-                                        \"value\": \"ap-southeast-3\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-4\",\n-                                        \"displayName\": \"Asia Pacific (Melbourne)\",\n-                                        \"value\": \"ap-southeast-4\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-northeast-1\",\n-                                        \"displayName\": \"Asia Pacific (Tokyo)\",\n-                                        \"value\": \"ap-northeast-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-northeast-2\",\n-                                        \"displayName\": \"Asia Pacific (Seoul)\",\n-                                        \"value\": \"ap-northeast-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-northeast-3\",\n-                                        \"displayName\": \"Asia Pacific (Osaka)\",\n-                                        \"value\": \"ap-northeast-3\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : sa-east-1\",\n-                                        \"displayName\": \"South America (Sao Paulo)\",\n-                                        \"value\": \"sa-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : cn-north-1\",\n-                                        \"displayName\": \"China (Beijing)\",\n-                                        \"value\": \"cn-north-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : cn-northwest-1\",\n-                                        \"displayName\": \"China (Ningxia)\",\n-                                        \"value\": \"cn-northwest-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ca-central-1\",\n-                                        \"displayName\": \"Canada (Central)\",\n-                                        \"value\": \"ca-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ca-west-1\",\n-                                        \"displayName\": \"Canada West (Calgary)\",\n-                                        \"value\": \"ca-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : me-central-1\",\n-                                        \"displayName\": \"Middle East (UAE)\",\n-                                        \"value\": \"me-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : me-south-1\",\n-                                        \"displayName\": \"Middle East (Bahrain)\",\n-                                        \"value\": \"me-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : af-south-1\",\n-                                        \"displayName\": \"Africa (Cape Town)\",\n-                                        \"value\": \"af-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-iso-east-1\",\n-                                        \"displayName\": \"US ISO East\",\n-                                        \"value\": \"us-iso-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-isob-east-1\",\n-                                        \"displayName\": \"US ISOB East (Ohio)\",\n-                                        \"value\": \"us-isob-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-iso-west-1\",\n-                                        \"displayName\": \"US ISO West\",\n-                                        \"value\": \"us-iso-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : il-central-1\",\n-                                        \"displayName\": \"Israel (Tel Aviv)\",\n-                                        \"value\": \"il-central-1\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"us-west-2\",\n-                                \"description\": \"The Region of the AWS Key Management Service. Only used in case of Client-side KMS.\",\n-                                \"displayName\": \"KMS Region\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"kms-region\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            }\n-                        },\n-                        \"providedApiImplementations\": [\n-                            {\n-                                \"artifact\": \"nifi-aws-service-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.processors.aws.s3.AmazonS3EncryptionService\",\n-                                \"version\": \"2.0.0-M3\"\n-                            }\n-                        ],\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"aws\",\n-                            \"decrypt\",\n-                            \"decryption\",\n-                            \"encrypt\",\n-                            \"encryption\",\n-                            \"key\",\n-                            \"s3\",\n-                            \"service\"\n-                        ],\n-                        \"type\": \"org.apache.nifi.processors.aws.s3.encryption.StandardS3EncryptionService\",\n-                        \"typeDescription\": \"Adds configurable encryption to S3 Put and S3 Fetch operations.\",\n-                        \"version\": \"2.0.0-M3\"\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-aws-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"f2215c6\"\n-                        },\n-                        \"group\": \"org.apache.nifi\",\n-                        \"propertyDescriptors\": {\n-                            \"AWS Credentials Provider service\": {\n-                                \"description\": \"The Controller Service that is used to obtain AWS credentials provider\",\n-                                \"displayName\": \"AWS Credentials Provider Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"AWS Credentials Provider service\",\n-                                \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-aws-service-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.processors.aws.credentials.provider.service.AWSCredentialsProviderService\",\n-                                    \"version\": \"2.0.0-M3\"\n-                                }\n-                            },\n-                            \"Bucket\": {\n-                                \"defaultValue\": \"${s3.bucket}\",\n-                                \"description\": \"The S3 Bucket to interact with\",\n-                                \"displayName\": \"Bucket\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Bucket\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Object Key\": {\n-                                \"defaultValue\": \"${filename}\",\n-                                \"description\": \"The S3 Object Key to use. This is analogous to a filename for traditional file systems.\",\n-                                \"displayName\": \"Object Key\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Object Key\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Region\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-gov-west-1\",\n-                                        \"displayName\": \"AWS GovCloud (US)\",\n-                                        \"value\": \"us-gov-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-gov-east-1\",\n-                                        \"displayName\": \"AWS GovCloud (US-East)\",\n-                                        \"value\": \"us-gov-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-east-1\",\n-                                        \"displayName\": \"US East (N. Virginia)\",\n-                                        \"value\": \"us-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-east-2\",\n-                                        \"displayName\": \"US East (Ohio)\",\n-                                        \"value\": \"us-east-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-west-1\",\n-                                        \"displayName\": \"US West (N. California)\",\n-                                        \"value\": \"us-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-west-2\",\n-                                        \"displayName\": \"US West (Oregon)\",\n-                                        \"value\": \"us-west-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-west-1\",\n-                                        \"displayName\": \"EU (Ireland)\",\n-                                        \"value\": \"eu-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-west-2\",\n-                                        \"displayName\": \"EU (London)\",\n-                                        \"value\": \"eu-west-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-west-3\",\n-                                        \"displayName\": \"EU (Paris)\",\n-                                        \"value\": \"eu-west-3\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-central-1\",\n-                                        \"displayName\": \"EU (Frankfurt)\",\n-                                        \"value\": \"eu-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-central-2\",\n-                                        \"displayName\": \"EU (Zurich)\",\n-                                        \"value\": \"eu-central-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-north-1\",\n-                                        \"displayName\": \"EU (Stockholm)\",\n-                                        \"value\": \"eu-north-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-south-1\",\n-                                        \"displayName\": \"EU (Milan)\",\n-                                        \"value\": \"eu-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-south-2\",\n-                                        \"displayName\": \"EU (Spain)\",\n-                                        \"value\": \"eu-south-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-east-1\",\n-                                        \"displayName\": \"Asia Pacific (Hong Kong)\",\n-                                        \"value\": \"ap-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-south-1\",\n-                                        \"displayName\": \"Asia Pacific (Mumbai)\",\n-                                        \"value\": \"ap-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-south-2\",\n-                                        \"displayName\": \"Asia Pacific (Hyderabad)\",\n-                                        \"value\": \"ap-south-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-1\",\n-                                        \"displayName\": \"Asia Pacific (Singapore)\",\n-                                        \"value\": \"ap-southeast-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-2\",\n-                                        \"displayName\": \"Asia Pacific (Sydney)\",\n-                                        \"value\": \"ap-southeast-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-3\",\n-                                        \"displayName\": \"Asia Pacific (Jakarta)\",\n-                                        \"value\": \"ap-southeast-3\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-4\",\n-                                        \"displayName\": \"Asia Pacific (Melbourne)\",\n-                                        \"value\": \"ap-southeast-4\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-northeast-1\",\n-                                        \"displayName\": \"Asia Pacific (Tokyo)\",\n-                                        \"value\": \"ap-northeast-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-northeast-2\",\n-                                        \"displayName\": \"Asia Pacific (Seoul)\",\n-                                        \"value\": \"ap-northeast-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-northeast-3\",\n-                                        \"displayName\": \"Asia Pacific (Osaka)\",\n-                                        \"value\": \"ap-northeast-3\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : sa-east-1\",\n-                                        \"displayName\": \"South America (Sao Paulo)\",\n-                                        \"value\": \"sa-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : cn-north-1\",\n-                                        \"displayName\": \"China (Beijing)\",\n-                                        \"value\": \"cn-north-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : cn-northwest-1\",\n-                                        \"displayName\": \"China (Ningxia)\",\n-                                        \"value\": \"cn-northwest-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ca-central-1\",\n-                                        \"displayName\": \"Canada (Central)\",\n-                                        \"value\": \"ca-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ca-west-1\",\n-                                        \"displayName\": \"Canada West (Calgary)\",\n-                                        \"value\": \"ca-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : me-central-1\",\n-                                        \"displayName\": \"Middle East (UAE)\",\n-                                        \"value\": \"me-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : me-south-1\",\n-                                        \"displayName\": \"Middle East (Bahrain)\",\n-                                        \"value\": \"me-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : af-south-1\",\n-                                        \"displayName\": \"Africa (Cape Town)\",\n-                                        \"value\": \"af-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-iso-east-1\",\n-                                        \"displayName\": \"US ISO East\",\n-                                        \"value\": \"us-iso-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-isob-east-1\",\n-                                        \"displayName\": \"US ISOB East (Ohio)\",\n-                                        \"value\": \"us-isob-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-iso-west-1\",\n-                                        \"displayName\": \"US ISO West\",\n-                                        \"value\": \"us-iso-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : il-central-1\",\n-                                        \"displayName\": \"Israel (Tel Aviv)\",\n-                                        \"value\": \"il-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Uses 's3.region' FlowFile attribute as region.\",\n-                                        \"displayName\": \"Use 's3.region' Attribute\",\n-                                        \"value\": \"attribute-defined-region\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"us-west-2\",\n-                                \"description\": \"The AWS Region to connect to.\",\n-                                \"displayName\": \"Region\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Region\",\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.fileresource.service.api.FileResourceService\",\n-                                \"version\": \"2.0.0-M3\"\n-                            }\n-                        ],\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.aws.s3.FetchS3Object\"\n-                        ],\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"AWS\",\n-                            \"Amazon\",\n-                            \"S3\",\n-                            \"file\",\n-                            \"resource\"\n-                        ],\n-                        \"type\": \"org.apache.nifi.processors.aws.s3.service.S3FileResourceService\",\n-                        \"typeDescription\": \"Provides an Amazon Web Services (AWS) S3 file resource for other components.\",\n-                        \"version\": \"2.0.0-M3\"\n-                    }\n-                ],\n-                \"processors\": [\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-aws-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"f2215c6\"\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 dimension name/value pairs to be added to the metric. AWS supports a maximum of 10 dimensions.\",\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"name\": \"Dimension Name\",\n-                                \"value\": \"Dimension Value\"\n-                            }\n-                        ],\n-                        \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n-                        \"multiProcessorUseCases\": [],\n-                        \"primaryNodeOnly\": false,\n-                        \"propertyDescriptors\": {\n-                            \"AWS Credentials Provider service\": {\n-                                \"description\": \"The Controller Service that is used to obtain AWS credentials provider\",\n-                                \"displayName\": \"AWS Credentials Provider Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"AWS Credentials Provider service\",\n-                                \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-aws-service-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.processors.aws.credentials.provider.service.AWSCredentialsProviderService\",\n-                                    \"version\": \"2.0.0-M3\"\n-                                }\n-                            },\n-                            \"Communications Timeout\": {\n-                                \"defaultValue\": \"30 secs\",\n-                                \"description\": \"\",\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-                            \"Endpoint Override URL\": {\n-                                \"description\": \"Endpoint URL to use instead of the AWS default including scheme, host, port, and path. The AWS libraries select an endpoint URL based on the AWS region, but this property overrides the selected endpoint URL, allowing use with other S3-compatible endpoints.\",\n-                                \"displayName\": \"Endpoint Override URL\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Endpoint Override URL\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"MetricName\": {\n-                                \"description\": \"The name of the metric\",\n-                                \"displayName\": \"Metric Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"MetricName\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Namespace\": {\n-                                \"description\": \"The namespace for the metric data for CloudWatch\",\n-                                \"displayName\": \"Namespace\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Namespace\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Region\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-gov-east-1\",\n-                                        \"displayName\": \"AWS GovCloud (US-East)\",\n-                                        \"value\": \"us-gov-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-gov-west-1\",\n-                                        \"displayName\": \"AWS GovCloud (US-West)\",\n-                                        \"value\": \"us-gov-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : af-south-1\",\n-                                        \"displayName\": \"Africa (Cape Town)\",\n-                                        \"value\": \"af-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-east-1\",\n-                                        \"displayName\": \"Asia Pacific (Hong Kong)\",\n-                                        \"value\": \"ap-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-south-2\",\n-                                        \"displayName\": \"Asia Pacific (Hyderabad)\",\n-                                        \"value\": \"ap-south-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-3\",\n-                                        \"displayName\": \"Asia Pacific (Jakarta)\",\n-                                        \"value\": \"ap-southeast-3\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-4\",\n-                                        \"displayName\": \"Asia Pacific (Melbourne)\",\n-                                        \"value\": \"ap-southeast-4\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-south-1\",\n-                                        \"displayName\": \"Asia Pacific (Mumbai)\",\n-                                        \"value\": \"ap-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-northeast-3\",\n-                                        \"displayName\": \"Asia Pacific (Osaka)\",\n-                                        \"value\": \"ap-northeast-3\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-northeast-2\",\n-                                        \"displayName\": \"Asia Pacific (Seoul)\",\n-                                        \"value\": \"ap-northeast-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-1\",\n-                                        \"displayName\": \"Asia Pacific (Singapore)\",\n-                                        \"value\": \"ap-southeast-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-2\",\n-                                        \"displayName\": \"Asia Pacific (Sydney)\",\n-                                        \"value\": \"ap-southeast-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-northeast-1\",\n-                                        \"displayName\": \"Asia Pacific (Tokyo)\",\n-                                        \"value\": \"ap-northeast-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ca-central-1\",\n-                                        \"displayName\": \"Canada (Central)\",\n-                                        \"value\": \"ca-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ca-west-1\",\n-                                        \"displayName\": \"Canada West (Calgary)\",\n-                                        \"value\": \"ca-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : cn-north-1\",\n-                                        \"displayName\": \"China (Beijing)\",\n-                                        \"value\": \"cn-north-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : cn-northwest-1\",\n-                                        \"displayName\": \"China (Ningxia)\",\n-                                        \"value\": \"cn-northwest-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-central-1\",\n-                                        \"displayName\": \"Europe (Frankfurt)\",\n-                                        \"value\": \"eu-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-west-1\",\n-                                        \"displayName\": \"Europe (Ireland)\",\n-                                        \"value\": \"eu-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-west-2\",\n-                                        \"displayName\": \"Europe (London)\",\n-                                        \"value\": \"eu-west-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-south-1\",\n-                                        \"displayName\": \"Europe (Milan)\",\n-                                        \"value\": \"eu-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-west-3\",\n-                                        \"displayName\": \"Europe (Paris)\",\n-                                        \"value\": \"eu-west-3\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-south-2\",\n-                                        \"displayName\": \"Europe (Spain)\",\n-                                        \"value\": \"eu-south-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-north-1\",\n-                                        \"displayName\": \"Europe (Stockholm)\",\n-                                        \"value\": \"eu-north-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-central-2\",\n-                                        \"displayName\": \"Europe (Zurich)\",\n-                                        \"value\": \"eu-central-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : il-central-1\",\n-                                        \"displayName\": \"Israel (Tel Aviv)\",\n-                                        \"value\": \"il-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : me-south-1\",\n-                                        \"displayName\": \"Middle East (Bahrain)\",\n-                                        \"value\": \"me-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : me-central-1\",\n-                                        \"displayName\": \"Middle East (UAE)\",\n-                                        \"value\": \"me-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : sa-east-1\",\n-                                        \"displayName\": \"South America (Sao Paulo)\",\n-                                        \"value\": \"sa-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-east-1\",\n-                                        \"displayName\": \"US East (N. Virginia)\",\n-                                        \"value\": \"us-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-east-2\",\n-                                        \"displayName\": \"US East (Ohio)\",\n-                                        \"value\": \"us-east-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-iso-east-1\",\n-                                        \"displayName\": \"US ISO East\",\n-                                        \"value\": \"us-iso-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-iso-west-1\",\n-                                        \"displayName\": \"US ISO WEST\",\n-                                        \"value\": \"us-iso-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-isob-east-1\",\n-                                        \"displayName\": \"US ISOB East (Ohio)\",\n-                                        \"value\": \"us-isob-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-west-1\",\n-                                        \"displayName\": \"US West (N. California)\",\n-                                        \"value\": \"us-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-west-2\",\n-                                        \"displayName\": \"US West (Oregon)\",\n-                                        \"value\": \"us-west-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : aws-cn-global\",\n-                                        \"displayName\": \"aws-cn-global\",\n-                                        \"value\": \"aws-cn-global\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : aws-global\",\n-                                        \"displayName\": \"aws-global\",\n-                                        \"value\": \"aws-global\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : aws-iso-b-global\",\n-                                        \"displayName\": \"aws-iso-b-global\",\n-                                        \"value\": \"aws-iso-b-global\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : aws-iso-global\",\n-                                        \"displayName\": \"aws-iso-global\",\n-                                        \"value\": \"aws-iso-global\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : aws-us-gov-global\",\n-                                        \"displayName\": \"aws-us-gov-global\",\n-                                        \"value\": \"aws-us-gov-global\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"us-west-2\",\n-                                \"description\": \"\",\n-                                \"displayName\": \"Region\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Region\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\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\": \"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\": \"2.0.0-M3\"\n-                                }\n-                            },\n-                            \"Timestamp\": {\n-                                \"description\": \"A point in time expressed as the number of milliseconds since Jan 1, 1970 00:00:00 UTC. If not specified, the default value is set to the time the metric data was received\",\n-                                \"displayName\": \"Timestamp\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Timestamp\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Unit\": {\n-                                \"description\": \"The unit of the metric. (e.g Seconds, Bytes, Megabytes, Percent, Count,  Kilobytes/Second, Terabits/Second, Count/Second) For details see http://docs.aws.amazon.com/AmazonCloudWatch/latest/APIReference/API_MetricDatum.html\",\n-                                \"displayName\": \"Unit\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Unit\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Value\": {\n-                                \"description\": \"The value for the metric. Must be a double\",\n-                                \"displayName\": \"Value\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Value\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"maximum\": {\n-                                \"description\": \"The maximum value of the sample set. Must be a double\",\n-                                \"displayName\": \"Maximum\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"maximum\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"minimum\": {\n-                                \"description\": \"The minimum value of the sample set. Must be a double\",\n-                                \"displayName\": \"Minimum\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"minimum\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"proxy-configuration-service\": {\n-                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests.\",\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\": \"2.0.0-M3\"\n-                                }\n-                            },\n-                            \"sampleCount\": {\n-                                \"description\": \"The number of samples used for the statistic set. Must be a double\",\n-                                \"displayName\": \"Sample Count\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"sampleCount\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"sum\": {\n-                                \"description\": \"The sum of values for the sample set. Must be a double\",\n-                                \"displayName\": \"Sum\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"sum\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            }\n-                        },\n-                        \"sideEffectFree\": false,\n-                        \"supportedRelationships\": [\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-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": true,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"amazon\",\n-                            \"aws\",\n-                            \"cloudwatch\",\n-                            \"metrics\",\n-                            \"publish\",\n-                            \"put\"\n-                        ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.aws.cloudwatch.PutCloudWatchMetric\",\n-                        \"typeDescription\": \"Publishes metrics to Amazon CloudWatch. Metric can be either a single value, or a StatisticSet comprised of minimum, maximum, sum and sample count.\",\n-                        \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\"\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-aws-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"f2215c6\"\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-                        \"multiProcessorUseCases\": [],\n-                        \"primaryNodeOnly\": false,\n-                        \"propertyDescriptors\": {\n-                            \"AWS Credentials Provider service\": {\n-                                \"description\": \"The Controller Service that is used to obtain AWS credentials provider\",\n-                                \"displayName\": \"AWS Credentials Provider Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"AWS Credentials Provider service\",\n-                                \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-aws-service-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.processors.aws.credentials.provider.service.AWSCredentialsProviderService\",\n-                                    \"version\": \"2.0.0-M3\"\n-                                }\n-                            },\n-                            \"Batch items for each request (between 1 and 50)\": {\n-                                \"defaultValue\": \"1\",\n-                                \"description\": \"The items to be retrieved in one batch\",\n-                                \"displayName\": \"Batch items for each request (between 1 and 50)\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Batch items for each request (between 1 and 50)\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Communications Timeout\": {\n-                                \"defaultValue\": \"30 secs\",\n-                                \"description\": \"\",\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-                            \"Endpoint Override URL\": {\n-                                \"description\": \"Endpoint URL to use instead of the AWS default including scheme, host, port, and path. The AWS libraries select an endpoint URL based on the AWS region, but this property overrides the selected endpoint URL, allowing use with other S3-compatible endpoints.\",\n-                                \"displayName\": \"Endpoint Override URL\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Endpoint Override URL\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Hash Key Name\": {\n-                                \"description\": \"The hash key name of the item\",\n-                                \"displayName\": \"Hash Key Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Hash Key Name\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Hash Key Value\": {\n-                                \"defaultValue\": \"${dynamodb.item.hash.key.value}\",\n-                                \"description\": \"The hash key value of the item\",\n-                                \"displayName\": \"Hash Key Value\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Hash Key Value\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Hash Key Value Type\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"string\",\n-                                        \"value\": \"string\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"number\",\n-                                        \"value\": \"number\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"string\",\n-                                \"description\": \"The hash key value type of the item\",\n-                                \"displayName\": \"Hash Key Value Type\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Hash Key Value Type\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Range Key Name\": {\n-                                \"description\": \"The range key name of the item\",\n-                                \"displayName\": \"Range Key Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Range Key Name\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Range Key Value\": {\n-                                \"defaultValue\": \"${dynamodb.item.range.key.value}\",\n-                                \"description\": \"\",\n-                                \"displayName\": \"Range Key Value\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Range Key Value\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Range Key Value Type\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"string\",\n-                                        \"value\": \"string\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"number\",\n-                                        \"value\": \"number\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"string\",\n-                                \"description\": \"The range key value type of the item\",\n-                                \"displayName\": \"Range Key Value Type\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Range Key Value Type\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Region\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-gov-east-1\",\n-                                        \"displayName\": \"AWS GovCloud (US-East)\",\n-                                        \"value\": \"us-gov-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-gov-west-1\",\n-                                        \"displayName\": \"AWS GovCloud (US-West)\",\n-                                        \"value\": \"us-gov-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : af-south-1\",\n-                                        \"displayName\": \"Africa (Cape Town)\",\n-                                        \"value\": \"af-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-east-1\",\n-                                        \"displayName\": \"Asia Pacific (Hong Kong)\",\n-                                        \"value\": \"ap-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-south-2\",\n-                                        \"displayName\": \"Asia Pacific (Hyderabad)\",\n-                                        \"value\": \"ap-south-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-3\",\n-                                        \"displayName\": \"Asia Pacific (Jakarta)\",\n-                                        \"value\": \"ap-southeast-3\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-4\",\n-                                        \"displayName\": \"Asia Pacific (Melbourne)\",\n-                                        \"value\": \"ap-southeast-4\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-south-1\",\n-                                        \"displayName\": \"Asia Pacific (Mumbai)\",\n-                                        \"value\": \"ap-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-northeast-3\",\n-                                        \"displayName\": \"Asia Pacific (Osaka)\",\n-                                        \"value\": \"ap-northeast-3\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-northeast-2\",\n-                                        \"displayName\": \"Asia Pacific (Seoul)\",\n-                                        \"value\": \"ap-northeast-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-1\",\n-                                        \"displayName\": \"Asia Pacific (Singapore)\",\n-                                        \"value\": \"ap-southeast-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-2\",\n-                                        \"displayName\": \"Asia Pacific (Sydney)\",\n-                                        \"value\": \"ap-southeast-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-northeast-1\",\n-                                        \"displayName\": \"Asia Pacific (Tokyo)\",\n-                                        \"value\": \"ap-northeast-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ca-central-1\",\n-                                        \"displayName\": \"Canada (Central)\",\n-                                        \"value\": \"ca-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ca-west-1\",\n-                                        \"displayName\": \"Canada West (Calgary)\",\n-                                        \"value\": \"ca-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : cn-north-1\",\n-                                        \"displayName\": \"China (Beijing)\",\n-                                        \"value\": \"cn-north-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : cn-northwest-1\",\n-                                        \"displayName\": \"China (Ningxia)\",\n-                                        \"value\": \"cn-northwest-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-central-1\",\n-                                        \"displayName\": \"Europe (Frankfurt)\",\n-                                        \"value\": \"eu-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-west-1\",\n-                                        \"displayName\": \"Europe (Ireland)\",\n-                                        \"value\": \"eu-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-west-2\",\n-                                        \"displayName\": \"Europe (London)\",\n-                                        \"value\": \"eu-west-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-south-1\",\n-                                        \"displayName\": \"Europe (Milan)\",\n-                                        \"value\": \"eu-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-west-3\",\n-                                        \"displayName\": \"Europe (Paris)\",\n-                                        \"value\": \"eu-west-3\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-south-2\",\n-                                        \"displayName\": \"Europe (Spain)\",\n-                                        \"value\": \"eu-south-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-north-1\",\n-                                        \"displayName\": \"Europe (Stockholm)\",\n-                                        \"value\": \"eu-north-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-central-2\",\n-                                        \"displayName\": \"Europe (Zurich)\",\n-                                        \"value\": \"eu-central-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : il-central-1\",\n-                                        \"displayName\": \"Israel (Tel Aviv)\",\n-                                        \"value\": \"il-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : me-south-1\",\n-                                        \"displayName\": \"Middle East (Bahrain)\",\n-                                        \"value\": \"me-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : me-central-1\",\n-                                        \"displayName\": \"Middle East (UAE)\",\n-                                        \"value\": \"me-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : sa-east-1\",\n-                                        \"displayName\": \"South America (Sao Paulo)\",\n-                                        \"value\": \"sa-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-east-1\",\n-                                        \"displayName\": \"US East (N. Virginia)\",\n-                                        \"value\": \"us-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-east-2\",\n-                                        \"displayName\": \"US East (Ohio)\",\n-                                        \"value\": \"us-east-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-iso-east-1\",\n-                                        \"displayName\": \"US ISO East\",\n-                                        \"value\": \"us-iso-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-iso-west-1\",\n-                                        \"displayName\": \"US ISO WEST\",\n-                                        \"value\": \"us-iso-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-isob-east-1\",\n-                                        \"displayName\": \"US ISOB East (Ohio)\",\n-                                        \"value\": \"us-isob-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-west-1\",\n-                                        \"displayName\": \"US West (N. California)\",\n-                                        \"value\": \"us-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-west-2\",\n-                                        \"displayName\": \"US West (Oregon)\",\n-                                        \"value\": \"us-west-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : aws-cn-global\",\n-                                        \"displayName\": \"aws-cn-global\",\n-                                        \"value\": \"aws-cn-global\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : aws-global\",\n-                                        \"displayName\": \"aws-global\",\n-                                        \"value\": \"aws-global\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : aws-iso-b-global\",\n-                                        \"displayName\": \"aws-iso-b-global\",\n-                                        \"value\": \"aws-iso-b-global\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : aws-iso-global\",\n-                                        \"displayName\": \"aws-iso-global\",\n-                                        \"value\": \"aws-iso-global\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : aws-us-gov-global\",\n-                                        \"displayName\": \"aws-us-gov-global\",\n-                                        \"value\": \"aws-us-gov-global\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"us-west-2\",\n-                                \"description\": \"\",\n-                                \"displayName\": \"Region\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Region\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\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\": \"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\": \"2.0.0-M3\"\n-                                }\n-                            },\n-                            \"Table Name\": {\n-                                \"description\": \"The DynamoDB table name\",\n-                                \"displayName\": \"Table Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Table Name\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"proxy-configuration-service\": {\n-                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests.\",\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\": \"2.0.0-M3\"\n-                                }\n-                            }\n-                        },\n-                        \"readsAttributes\": [\n                             {\n-                                \"description\": \"Items hash key value\",\n-                                \"name\": \"  dynamodb.item.hash.key.value\"\n-                            },\n-                            {\n-                                \"description\": \"Items range key value\",\n-                                \"name\": \"  dynamodb.item.range.key.value\"\n-                            }\n-                        ],\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.aws.dynamodb.GetDynamoDB\",\n-                            \"org.apache.nifi.processors.aws.dynamodb.PutDynamoDB\",\n-                            \"org.apache.nifi.processors.aws.dynamodb.PutDynamoDBRecord\"\n-                        ],\n-                        \"sideEffectFree\": false,\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"FlowFiles are routed to unprocessed relationship when DynamoDB is not able to process all the items in the request. Typical reasons are insufficient table throughput capacity and exceeding the maximum bytes per request. Unprocessed FlowFiles can be retried with a new request.\",\n-                                \"name\": \"unprocessed\"\n-                            },\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-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"AWS\",\n-                            \"Amazon\",\n-                            \"Delete\",\n-                            \"DynamoDB\",\n-                            \"Remove\"\n-                        ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.aws.dynamodb.DeleteDynamoDB\",\n-                        \"typeDescription\": \"Deletes a document from DynamoDB based on hash and range key. The key can be string or number. The request requires all the primary keys for the operation (hash or hash and range key)\",\n-                        \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"DynamoDB unprocessed keys\",\n-                                \"name\": \"dynamodb.key.error.unprocessed\"\n-                            },\n-                            {\n-                                \"description\": \"DynamoDB range key error\",\n-                                \"name\": \"dynmodb.range.key.value.error\"\n-                            },\n-                            {\n-                                \"description\": \"DynamoDB key not found\",\n-                                \"name\": \"dynamodb.key.error.not.found\"\n-                            },\n-                            {\n-                                \"description\": \"DynamoDB exception message\",\n-                                \"name\": \"dynamodb.error.exception.message\"\n-                            },\n-                            {\n-                                \"description\": \"DynamoDB error code\",\n-                                \"name\": \"dynamodb.error.code\"\n-                            },\n-                            {\n-                                \"description\": \"DynamoDB error message\",\n-                                \"name\": \"dynamodb.error.message\"\n-                            },\n-                            {\n-                                \"description\": \"DynamoDB error service\",\n-                                \"name\": \"dynamodb.error.service\"\n-                            },\n-                            {\n-                                \"description\": \"DynamoDB error is retryable\",\n-                                \"name\": \"dynamodb.error.retryable\"\n-                            },\n-                            {\n-                                \"description\": \"DynamoDB error request id\",\n-                                \"name\": \"dynamodb.error.request.id\"\n-                            },\n-                            {\n-                                \"description\": \"DynamoDB status code\",\n-                                \"name\": \"dynamodb.error.status.code\"\n-                            }\n-                        ]\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-aws-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"f2215c6\"\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-                        \"multiProcessorUseCases\": [],\n-                        \"primaryNodeOnly\": false,\n-                        \"propertyDescriptors\": {\n-                            \"AWS Credentials Provider service\": {\n-                                \"description\": \"The Controller Service that is used to obtain AWS credentials provider\",\n-                                \"displayName\": \"AWS Credentials Provider Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"AWS Credentials Provider service\",\n-                                \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-aws-service-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.processors.aws.credentials.provider.service.AWSCredentialsProviderService\",\n-                                    \"version\": \"2.0.0-M3\"\n-                                }\n-                            },\n-                            \"Batch items for each request (between 1 and 50)\": {\n-                                \"defaultValue\": \"1\",\n-                                \"description\": \"The items to be retrieved in one batch\",\n-                                \"displayName\": \"Batch items for each request (between 1 and 50)\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Batch items for each request (between 1 and 50)\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Communications Timeout\": {\n-                                \"defaultValue\": \"30 secs\",\n-                                \"description\": \"\",\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-                            \"Endpoint Override URL\": {\n-                                \"description\": \"Endpoint URL to use instead of the AWS default including scheme, host, port, and path. The AWS libraries select an endpoint URL based on the AWS region, but this property overrides the selected endpoint URL, allowing use with other S3-compatible endpoints.\",\n-                                \"displayName\": \"Endpoint Override URL\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Endpoint Override URL\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Hash Key Name\": {\n-                                \"description\": \"The hash key name of the item\",\n-                                \"displayName\": \"Hash Key Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Hash Key Name\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Hash Key Value\": {\n-                                \"defaultValue\": \"${dynamodb.item.hash.key.value}\",\n-                                \"description\": \"The hash key value of the item\",\n-                                \"displayName\": \"Hash Key Value\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Hash Key Value\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Hash Key Value Type\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"string\",\n-                                        \"value\": \"string\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"number\",\n-                                        \"value\": \"number\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"string\",\n-                                \"description\": \"The hash key value type of the item\",\n-                                \"displayName\": \"Hash Key Value Type\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Hash Key Value Type\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Json Document attribute\": {\n-                                \"description\": \"The Json document to be retrieved from the dynamodb item ('s' type in the schema)\",\n-                                \"displayName\": \"Json Document attribute\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Json Document attribute\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Range Key Name\": {\n-                                \"description\": \"The range key name of the item\",\n-                                \"displayName\": \"Range Key Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Range Key Name\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Range Key Value\": {\n-                                \"defaultValue\": \"${dynamodb.item.range.key.value}\",\n-                                \"description\": \"\",\n-                                \"displayName\": \"Range Key Value\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Range Key Value\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Range Key Value Type\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"string\",\n-                                        \"value\": \"string\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"number\",\n-                                        \"value\": \"number\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"string\",\n-                                \"description\": \"The range key value type of the item\",\n-                                \"displayName\": \"Range Key Value Type\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Range Key Value Type\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Region\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-gov-east-1\",\n-                                        \"displayName\": \"AWS GovCloud (US-East)\",\n-                                        \"value\": \"us-gov-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-gov-west-1\",\n-                                        \"displayName\": \"AWS GovCloud (US-West)\",\n-                                        \"value\": \"us-gov-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : af-south-1\",\n-                                        \"displayName\": \"Africa (Cape Town)\",\n-                                        \"value\": \"af-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-east-1\",\n-                                        \"displayName\": \"Asia Pacific (Hong Kong)\",\n-                                        \"value\": \"ap-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-south-2\",\n-                                        \"displayName\": \"Asia Pacific (Hyderabad)\",\n-                                        \"value\": \"ap-south-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-3\",\n-                                        \"displayName\": \"Asia Pacific (Jakarta)\",\n-                                        \"value\": \"ap-southeast-3\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-4\",\n-                                        \"displayName\": \"Asia Pacific (Melbourne)\",\n-                                        \"value\": \"ap-southeast-4\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-south-1\",\n-                                        \"displayName\": \"Asia Pacific (Mumbai)\",\n-                                        \"value\": \"ap-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-northeast-3\",\n-                                        \"displayName\": \"Asia Pacific (Osaka)\",\n-                                        \"value\": \"ap-northeast-3\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-northeast-2\",\n-                                        \"displayName\": \"Asia Pacific (Seoul)\",\n-                                        \"value\": \"ap-northeast-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-1\",\n-                                        \"displayName\": \"Asia Pacific (Singapore)\",\n-                                        \"value\": \"ap-southeast-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-2\",\n-                                        \"displayName\": \"Asia Pacific (Sydney)\",\n-                                        \"value\": \"ap-southeast-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-northeast-1\",\n-                                        \"displayName\": \"Asia Pacific (Tokyo)\",\n-                                        \"value\": \"ap-northeast-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ca-central-1\",\n-                                        \"displayName\": \"Canada (Central)\",\n-                                        \"value\": \"ca-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ca-west-1\",\n-                                        \"displayName\": \"Canada West (Calgary)\",\n-                                        \"value\": \"ca-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : cn-north-1\",\n-                                        \"displayName\": \"China (Beijing)\",\n-                                        \"value\": \"cn-north-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : cn-northwest-1\",\n-                                        \"displayName\": \"China (Ningxia)\",\n-                                        \"value\": \"cn-northwest-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-central-1\",\n-                                        \"displayName\": \"Europe (Frankfurt)\",\n-                                        \"value\": \"eu-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-west-1\",\n-                                        \"displayName\": \"Europe (Ireland)\",\n-                                        \"value\": \"eu-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-west-2\",\n-                                        \"displayName\": \"Europe (London)\",\n-                                        \"value\": \"eu-west-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-south-1\",\n-                                        \"displayName\": \"Europe (Milan)\",\n-                                        \"value\": \"eu-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-west-3\",\n-                                        \"displayName\": \"Europe (Paris)\",\n-                                        \"value\": \"eu-west-3\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-south-2\",\n-                                        \"displayName\": \"Europe (Spain)\",\n-                                        \"value\": \"eu-south-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-north-1\",\n-                                        \"displayName\": \"Europe (Stockholm)\",\n-                                        \"value\": \"eu-north-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-central-2\",\n-                                        \"displayName\": \"Europe (Zurich)\",\n-                                        \"value\": \"eu-central-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : il-central-1\",\n-                                        \"displayName\": \"Israel (Tel Aviv)\",\n-                                        \"value\": \"il-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : me-south-1\",\n-                                        \"displayName\": \"Middle East (Bahrain)\",\n-                                        \"value\": \"me-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : me-central-1\",\n-                                        \"displayName\": \"Middle East (UAE)\",\n-                                        \"value\": \"me-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : sa-east-1\",\n-                                        \"displayName\": \"South America (Sao Paulo)\",\n-                                        \"value\": \"sa-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-east-1\",\n-                                        \"displayName\": \"US East (N. Virginia)\",\n-                                        \"value\": \"us-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-east-2\",\n-                                        \"displayName\": \"US East (Ohio)\",\n-                                        \"value\": \"us-east-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-iso-east-1\",\n-                                        \"displayName\": \"US ISO East\",\n-                                        \"value\": \"us-iso-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-iso-west-1\",\n-                                        \"displayName\": \"US ISO WEST\",\n-                                        \"value\": \"us-iso-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-isob-east-1\",\n-                                        \"displayName\": \"US ISOB East (Ohio)\",\n-                                        \"value\": \"us-isob-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-west-1\",\n-                                        \"displayName\": \"US West (N. California)\",\n-                                        \"value\": \"us-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-west-2\",\n-                                        \"displayName\": \"US West (Oregon)\",\n-                                        \"value\": \"us-west-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : aws-cn-global\",\n-                                        \"displayName\": \"aws-cn-global\",\n-                                        \"value\": \"aws-cn-global\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : aws-global\",\n-                                        \"displayName\": \"aws-global\",\n-                                        \"value\": \"aws-global\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : aws-iso-b-global\",\n-                                        \"displayName\": \"aws-iso-b-global\",\n-                                        \"value\": \"aws-iso-b-global\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : aws-iso-global\",\n-                                        \"displayName\": \"aws-iso-global\",\n-                                        \"value\": \"aws-iso-global\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : aws-us-gov-global\",\n-                                        \"displayName\": \"aws-us-gov-global\",\n-                                        \"value\": \"aws-us-gov-global\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"us-west-2\",\n-                                \"description\": \"\",\n-                                \"displayName\": \"Region\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Region\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\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\": \"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\": \"2.0.0-M3\"\n-                                }\n-                            },\n-                            \"Table Name\": {\n-                                \"description\": \"The DynamoDB table name\",\n-                                \"displayName\": \"Table Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Table Name\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"proxy-configuration-service\": {\n-                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests.\",\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\": \"2.0.0-M3\"\n-                                }\n-                            }\n-                        },\n-                        \"readsAttributes\": [\n-                            {\n-                                \"description\": \"Items hash key value\",\n-                                \"name\": \"  dynamodb.item.hash.key.value\"\n-                            },\n-                            {\n-                                \"description\": \"Items range key value\",\n-                                \"name\": \"  dynamodb.item.range.key.value\"\n-                            }\n-                        ],\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.aws.dynamodb.DeleteDynamoDB\",\n-                            \"org.apache.nifi.processors.aws.dynamodb.PutDynamoDB\",\n-                            \"org.apache.nifi.processors.aws.dynamodb.PutDynamoDBRecord\"\n-                        ],\n-                        \"sideEffectFree\": false,\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"FlowFiles are routed to unprocessed relationship when DynamoDB is not able to process all the items in the request. Typical reasons are insufficient table throughput capacity and exceeding the maximum bytes per request. Unprocessed FlowFiles can be retried with a new request.\",\n-                                \"name\": \"unprocessed\"\n-                            },\n-                            {\n-                                \"description\": \"FlowFiles are routed to success relationship\",\n-                                \"name\": \"success\"\n-                            },\n-                            {\n-                                \"description\": \"FlowFiles are routed to failure relationship\",\n+                                \"description\": \"All FlowFiles that cannot received from the SNMP agent are routed to this relationship.\",\n                                 \"name\": \"failure\"\n-                            },\n-                            {\n-                                \"description\": \"FlowFiles are routed to not found relationship if key not found in the table\",\n-                                \"name\": \"not found\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": true,\n+                        \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"AWS\",\n-                            \"Amazon\",\n-                            \"DynamoDB\",\n-                            \"Fetch\",\n-                            \"Get\"\n+                            \"get\",\n+                            \"oid\",\n+                            \"snmp\",\n+                            \"walk\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.aws.dynamodb.GetDynamoDB\",\n-                        \"typeDescription\": \"Retrieves a document from DynamoDB based on hash and range key.  The key can be string or number.For any get request all the primary keys are required (hash or hash and range based on the table keys).A Json Document ('Map') attribute of the DynamoDB item is read into the content of the FlowFile.\",\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                         \"useCases\": [],\n                         \"version\": \"2.0.0-M3\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"DynamoDB unprocessed keys\",\n-                                \"name\": \"dynamodb.key.error.unprocessed\"\n-                            },\n-                            {\n-                                \"description\": \"DynamoDB range key error\",\n-                                \"name\": \"dynmodb.range.key.value.error\"\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\": \"DynamoDB key not found\",\n-                                \"name\": \"dynamodb.key.error.not.found\"\n+                                \"description\": \"Denotes the variable binding in which the error occured.\",\n+                                \"name\": \"snmp$errorIndex\"\n                             },\n                             {\n-                                \"description\": \"DynamoDB exception message\",\n-                                \"name\": \"dynamodb.error.exception.message\"\n+                                \"description\": \"The snmp4j error status of the PDU.\",\n+                                \"name\": \"snmp$errorStatus\"\n                             },\n                             {\n-                                \"description\": \"DynamoDB error code\",\n-                                \"name\": \"dynamodb.error.code\"\n+                                \"description\": \"The description of error status.\",\n+                                \"name\": \"snmp$errorStatusText\"\n                             },\n                             {\n-                                \"description\": \"DynamoDB error message\",\n-                                \"name\": \"dynamodb.error.message\"\n+                                \"description\": \"The number of non repeater variable bindings in a GETBULK PDU (currently not supported).\",\n+                                \"name\": \"snmp$nonRepeaters\"\n                             },\n                             {\n-                                \"description\": \"DynamoDB error service\",\n-                                \"name\": \"dynamodb.error.service\"\n+                                \"description\": \"The request ID associated with the PDU.\",\n+                                \"name\": \"snmp$requestID\"\n                             },\n                             {\n-                                \"description\": \"DynamoDB error is retryable\",\n-                                \"name\": \"dynamodb.error.retryable\"\n+                                \"description\": \"The snmp4j numeric representation of the type of the PDU.\",\n+                                \"name\": \"snmp$type\"\n                             },\n                             {\n-                                \"description\": \"DynamoDB error request id\",\n-                                \"name\": \"dynamodb.error.request.id\"\n+                                \"description\": \"The name of the PDU type.\",\n+                                \"name\": \"snmp$typeString\"\n                             },\n                             {\n-                                \"description\": \"DynamoDB status code\",\n-                                \"name\": \"dynamodb.error.status.code\"\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-aws-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-snmp-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -81493,5424 +88498,283 @@\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                         \"multiProcessorUseCases\": [],\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"AWS Credentials Provider service\": {\n-                                \"description\": \"The Controller Service that is used to obtain AWS credentials provider\",\n-                                \"displayName\": \"AWS Credentials Provider Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"AWS Credentials Provider service\",\n-                                \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-aws-service-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.processors.aws.credentials.provider.service.AWSCredentialsProviderService\",\n-                                    \"version\": \"2.0.0-M3\"\n-                                }\n-                            },\n-                            \"Batch items for each request (between 1 and 50)\": {\n-                                \"defaultValue\": \"1\",\n-                                \"description\": \"The items to be retrieved in one batch\",\n-                                \"displayName\": \"Batch items for each request (between 1 and 50)\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Batch items for each request (between 1 and 50)\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Character set of document\": {\n-                                \"defaultValue\": \"UTF-8\",\n-                                \"description\": \"Character set of data in the document\",\n-                                \"displayName\": \"Character set of document\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Character set of document\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Communications Timeout\": {\n-                                \"defaultValue\": \"30 secs\",\n-                                \"description\": \"\",\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-                            \"Endpoint Override URL\": {\n-                                \"description\": \"Endpoint URL to use instead of the AWS default including scheme, host, port, and path. The AWS libraries select an endpoint URL based on the AWS region, but this property overrides the selected endpoint URL, allowing use with other S3-compatible endpoints.\",\n-                                \"displayName\": \"Endpoint Override URL\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Endpoint Override URL\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Hash Key Name\": {\n-                                \"description\": \"The hash key name of the item\",\n-                                \"displayName\": \"Hash Key Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Hash Key Name\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Hash Key Value\": {\n-                                \"defaultValue\": \"${dynamodb.item.hash.key.value}\",\n-                                \"description\": \"The hash key value of the item\",\n-                                \"displayName\": \"Hash Key Value\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Hash Key Value\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Hash Key Value Type\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"string\",\n-                                        \"value\": \"string\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"number\",\n-                                        \"value\": \"number\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"string\",\n-                                \"description\": \"The hash key value type of the item\",\n-                                \"displayName\": \"Hash Key Value Type\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Hash Key Value Type\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Json Document attribute\": {\n-                                \"description\": \"The Json document to be retrieved from the dynamodb item ('s' type in the schema)\",\n-                                \"displayName\": \"Json Document attribute\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Json Document attribute\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Range Key Name\": {\n-                                \"description\": \"The range key name of the item\",\n-                                \"displayName\": \"Range Key Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Range Key Name\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Range Key Value\": {\n-                                \"defaultValue\": \"${dynamodb.item.range.key.value}\",\n-                                \"description\": \"\",\n-                                \"displayName\": \"Range Key Value\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Range Key Value\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Range Key Value Type\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"string\",\n-                                        \"value\": \"string\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"number\",\n-                                        \"value\": \"number\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"string\",\n-                                \"description\": \"The range key value type of the item\",\n-                                \"displayName\": \"Range Key Value Type\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Range Key Value Type\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Region\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-gov-east-1\",\n-                                        \"displayName\": \"AWS GovCloud (US-East)\",\n-                                        \"value\": \"us-gov-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-gov-west-1\",\n-                                        \"displayName\": \"AWS GovCloud (US-West)\",\n-                                        \"value\": \"us-gov-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : af-south-1\",\n-                                        \"displayName\": \"Africa (Cape Town)\",\n-                                        \"value\": \"af-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-east-1\",\n-                                        \"displayName\": \"Asia Pacific (Hong Kong)\",\n-                                        \"value\": \"ap-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-south-2\",\n-                                        \"displayName\": \"Asia Pacific (Hyderabad)\",\n-                                        \"value\": \"ap-south-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-3\",\n-                                        \"displayName\": \"Asia Pacific (Jakarta)\",\n-                                        \"value\": \"ap-southeast-3\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-4\",\n-                                        \"displayName\": \"Asia Pacific (Melbourne)\",\n-                                        \"value\": \"ap-southeast-4\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-south-1\",\n-                                        \"displayName\": \"Asia Pacific (Mumbai)\",\n-                                        \"value\": \"ap-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-northeast-3\",\n-                                        \"displayName\": \"Asia Pacific (Osaka)\",\n-                                        \"value\": \"ap-northeast-3\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-northeast-2\",\n-                                        \"displayName\": \"Asia Pacific (Seoul)\",\n-                                        \"value\": \"ap-northeast-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-1\",\n-                                        \"displayName\": \"Asia Pacific (Singapore)\",\n-                                        \"value\": \"ap-southeast-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-2\",\n-                                        \"displayName\": \"Asia Pacific (Sydney)\",\n-                                        \"value\": \"ap-southeast-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-northeast-1\",\n-                                        \"displayName\": \"Asia Pacific (Tokyo)\",\n-                                        \"value\": \"ap-northeast-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ca-central-1\",\n-                                        \"displayName\": \"Canada (Central)\",\n-                                        \"value\": \"ca-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ca-west-1\",\n-                                        \"displayName\": \"Canada West (Calgary)\",\n-                                        \"value\": \"ca-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : cn-north-1\",\n-                                        \"displayName\": \"China (Beijing)\",\n-                                        \"value\": \"cn-north-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : cn-northwest-1\",\n-                                        \"displayName\": \"China (Ningxia)\",\n-                                        \"value\": \"cn-northwest-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-central-1\",\n-                                        \"displayName\": \"Europe (Frankfurt)\",\n-                                        \"value\": \"eu-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-west-1\",\n-                                        \"displayName\": \"Europe (Ireland)\",\n-                                        \"value\": \"eu-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-west-2\",\n-                                        \"displayName\": \"Europe (London)\",\n-                                        \"value\": \"eu-west-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-south-1\",\n-                                        \"displayName\": \"Europe (Milan)\",\n-                                        \"value\": \"eu-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-west-3\",\n-                                        \"displayName\": \"Europe (Paris)\",\n-                                        \"value\": \"eu-west-3\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-south-2\",\n-                                        \"displayName\": \"Europe (Spain)\",\n-                                        \"value\": \"eu-south-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-north-1\",\n-                                        \"displayName\": \"Europe (Stockholm)\",\n-                                        \"value\": \"eu-north-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-central-2\",\n-                                        \"displayName\": \"Europe (Zurich)\",\n-                                        \"value\": \"eu-central-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : il-central-1\",\n-                                        \"displayName\": \"Israel (Tel Aviv)\",\n-                                        \"value\": \"il-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : me-south-1\",\n-                                        \"displayName\": \"Middle East (Bahrain)\",\n-                                        \"value\": \"me-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : me-central-1\",\n-                                        \"displayName\": \"Middle East (UAE)\",\n-                                        \"value\": \"me-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : sa-east-1\",\n-                                        \"displayName\": \"South America (Sao Paulo)\",\n-                                        \"value\": \"sa-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-east-1\",\n-                                        \"displayName\": \"US East (N. Virginia)\",\n-                                        \"value\": \"us-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-east-2\",\n-                                        \"displayName\": \"US East (Ohio)\",\n-                                        \"value\": \"us-east-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-iso-east-1\",\n-                                        \"displayName\": \"US ISO East\",\n-                                        \"value\": \"us-iso-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-iso-west-1\",\n-                                        \"displayName\": \"US ISO WEST\",\n-                                        \"value\": \"us-iso-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-isob-east-1\",\n-                                        \"displayName\": \"US ISOB East (Ohio)\",\n-                                        \"value\": \"us-isob-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-west-1\",\n-                                        \"displayName\": \"US West (N. California)\",\n-                                        \"value\": \"us-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-west-2\",\n-                                        \"displayName\": \"US West (Oregon)\",\n-                                        \"value\": \"us-west-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : aws-cn-global\",\n-                                        \"displayName\": \"aws-cn-global\",\n-                                        \"value\": \"aws-cn-global\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : aws-global\",\n-                                        \"displayName\": \"aws-global\",\n-                                        \"value\": \"aws-global\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : aws-iso-b-global\",\n-                                        \"displayName\": \"aws-iso-b-global\",\n-                                        \"value\": \"aws-iso-b-global\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : aws-iso-global\",\n-                                        \"displayName\": \"aws-iso-global\",\n-                                        \"value\": \"aws-iso-global\"\n-                                    },\n+                            \"snmp-community\": {\n+                                \"defaultValue\": \"public\",\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"AWS Region Code : aws-us-gov-global\",\n-                                        \"displayName\": \"aws-us-gov-global\",\n-                                        \"value\": \"aws-us-gov-global\"\n+                                        \"dependentValues\": [\n+                                            \"SNMPv1\",\n+                                            \"SNMPv2c\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"SNMP Version\",\n+                                        \"propertyName\": \"snmp-version\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"us-west-2\",\n-                                \"description\": \"\",\n-                                \"displayName\": \"Region\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Region\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\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\": \"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\": \"2.0.0-M3\"\n-                                }\n-                            },\n-                            \"Table Name\": {\n-                                \"description\": \"The DynamoDB table name\",\n-                                \"displayName\": \"Table Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Table Name\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"proxy-configuration-service\": {\n-                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests.\",\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\": \"2.0.0-M3\"\n-                                }\n-                            }\n-                        },\n-                        \"readsAttributes\": [\n-                            {\n-                                \"description\": \"Items hash key value\",\n-                                \"name\": \"  dynamodb.item.hash.key.value\"\n-                            },\n-                            {\n-                                \"description\": \"Items range key value\",\n-                                \"name\": \"  dynamodb.item.range.key.value\"\n-                            }\n-                        ],\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.aws.dynamodb.DeleteDynamoDB\",\n-                            \"org.apache.nifi.processors.aws.dynamodb.GetDynamoDB\",\n-                            \"org.apache.nifi.processors.aws.dynamodb.PutDynamoDBRecord\"\n-                        ],\n-                        \"sideEffectFree\": false,\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"FlowFiles are routed to unprocessed relationship when DynamoDB is not able to process all the items in the request. Typical reasons are insufficient table throughput capacity and exceeding the maximum bytes per request. Unprocessed FlowFiles can be retried with a new request.\",\n-                                \"name\": \"unprocessed\"\n-                            },\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-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": 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-                            \"AWS\",\n-                            \"Amazon\",\n-                            \"DynamoDB\",\n-                            \"Insert\",\n-                            \"Put\"\n-                        ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.aws.dynamodb.PutDynamoDB\",\n-                        \"typeDescription\": \"Puts a document from DynamoDB based on hash and range key.  The table can have either hash and range or hash key alone. Currently the keys supported are string and number and value can be json document. In case of hash and range keys both key are required for the operation. The FlowFile content must be JSON. FlowFile content is mapped to the specified Json Document attribute in the DynamoDB item.\",\n-                        \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"DynamoDB unprocessed keys\",\n-                                \"name\": \"dynamodb.key.error.unprocessed\"\n-                            },\n-                            {\n-                                \"description\": \"DynamoDB range key error\",\n-                                \"name\": \"dynmodb.range.key.value.error\"\n-                            },\n-                            {\n-                                \"description\": \"DynamoDB key not found\",\n-                                \"name\": \"dynamodb.key.error.not.found\"\n-                            },\n-                            {\n-                                \"description\": \"DynamoDB exception message\",\n-                                \"name\": \"dynamodb.error.exception.message\"\n-                            },\n-                            {\n-                                \"description\": \"DynamoDB error code\",\n-                                \"name\": \"dynamodb.error.code\"\n-                            },\n-                            {\n-                                \"description\": \"DynamoDB error message\",\n-                                \"name\": \"dynamodb.error.message\"\n-                            },\n-                            {\n-                                \"description\": \"DynamoDB error service\",\n-                                \"name\": \"dynamodb.error.service\"\n-                            },\n-                            {\n-                                \"description\": \"DynamoDB error is retryable\",\n-                                \"name\": \"dynamodb.error.retryable\"\n-                            },\n-                            {\n-                                \"description\": \"DynamoDB error request id\",\n-                                \"name\": \"dynamodb.error.request.id\"\n-                            },\n-                            {\n-                                \"description\": \"DynamoDB error status code\",\n-                                \"name\": \"dynamodb.error.status.code\"\n-                            },\n-                            {\n-                                \"description\": \"IO exception message on creating item\",\n-                                \"name\": \"dynamodb.item.io.error\"\n-                            }\n-                        ]\n-                    },\n-                    {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-aws-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"f2215c6\"\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-                        \"multiProcessorUseCases\": [],\n-                        \"primaryNodeOnly\": false,\n-                        \"propertyDescriptors\": {\n-                            \"AWS Credentials Provider service\": {\n-                                \"description\": \"The Controller Service that is used to obtain AWS credentials provider\",\n-                                \"displayName\": \"AWS Credentials Provider Service\",\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\": \"AWS Credentials Provider service\",\n+                                \"name\": \"snmp-community\",\n                                 \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-aws-service-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.processors.aws.credentials.provider.service.AWSCredentialsProviderService\",\n-                                    \"version\": \"2.0.0-M3\"\n-                                }\n+                                \"sensitive\": true\n                             },\n-                            \"Communications Timeout\": {\n-                                \"defaultValue\": \"30 secs\",\n-                                \"description\": \"\",\n-                                \"displayName\": \"Communications Timeout\",\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\": \"Communications Timeout\",\n+                                \"name\": \"snmp-manager-port\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Endpoint Override URL\": {\n-                                \"description\": \"Endpoint URL to use instead of the AWS default including scheme, host, port, and path. The AWS libraries select an endpoint URL based on the AWS region, but this property overrides the selected endpoint URL, allowing use with other S3-compatible endpoints.\",\n-                                \"displayName\": \"Endpoint Override URL\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Endpoint Override URL\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Region\": {\n+                            \"snmp-security-level\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"AWS Region Code : us-gov-east-1\",\n-                                        \"displayName\": \"AWS GovCloud (US-East)\",\n-                                        \"value\": \"us-gov-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-gov-west-1\",\n-                                        \"displayName\": \"AWS GovCloud (US-West)\",\n-                                        \"value\": \"us-gov-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : af-south-1\",\n-                                        \"displayName\": \"Africa (Cape Town)\",\n-                                        \"value\": \"af-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-east-1\",\n-                                        \"displayName\": \"Asia Pacific (Hong Kong)\",\n-                                        \"value\": \"ap-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-south-2\",\n-                                        \"displayName\": \"Asia Pacific (Hyderabad)\",\n-                                        \"value\": \"ap-south-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-3\",\n-                                        \"displayName\": \"Asia Pacific (Jakarta)\",\n-                                        \"value\": \"ap-southeast-3\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-4\",\n-                                        \"displayName\": \"Asia Pacific (Melbourne)\",\n-                                        \"value\": \"ap-southeast-4\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-south-1\",\n-                                        \"displayName\": \"Asia Pacific (Mumbai)\",\n-                                        \"value\": \"ap-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-northeast-3\",\n-                                        \"displayName\": \"Asia Pacific (Osaka)\",\n-                                        \"value\": \"ap-northeast-3\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-northeast-2\",\n-                                        \"displayName\": \"Asia Pacific (Seoul)\",\n-                                        \"value\": \"ap-northeast-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-1\",\n-                                        \"displayName\": \"Asia Pacific (Singapore)\",\n-                                        \"value\": \"ap-southeast-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-2\",\n-                                        \"displayName\": \"Asia Pacific (Sydney)\",\n-                                        \"value\": \"ap-southeast-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-northeast-1\",\n-                                        \"displayName\": \"Asia Pacific (Tokyo)\",\n-                                        \"value\": \"ap-northeast-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ca-central-1\",\n-                                        \"displayName\": \"Canada (Central)\",\n-                                        \"value\": \"ca-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ca-west-1\",\n-                                        \"displayName\": \"Canada West (Calgary)\",\n-                                        \"value\": \"ca-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : cn-north-1\",\n-                                        \"displayName\": \"China (Beijing)\",\n-                                        \"value\": \"cn-north-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : cn-northwest-1\",\n-                                        \"displayName\": \"China (Ningxia)\",\n-                                        \"value\": \"cn-northwest-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-central-1\",\n-                                        \"displayName\": \"Europe (Frankfurt)\",\n-                                        \"value\": \"eu-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-west-1\",\n-                                        \"displayName\": \"Europe (Ireland)\",\n-                                        \"value\": \"eu-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-west-2\",\n-                                        \"displayName\": \"Europe (London)\",\n-                                        \"value\": \"eu-west-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-south-1\",\n-                                        \"displayName\": \"Europe (Milan)\",\n-                                        \"value\": \"eu-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-west-3\",\n-                                        \"displayName\": \"Europe (Paris)\",\n-                                        \"value\": \"eu-west-3\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-south-2\",\n-                                        \"displayName\": \"Europe (Spain)\",\n-                                        \"value\": \"eu-south-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-north-1\",\n-                                        \"displayName\": \"Europe (Stockholm)\",\n-                                        \"value\": \"eu-north-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-central-2\",\n-                                        \"displayName\": \"Europe (Zurich)\",\n-                                        \"value\": \"eu-central-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : il-central-1\",\n-                                        \"displayName\": \"Israel (Tel Aviv)\",\n-                                        \"value\": \"il-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : me-south-1\",\n-                                        \"displayName\": \"Middle East (Bahrain)\",\n-                                        \"value\": \"me-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : me-central-1\",\n-                                        \"displayName\": \"Middle East (UAE)\",\n-                                        \"value\": \"me-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : sa-east-1\",\n-                                        \"displayName\": \"South America (Sao Paulo)\",\n-                                        \"value\": \"sa-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-east-1\",\n-                                        \"displayName\": \"US East (N. Virginia)\",\n-                                        \"value\": \"us-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-east-2\",\n-                                        \"displayName\": \"US East (Ohio)\",\n-                                        \"value\": \"us-east-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-iso-east-1\",\n-                                        \"displayName\": \"US ISO East\",\n-                                        \"value\": \"us-iso-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-iso-west-1\",\n-                                        \"displayName\": \"US ISO WEST\",\n-                                        \"value\": \"us-iso-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-isob-east-1\",\n-                                        \"displayName\": \"US ISOB East (Ohio)\",\n-                                        \"value\": \"us-isob-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-west-1\",\n-                                        \"displayName\": \"US West (N. California)\",\n-                                        \"value\": \"us-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-west-2\",\n-                                        \"displayName\": \"US West (Oregon)\",\n-                                        \"value\": \"us-west-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : aws-cn-global\",\n-                                        \"displayName\": \"aws-cn-global\",\n-                                        \"value\": \"aws-cn-global\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : aws-global\",\n-                                        \"displayName\": \"aws-global\",\n-                                        \"value\": \"aws-global\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : aws-iso-b-global\",\n-                                        \"displayName\": \"aws-iso-b-global\",\n-                                        \"value\": \"aws-iso-b-global\"\n+                                        \"description\": \"Communication without authentication and privacy.\",\n+                                        \"displayName\": \"noAuthNoPriv\",\n+                                        \"value\": \"noAuthNoPriv\"\n                                     },\n                                     {\n-                                        \"description\": \"AWS Region Code : aws-iso-global\",\n-                                        \"displayName\": \"aws-iso-global\",\n-                                        \"value\": \"aws-iso-global\"\n+                                        \"description\": \"Communication with authentication and without privacy.\",\n+                                        \"displayName\": \"authNoPriv\",\n+                                        \"value\": \"authNoPriv\"\n                                     },\n                                     {\n-                                        \"description\": \"AWS Region Code : aws-us-gov-global\",\n-                                        \"displayName\": \"aws-us-gov-global\",\n-                                        \"value\": \"aws-us-gov-global\"\n+                                        \"description\": \"Communication with authentication and privacy.\",\n+                                        \"displayName\": \"authPriv\",\n+                                        \"value\": \"authPriv\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"us-west-2\",\n-                                \"description\": \"\",\n-                                \"displayName\": \"Region\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Region\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\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\": \"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\": \"2.0.0-M3\"\n-                                }\n-                            },\n-                            \"Table Name\": {\n-                                \"description\": \"The DynamoDB table name\",\n-                                \"displayName\": \"Table Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Table Name\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"partition-key-attribute\": {\n+                                \"defaultValue\": \"noAuthNoPriv\",\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"ByAttribute\"\n+                                            \"SNMPv3\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Partition Key Strategy\",\n-                                        \"propertyName\": \"partition-key-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"Specifies the FlowFile attribute that will be used as the value of the partition key when using \\\"Partition by attribute\\\" partition key strategy.\",\n-                                \"displayName\": \"Partition Key Attribute\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"partition-key-attribute\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"partition-key-field\": {\n-                                \"description\": \"Defines the name of the partition key field in the DynamoDB table. Partition key is also known as hash key. Depending on the \\\"Partition Key Strategy\\\" the field value might come from the incoming Record or a generated one.\",\n-                                \"displayName\": \"Partition Key Field\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"partition-key-field\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"partition-key-strategy\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Uses the value of the Record field identified by the \\\"Partition Key Field\\\" property as partition key value.\",\n-                                        \"displayName\": \"Partition By Field\",\n-                                        \"value\": \"ByField\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Uses an incoming FlowFile attribute identified by \\\"Partition Key Attribute\\\" as the value of the partition key. The incoming Records must not contain field with the same name defined by the \\\"Partition Key Field\\\".\",\n-                                        \"displayName\": \"Partition By Attribute\",\n-                                        \"value\": \"ByAttribute\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Uses a generated UUID as value for the partition key. The incoming Records must not contain field with the same name defined by the \\\"Partition Key Field\\\".\",\n-                                        \"displayName\": \"Generated UUID\",\n-                                        \"value\": \"Generated\"\n+                                        \"propertyDisplayName\": \"SNMP Version\",\n+                                        \"propertyName\": \"snmp-version\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"ByField\",\n-                                \"description\": \"Defines the strategy the processor uses to assign partition key value to the inserted Items.\",\n-                                \"displayName\": \"Partition Key Strategy\",\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\": \"partition-key-strategy\",\n+                                \"name\": \"snmp-security-level\",\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\": \"2.0.0-M3\"\n-                                }\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\": \"2.0.0-M3\"\n-                                }\n-                            },\n-                            \"sort-key-field\": {\n+                            \"snmp-usm-security-names\": {\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"ByField\",\n-                                            \"BySequence\"\n+                                            \"SNMPv3\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Sort Key Strategy\",\n-                                        \"propertyName\": \"sort-key-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"Defines the name of the sort key field in the DynamoDB table. Sort key is also known as range key.\",\n-                                \"displayName\": \"Sort Key Field\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"sort-key-field\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"sort-key-strategy\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"The processor will not assign sort key to the inserted Items.\",\n-                                        \"displayName\": \"None\",\n-                                        \"value\": \"None\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Uses the value of the Record field identified by the \\\"Sort Key Field\\\" property as sort key value.\",\n-                                        \"displayName\": \"Sort By Field\",\n-                                        \"value\": \"ByField\"\n-                                    },\n-                                    {\n-                                        \"description\": \"The processor will assign a number for every item based on the original record's position in the incoming FlowFile. This will be used as sort key value.\",\n-                                        \"displayName\": \"Generate Sequence\",\n-                                        \"value\": \"BySequence\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"None\",\n-                                \"description\": \"Defines the strategy the processor uses to assign sort key to the inserted Items.\",\n-                                \"displayName\": \"Sort Key Strategy\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"sort-key-strategy\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            }\n-                        },\n-                        \"readsAttributes\": [\n-                            {\n-                                \"description\": \"Number of chunks successfully inserted into DynamoDB. If not set, it is considered as 0\",\n-                                \"name\": \"dynamodb.chunks.processed\"\n-                            }\n-                        ],\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.aws.dynamodb.DeleteDynamoDB\",\n-                            \"org.apache.nifi.processors.aws.dynamodb.GetDynamoDB\",\n-                            \"org.apache.nifi.processors.aws.dynamodb.PutDynamoDB\"\n-                        ],\n-                        \"sideEffectFree\": false,\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"FlowFiles are routed to unprocessed relationship when DynamoDB is not able to process all the items in the request. Typical reasons are insufficient table throughput capacity and exceeding the maximum bytes per request. Unprocessed FlowFiles can be retried with a new request.\",\n-                                \"name\": \"unprocessed\"\n-                            },\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-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": 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-                                \"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-                        \"tags\": [\n-                            \"AWS\",\n-                            \"Amazon\",\n-                            \"DynamoDB\",\n-                            \"Insert\",\n-                            \"Put\",\n-                            \"Record\"\n-                        ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.aws.dynamodb.PutDynamoDBRecord\",\n-                        \"typeDescription\": \"Inserts items into DynamoDB based on record-oriented data. The record fields are mapped into DynamoDB item fields, including partition and sort keys if set. Depending on the number of records the processor might execute the insert in multiple chunks in order to overcome DynamoDB's limitation on batch writing. This might result partially processed FlowFiles in which case the FlowFile will be transferred to the \\\"unprocessed\\\" relationship with the necessary attribute to retry later without duplicating the already executed inserts.\",\n-                        \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"Number of chunks successfully inserted into DynamoDB. If not set, it is considered as 0\",\n-                                \"name\": \"dynamodb.chunks.processed\"\n-                            },\n-                            {\n-                                \"description\": \"DynamoDB unprocessed keys\",\n-                                \"name\": \"dynamodb.key.error.unprocessed\"\n-                            },\n-                            {\n-                                \"description\": \"DynamoDB range key error\",\n-                                \"name\": \"dynmodb.range.key.value.error\"\n-                            },\n-                            {\n-                                \"description\": \"DynamoDB key not found\",\n-                                \"name\": \"dynamodb.key.error.not.found\"\n-                            },\n-                            {\n-                                \"description\": \"DynamoDB exception message\",\n-                                \"name\": \"dynamodb.error.exception.message\"\n-                            },\n-                            {\n-                                \"description\": \"DynamoDB error code\",\n-                                \"name\": \"dynamodb.error.code\"\n-                            },\n-                            {\n-                                \"description\": \"DynamoDB error message\",\n-                                \"name\": \"dynamodb.error.message\"\n-                            },\n-                            {\n-                                \"description\": \"DynamoDB error service\",\n-                                \"name\": \"dynamodb.error.service\"\n-                            },\n-                            {\n-                                \"description\": \"DynamoDB error is retryable\",\n-                                \"name\": \"dynamodb.error.retryable\"\n-                            },\n-                            {\n-                                \"description\": \"DynamoDB error request id\",\n-                                \"name\": \"dynamodb.error.request.id\"\n-                            },\n-                            {\n-                                \"description\": \"DynamoDB error status code\",\n-                                \"name\": \"dynamodb.error.status.code\"\n-                            },\n-                            {\n-                                \"description\": \"IO exception message on creating item\",\n-                                \"name\": \"dynamodb.item.io.error\"\n-                            }\n-                        ]\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-aws-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"f2215c6\"\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-                        \"multiProcessorUseCases\": [],\n-                        \"primaryNodeOnly\": false,\n-                        \"propertyDescriptors\": {\n-                            \"AWS Credentials Provider service\": {\n-                                \"description\": \"The Controller Service that is used to obtain AWS credentials provider\",\n-                                \"displayName\": \"AWS Credentials Provider Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"AWS Credentials Provider service\",\n-                                \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-aws-service-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.processors.aws.credentials.provider.service.AWSCredentialsProviderService\",\n-                                    \"version\": \"2.0.0-M3\"\n-                                }\n-                            },\n-                            \"Amazon Kinesis Firehose Delivery Stream Name\": {\n-                                \"description\": \"The name of kinesis firehose delivery stream\",\n-                                \"displayName\": \"Amazon Kinesis Firehose Delivery Stream Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Amazon Kinesis Firehose Delivery Stream Name\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Batch Size\": {\n-                                \"defaultValue\": \"250\",\n-                                \"description\": \"Batch size for messages (1-500).\",\n-                                \"displayName\": \"Batch Size\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Batch Size\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Communications Timeout\": {\n-                                \"defaultValue\": \"30 secs\",\n-                                \"description\": \"\",\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-                            \"Endpoint Override URL\": {\n-                                \"description\": \"Endpoint URL to use instead of the AWS default including scheme, host, port, and path. The AWS libraries select an endpoint URL based on the AWS region, but this property overrides the selected endpoint URL, allowing use with other S3-compatible endpoints.\",\n-                                \"displayName\": \"Endpoint Override URL\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Endpoint Override URL\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Max message buffer size\": {\n-                                \"defaultValue\": \"1 MB\",\n-                                \"description\": \"Max message buffer\",\n-                                \"displayName\": \"Max message buffer size\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Max message buffer size\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Region\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-gov-east-1\",\n-                                        \"displayName\": \"AWS GovCloud (US-East)\",\n-                                        \"value\": \"us-gov-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-gov-west-1\",\n-                                        \"displayName\": \"AWS GovCloud (US-West)\",\n-                                        \"value\": \"us-gov-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : af-south-1\",\n-                                        \"displayName\": \"Africa (Cape Town)\",\n-                                        \"value\": \"af-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-east-1\",\n-                                        \"displayName\": \"Asia Pacific (Hong Kong)\",\n-                                        \"value\": \"ap-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-south-2\",\n-                                        \"displayName\": \"Asia Pacific (Hyderabad)\",\n-                                        \"value\": \"ap-south-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-3\",\n-                                        \"displayName\": \"Asia Pacific (Jakarta)\",\n-                                        \"value\": \"ap-southeast-3\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-4\",\n-                                        \"displayName\": \"Asia Pacific (Melbourne)\",\n-                                        \"value\": \"ap-southeast-4\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-south-1\",\n-                                        \"displayName\": \"Asia Pacific (Mumbai)\",\n-                                        \"value\": \"ap-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-northeast-3\",\n-                                        \"displayName\": \"Asia Pacific (Osaka)\",\n-                                        \"value\": \"ap-northeast-3\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-northeast-2\",\n-                                        \"displayName\": \"Asia Pacific (Seoul)\",\n-                                        \"value\": \"ap-northeast-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-1\",\n-                                        \"displayName\": \"Asia Pacific (Singapore)\",\n-                                        \"value\": \"ap-southeast-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-2\",\n-                                        \"displayName\": \"Asia Pacific (Sydney)\",\n-                                        \"value\": \"ap-southeast-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-northeast-1\",\n-                                        \"displayName\": \"Asia Pacific (Tokyo)\",\n-                                        \"value\": \"ap-northeast-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ca-central-1\",\n-                                        \"displayName\": \"Canada (Central)\",\n-                                        \"value\": \"ca-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ca-west-1\",\n-                                        \"displayName\": \"Canada West (Calgary)\",\n-                                        \"value\": \"ca-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : cn-north-1\",\n-                                        \"displayName\": \"China (Beijing)\",\n-                                        \"value\": \"cn-north-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : cn-northwest-1\",\n-                                        \"displayName\": \"China (Ningxia)\",\n-                                        \"value\": \"cn-northwest-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-central-1\",\n-                                        \"displayName\": \"Europe (Frankfurt)\",\n-                                        \"value\": \"eu-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-west-1\",\n-                                        \"displayName\": \"Europe (Ireland)\",\n-                                        \"value\": \"eu-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-west-2\",\n-                                        \"displayName\": \"Europe (London)\",\n-                                        \"value\": \"eu-west-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-south-1\",\n-                                        \"displayName\": \"Europe (Milan)\",\n-                                        \"value\": \"eu-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-west-3\",\n-                                        \"displayName\": \"Europe (Paris)\",\n-                                        \"value\": \"eu-west-3\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-south-2\",\n-                                        \"displayName\": \"Europe (Spain)\",\n-                                        \"value\": \"eu-south-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-north-1\",\n-                                        \"displayName\": \"Europe (Stockholm)\",\n-                                        \"value\": \"eu-north-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-central-2\",\n-                                        \"displayName\": \"Europe (Zurich)\",\n-                                        \"value\": \"eu-central-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : il-central-1\",\n-                                        \"displayName\": \"Israel (Tel Aviv)\",\n-                                        \"value\": \"il-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : me-south-1\",\n-                                        \"displayName\": \"Middle East (Bahrain)\",\n-                                        \"value\": \"me-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : me-central-1\",\n-                                        \"displayName\": \"Middle East (UAE)\",\n-                                        \"value\": \"me-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : sa-east-1\",\n-                                        \"displayName\": \"South America (Sao Paulo)\",\n-                                        \"value\": \"sa-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-east-1\",\n-                                        \"displayName\": \"US East (N. Virginia)\",\n-                                        \"value\": \"us-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-east-2\",\n-                                        \"displayName\": \"US East (Ohio)\",\n-                                        \"value\": \"us-east-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-iso-east-1\",\n-                                        \"displayName\": \"US ISO East\",\n-                                        \"value\": \"us-iso-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-iso-west-1\",\n-                                        \"displayName\": \"US ISO WEST\",\n-                                        \"value\": \"us-iso-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-isob-east-1\",\n-                                        \"displayName\": \"US ISOB East (Ohio)\",\n-                                        \"value\": \"us-isob-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-west-1\",\n-                                        \"displayName\": \"US West (N. California)\",\n-                                        \"value\": \"us-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-west-2\",\n-                                        \"displayName\": \"US West (Oregon)\",\n-                                        \"value\": \"us-west-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : aws-cn-global\",\n-                                        \"displayName\": \"aws-cn-global\",\n-                                        \"value\": \"aws-cn-global\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : aws-global\",\n-                                        \"displayName\": \"aws-global\",\n-                                        \"value\": \"aws-global\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : aws-iso-b-global\",\n-                                        \"displayName\": \"aws-iso-b-global\",\n-                                        \"value\": \"aws-iso-b-global\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : aws-iso-global\",\n-                                        \"displayName\": \"aws-iso-global\",\n-                                        \"value\": \"aws-iso-global\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : aws-us-gov-global\",\n-                                        \"displayName\": \"aws-us-gov-global\",\n-                                        \"value\": \"aws-us-gov-global\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"us-west-2\",\n-                                \"description\": \"\",\n-                                \"displayName\": \"Region\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Region\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"proxy-configuration-service\": {\n-                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests.\",\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\": \"2.0.0-M3\"\n-                                }\n-                            }\n-                        },\n-                        \"sideEffectFree\": false,\n-                        \"supportedRelationships\": [\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-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"amazon\",\n-                            \"aws\",\n-                            \"firehose\",\n-                            \"kinesis\",\n-                            \"put\",\n-                            \"stream\"\n-                        ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.aws.kinesis.firehose.PutKinesisFirehose\",\n-                        \"typeDescription\": \"Sends the contents to a specified Amazon Kinesis Firehose. In order to send data to firehose, the firehose delivery stream name has to be specified.\",\n-                        \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"Error message on posting message to AWS Kinesis Firehose\",\n-                                \"name\": \"aws.kinesis.firehose.error.message\"\n-                            },\n-                            {\n-                                \"description\": \"Error code for the message when posting to AWS Kinesis Firehose\",\n-                                \"name\": \"aws.kinesis.firehose.error.code\"\n-                            },\n-                            {\n-                                \"description\": \"Record id of the message posted to Kinesis Firehose\",\n-                                \"name\": \"aws.kinesis.firehose.record.id\"\n-                            }\n-                        ]\n-                    },\n-                    {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-aws-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"f2215c6\"\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\": \"Override default KCL Configuration ConfigsBuilder properties with required values. Supports setting of values directly on the ConfigsBuilder, such as 'namespace', as well as properties on nested builders. For example, to set configsBuilder.retrievalConfig().maxListShardsRetryAttempts(value), name the property as 'retrievalConfig.maxListShardsRetryAttempts'. Only supports setting of simple property values, e.g. String, int, long and boolean. Does not allow override of KCL Configuration settings handled by non-dynamic processor properties.\",\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"name\": \"Kinesis Client Library (KCL) Configuration property name\",\n-                                \"value\": \"Value to set in the KCL Configuration property\"\n-                            }\n-                        ],\n-                        \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n-                        \"multiProcessorUseCases\": [],\n-                        \"primaryNodeOnly\": false,\n-                        \"propertyDescriptors\": {\n-                            \"AWS Credentials Provider service\": {\n-                                \"description\": \"The Controller Service that is used to obtain AWS credentials provider\",\n-                                \"displayName\": \"AWS Credentials Provider Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"AWS Credentials Provider service\",\n-                                \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-aws-service-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.processors.aws.credentials.provider.service.AWSCredentialsProviderService\",\n-                                    \"version\": \"2.0.0-M3\"\n-                                }\n-                            },\n-                            \"Communications Timeout\": {\n-                                \"defaultValue\": \"30 secs\",\n-                                \"description\": \"\",\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-                            \"Endpoint Override URL\": {\n-                                \"description\": \"Endpoint URL to use instead of the AWS default including scheme, host, port, and path. The AWS libraries select an endpoint URL based on the AWS region, but this property overrides the selected endpoint URL, allowing use with other S3-compatible endpoints.\",\n-                                \"displayName\": \"Endpoint Override URL\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Endpoint Override URL\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Region\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-gov-east-1\",\n-                                        \"displayName\": \"AWS GovCloud (US-East)\",\n-                                        \"value\": \"us-gov-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-gov-west-1\",\n-                                        \"displayName\": \"AWS GovCloud (US-West)\",\n-                                        \"value\": \"us-gov-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : af-south-1\",\n-                                        \"displayName\": \"Africa (Cape Town)\",\n-                                        \"value\": \"af-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-east-1\",\n-                                        \"displayName\": \"Asia Pacific (Hong Kong)\",\n-                                        \"value\": \"ap-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-south-2\",\n-                                        \"displayName\": \"Asia Pacific (Hyderabad)\",\n-                                        \"value\": \"ap-south-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-3\",\n-                                        \"displayName\": \"Asia Pacific (Jakarta)\",\n-                                        \"value\": \"ap-southeast-3\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-4\",\n-                                        \"displayName\": \"Asia Pacific (Melbourne)\",\n-                                        \"value\": \"ap-southeast-4\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-south-1\",\n-                                        \"displayName\": \"Asia Pacific (Mumbai)\",\n-                                        \"value\": \"ap-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-northeast-3\",\n-                                        \"displayName\": \"Asia Pacific (Osaka)\",\n-                                        \"value\": \"ap-northeast-3\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-northeast-2\",\n-                                        \"displayName\": \"Asia Pacific (Seoul)\",\n-                                        \"value\": \"ap-northeast-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-1\",\n-                                        \"displayName\": \"Asia Pacific (Singapore)\",\n-                                        \"value\": \"ap-southeast-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-2\",\n-                                        \"displayName\": \"Asia Pacific (Sydney)\",\n-                                        \"value\": \"ap-southeast-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-northeast-1\",\n-                                        \"displayName\": \"Asia Pacific (Tokyo)\",\n-                                        \"value\": \"ap-northeast-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ca-central-1\",\n-                                        \"displayName\": \"Canada (Central)\",\n-                                        \"value\": \"ca-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ca-west-1\",\n-                                        \"displayName\": \"Canada West (Calgary)\",\n-                                        \"value\": \"ca-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : cn-north-1\",\n-                                        \"displayName\": \"China (Beijing)\",\n-                                        \"value\": \"cn-north-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : cn-northwest-1\",\n-                                        \"displayName\": \"China (Ningxia)\",\n-                                        \"value\": \"cn-northwest-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-central-1\",\n-                                        \"displayName\": \"Europe (Frankfurt)\",\n-                                        \"value\": \"eu-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-west-1\",\n-                                        \"displayName\": \"Europe (Ireland)\",\n-                                        \"value\": \"eu-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-west-2\",\n-                                        \"displayName\": \"Europe (London)\",\n-                                        \"value\": \"eu-west-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-south-1\",\n-                                        \"displayName\": \"Europe (Milan)\",\n-                                        \"value\": \"eu-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-west-3\",\n-                                        \"displayName\": \"Europe (Paris)\",\n-                                        \"value\": \"eu-west-3\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-south-2\",\n-                                        \"displayName\": \"Europe (Spain)\",\n-                                        \"value\": \"eu-south-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-north-1\",\n-                                        \"displayName\": \"Europe (Stockholm)\",\n-                                        \"value\": \"eu-north-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-central-2\",\n-                                        \"displayName\": \"Europe (Zurich)\",\n-                                        \"value\": \"eu-central-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : il-central-1\",\n-                                        \"displayName\": \"Israel (Tel Aviv)\",\n-                                        \"value\": \"il-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : me-south-1\",\n-                                        \"displayName\": \"Middle East (Bahrain)\",\n-                                        \"value\": \"me-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : me-central-1\",\n-                                        \"displayName\": \"Middle East (UAE)\",\n-                                        \"value\": \"me-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : sa-east-1\",\n-                                        \"displayName\": \"South America (Sao Paulo)\",\n-                                        \"value\": \"sa-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-east-1\",\n-                                        \"displayName\": \"US East (N. Virginia)\",\n-                                        \"value\": \"us-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-east-2\",\n-                                        \"displayName\": \"US East (Ohio)\",\n-                                        \"value\": \"us-east-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-iso-east-1\",\n-                                        \"displayName\": \"US ISO East\",\n-                                        \"value\": \"us-iso-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-iso-west-1\",\n-                                        \"displayName\": \"US ISO WEST\",\n-                                        \"value\": \"us-iso-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-isob-east-1\",\n-                                        \"displayName\": \"US ISOB East (Ohio)\",\n-                                        \"value\": \"us-isob-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-west-1\",\n-                                        \"displayName\": \"US West (N. California)\",\n-                                        \"value\": \"us-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-west-2\",\n-                                        \"displayName\": \"US West (Oregon)\",\n-                                        \"value\": \"us-west-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : aws-cn-global\",\n-                                        \"displayName\": \"aws-cn-global\",\n-                                        \"value\": \"aws-cn-global\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : aws-global\",\n-                                        \"displayName\": \"aws-global\",\n-                                        \"value\": \"aws-global\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : aws-iso-b-global\",\n-                                        \"displayName\": \"aws-iso-b-global\",\n-                                        \"value\": \"aws-iso-b-global\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : aws-iso-global\",\n-                                        \"displayName\": \"aws-iso-global\",\n-                                        \"value\": \"aws-iso-global\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : aws-us-gov-global\",\n-                                        \"displayName\": \"aws-us-gov-global\",\n-                                        \"value\": \"aws-us-gov-global\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"us-west-2\",\n-                                \"description\": \"\",\n-                                \"displayName\": \"Region\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Region\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"amazon-kinesis-stream-application-name\": {\n-                                \"description\": \"The Kinesis stream reader application name.\",\n-                                \"displayName\": \"Application Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"amazon-kinesis-stream-application-name\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"amazon-kinesis-stream-checkpoint-interval\": {\n-                                \"defaultValue\": \"3 secs\",\n-                                \"description\": \"Interval between Kinesis checkpoints\",\n-                                \"displayName\": \"Checkpoint Interval\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"amazon-kinesis-stream-checkpoint-interval\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"amazon-kinesis-stream-cloudwatch-flag\": {\n-                                \"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 report Kinesis usage metrics to CloudWatch.\",\n-                                \"displayName\": \"Report Metrics to CloudWatch\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"amazon-kinesis-stream-cloudwatch-flag\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"amazon-kinesis-stream-dynamodb-override\": {\n-                                \"description\": \"DynamoDB override to use non-AWS deployments\",\n-                                \"displayName\": \"DynamoDB Override\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"amazon-kinesis-stream-dynamodb-override\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"amazon-kinesis-stream-failover-timeout\": {\n-                                \"defaultValue\": \"30 secs\",\n-                                \"description\": \"Kinesis Client Library failover timeout\",\n-                                \"displayName\": \"Failover Timeout\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"amazon-kinesis-stream-failover-timeout\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"amazon-kinesis-stream-graceful-shutdown-timeout\": {\n-                                \"defaultValue\": \"20 secs\",\n-                                \"description\": \"Kinesis Client Library graceful shutdown timeout\",\n-                                \"displayName\": \"Graceful Shutdown Timeout\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"amazon-kinesis-stream-graceful-shutdown-timeout\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"amazon-kinesis-stream-initial-position\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Start reading just after the most recent record in the shard, so that you always read the most recent data in the shard.\",\n-                                        \"displayName\": \"LATEST\",\n-                                        \"value\": \"LATEST\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Start reading at the last untrimmed record in the shard in the system, which is the oldest data record in the shard.\",\n-                                        \"displayName\": \"TRIM_HORIZON\",\n-                                        \"value\": \"TRIM_HORIZON\"\n+                                        \"propertyDisplayName\": \"SNMP Version\",\n+                                        \"propertyName\": \"snmp-version\"\n                                     },\n                                     {\n-                                        \"description\": \"Start reading from the position denoted by a specific time stamp, provided in the value Timestamp.\",\n-                                        \"displayName\": \"AT_TIMESTAMP\",\n-                                        \"value\": \"AT_TIMESTAMP\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"LATEST\",\n-                                \"description\": \"Initial position to read Kinesis streams.\",\n-                                \"displayName\": \"Initial Stream Position\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"amazon-kinesis-stream-initial-position\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"amazon-kinesis-stream-position-timestamp\": {\n-                                \"dependencies\": [\n-                                    {\n                                         \"dependentValues\": [\n-                                            \"AT_TIMESTAMP\"\n+                                            \"noAuthNoPriv\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Initial Stream Position\",\n-                                        \"propertyName\": \"amazon-kinesis-stream-initial-position\"\n-                                    }\n-                                ],\n-                                \"description\": \"Timestamp position in stream from which to start reading Kinesis Records. Required if Initial position to read Kinesis streams. is AT_TIMESTAMP. Uses the Timestamp Format to parse value into a Date.\",\n-                                \"displayName\": \"Stream Position Timestamp\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"amazon-kinesis-stream-position-timestamp\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"amazon-kinesis-stream-record-reader\": {\n-                                \"description\": \"The Record Reader to use for reading received messages. The Kinesis Stream name can be referred to by Expression Language '${kinesis.name}' to access a schema. If Record Reader/Writer are not specified, each Kinesis Record will create a FlowFile.\",\n-                                \"displayName\": \"Record Reader\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"amazon-kinesis-stream-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\": \"2.0.0-M3\"\n-                                }\n-                            },\n-                            \"amazon-kinesis-stream-record-writer\": {\n-                                \"description\": \"The Record Writer to use for serializing Records to an output FlowFile. The Kinesis Stream name can be referred to by Expression Language '${kinesis.name}' to access a schema. If Record Reader/Writer are not specified, each Kinesis Record will create a FlowFile.\",\n-                                \"displayName\": \"Record Writer\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"amazon-kinesis-stream-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\": \"2.0.0-M3\"\n-                                }\n-                            },\n-                            \"amazon-kinesis-stream-retry-count\": {\n-                                \"defaultValue\": \"10\",\n-                                \"description\": \"Number of times to retry a Kinesis operation (process record, checkpoint, shutdown)\",\n-                                \"displayName\": \"Retry Count\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"amazon-kinesis-stream-retry-count\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"amazon-kinesis-stream-retry-wait\": {\n-                                \"defaultValue\": \"1 sec\",\n-                                \"description\": \"Interval between Kinesis operation retries (process record, checkpoint, shutdown)\",\n-                                \"displayName\": \"Retry Wait\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"amazon-kinesis-stream-retry-wait\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"amazon-kinesis-stream-timestamp-format\": {\n-                                \"defaultValue\": \"yyyy-MM-dd HH:mm:ss\",\n-                                \"description\": \"Format to use for parsing the Stream Position Timestamp into a Date and converting the Kinesis Record's Approximate Arrival Timestamp into a FlowFile attribute.\",\n-                                \"displayName\": \"Timestamp Format\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"amazon-kinesis-stream-timestamp-format\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"kinesis-stream-name\": {\n-                                \"description\": \"The name of Kinesis Stream\",\n-                                \"displayName\": \"Amazon Kinesis Stream Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"kinesis-stream-name\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"proxy-configuration-service\": {\n-                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests.\",\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\": \"2.0.0-M3\"\n-                                }\n-                            }\n-                        },\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.aws.kinesis.stream.PutKinesisStream\"\n-                        ],\n-                        \"sideEffectFree\": false,\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"FlowFiles are routed to success relationship\",\n-                                \"name\": \"success\"\n-                            }\n-                        ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": true,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"systemResourceConsiderations\": [\n-                            {\n-                                \"description\": \"Kinesis Client Library is used to create a Worker thread for consumption of Kinesis Records. The Worker is initialised and started when this Processor has been triggered. It runs continually, spawning Kinesis Record Processors as required to fetch Kinesis Records. The Worker Thread (and any child Record Processor threads) are not controlled by the normal NiFi scheduler as part of the Concurrent Thread pool and are not released until this processor is stopped.\",\n-                                \"resource\": \"CPU\"\n-                            },\n-                            {\n-                                \"description\": \"Kinesis Client Library will continually poll for new Records, requesting up to a maximum number of Records/bytes per call. This can result in sustained network usage.\",\n-                                \"resource\": \"NETWORK\"\n-                            }\n-                        ],\n-                        \"tags\": [\n-                            \"amazon\",\n-                            \"aws\",\n-                            \"consume\",\n-                            \"kinesis\",\n-                            \"stream\"\n-                        ],\n-                        \"triggerSerially\": true,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.aws.kinesis.stream.ConsumeKinesisStream\",\n-                        \"typeDescription\": \"Reads data from the specified AWS Kinesis stream and outputs a FlowFile for every processed Record (raw)  or a FlowFile for a batch of processed records if a Record Reader and Record Writer are configured. At-least-once delivery of all Kinesis Records within the Stream while the processor is running. AWS Kinesis Client Library can take several seconds to initialise before starting to fetch data. Uses DynamoDB for check pointing and CloudWatch (optional) for metrics. Ensure that the credentials provided have access to DynamoDB and CloudWatch (optional) along with Kinesis.\",\n-                        \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"Partition key of the (last) Kinesis Record read from the Shard\",\n-                                \"name\": \"aws.kinesis.partition.key\"\n-                            },\n-                            {\n-                                \"description\": \"Shard ID from which the Kinesis Record was read\",\n-                                \"name\": \"aws.kinesis.shard.id\"\n-                            },\n-                            {\n-                                \"description\": \"The unique identifier of the (last) Kinesis Record within its Shard\",\n-                                \"name\": \"aws.kinesis.sequence.number\"\n-                            },\n-                            {\n-                                \"description\": \"Approximate arrival timestamp of the (last) Kinesis Record read from the stream\",\n-                                \"name\": \"aws.kinesis.approximate.arrival.timestamp\"\n-                            },\n-                            {\n-                                \"description\": \"Sets the mime.type attribute to the MIME Type specified by the Record Writer (if configured)\",\n-                                \"name\": \"mime.type\"\n-                            },\n-                            {\n-                                \"description\": \"Number of records written to the FlowFiles by the Record Writer (if configured)\",\n-                                \"name\": \"record.count\"\n-                            },\n-                            {\n-                                \"description\": \"This attribute provides on failure the error message encountered by the Record Reader or Record Writer (if configured)\",\n-                                \"name\": \"record.error.message\"\n-                            }\n-                        ]\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-aws-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"f2215c6\"\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-                        \"multiProcessorUseCases\": [],\n-                        \"primaryNodeOnly\": false,\n-                        \"propertyDescriptors\": {\n-                            \"AWS Credentials Provider service\": {\n-                                \"description\": \"The Controller Service that is used to obtain AWS credentials provider\",\n-                                \"displayName\": \"AWS Credentials Provider Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"AWS Credentials Provider service\",\n-                                \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-aws-service-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.processors.aws.credentials.provider.service.AWSCredentialsProviderService\",\n-                                    \"version\": \"2.0.0-M3\"\n-                                }\n-                            },\n-                            \"Communications Timeout\": {\n-                                \"defaultValue\": \"30 secs\",\n-                                \"description\": \"\",\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-                            \"Endpoint Override URL\": {\n-                                \"description\": \"Endpoint URL to use instead of the AWS default including scheme, host, port, and path. The AWS libraries select an endpoint URL based on the AWS region, but this property overrides the selected endpoint URL, allowing use with other S3-compatible endpoints.\",\n-                                \"displayName\": \"Endpoint Override URL\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Endpoint Override URL\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Region\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-gov-east-1\",\n-                                        \"displayName\": \"AWS GovCloud (US-East)\",\n-                                        \"value\": \"us-gov-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-gov-west-1\",\n-                                        \"displayName\": \"AWS GovCloud (US-West)\",\n-                                        \"value\": \"us-gov-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : af-south-1\",\n-                                        \"displayName\": \"Africa (Cape Town)\",\n-                                        \"value\": \"af-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-east-1\",\n-                                        \"displayName\": \"Asia Pacific (Hong Kong)\",\n-                                        \"value\": \"ap-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-south-2\",\n-                                        \"displayName\": \"Asia Pacific (Hyderabad)\",\n-                                        \"value\": \"ap-south-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-3\",\n-                                        \"displayName\": \"Asia Pacific (Jakarta)\",\n-                                        \"value\": \"ap-southeast-3\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-4\",\n-                                        \"displayName\": \"Asia Pacific (Melbourne)\",\n-                                        \"value\": \"ap-southeast-4\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-south-1\",\n-                                        \"displayName\": \"Asia Pacific (Mumbai)\",\n-                                        \"value\": \"ap-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-northeast-3\",\n-                                        \"displayName\": \"Asia Pacific (Osaka)\",\n-                                        \"value\": \"ap-northeast-3\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-northeast-2\",\n-                                        \"displayName\": \"Asia Pacific (Seoul)\",\n-                                        \"value\": \"ap-northeast-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-1\",\n-                                        \"displayName\": \"Asia Pacific (Singapore)\",\n-                                        \"value\": \"ap-southeast-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-2\",\n-                                        \"displayName\": \"Asia Pacific (Sydney)\",\n-                                        \"value\": \"ap-southeast-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-northeast-1\",\n-                                        \"displayName\": \"Asia Pacific (Tokyo)\",\n-                                        \"value\": \"ap-northeast-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ca-central-1\",\n-                                        \"displayName\": \"Canada (Central)\",\n-                                        \"value\": \"ca-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ca-west-1\",\n-                                        \"displayName\": \"Canada West (Calgary)\",\n-                                        \"value\": \"ca-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : cn-north-1\",\n-                                        \"displayName\": \"China (Beijing)\",\n-                                        \"value\": \"cn-north-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : cn-northwest-1\",\n-                                        \"displayName\": \"China (Ningxia)\",\n-                                        \"value\": \"cn-northwest-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-central-1\",\n-                                        \"displayName\": \"Europe (Frankfurt)\",\n-                                        \"value\": \"eu-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-west-1\",\n-                                        \"displayName\": \"Europe (Ireland)\",\n-                                        \"value\": \"eu-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-west-2\",\n-                                        \"displayName\": \"Europe (London)\",\n-                                        \"value\": \"eu-west-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-south-1\",\n-                                        \"displayName\": \"Europe (Milan)\",\n-                                        \"value\": \"eu-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-west-3\",\n-                                        \"displayName\": \"Europe (Paris)\",\n-                                        \"value\": \"eu-west-3\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-south-2\",\n-                                        \"displayName\": \"Europe (Spain)\",\n-                                        \"value\": \"eu-south-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-north-1\",\n-                                        \"displayName\": \"Europe (Stockholm)\",\n-                                        \"value\": \"eu-north-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-central-2\",\n-                                        \"displayName\": \"Europe (Zurich)\",\n-                                        \"value\": \"eu-central-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : il-central-1\",\n-                                        \"displayName\": \"Israel (Tel Aviv)\",\n-                                        \"value\": \"il-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : me-south-1\",\n-                                        \"displayName\": \"Middle East (Bahrain)\",\n-                                        \"value\": \"me-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : me-central-1\",\n-                                        \"displayName\": \"Middle East (UAE)\",\n-                                        \"value\": \"me-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : sa-east-1\",\n-                                        \"displayName\": \"South America (Sao Paulo)\",\n-                                        \"value\": \"sa-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-east-1\",\n-                                        \"displayName\": \"US East (N. Virginia)\",\n-                                        \"value\": \"us-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-east-2\",\n-                                        \"displayName\": \"US East (Ohio)\",\n-                                        \"value\": \"us-east-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-iso-east-1\",\n-                                        \"displayName\": \"US ISO East\",\n-                                        \"value\": \"us-iso-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-iso-west-1\",\n-                                        \"displayName\": \"US ISO WEST\",\n-                                        \"value\": \"us-iso-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-isob-east-1\",\n-                                        \"displayName\": \"US ISOB East (Ohio)\",\n-                                        \"value\": \"us-isob-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-west-1\",\n-                                        \"displayName\": \"US West (N. California)\",\n-                                        \"value\": \"us-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-west-2\",\n-                                        \"displayName\": \"US West (Oregon)\",\n-                                        \"value\": \"us-west-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : aws-cn-global\",\n-                                        \"displayName\": \"aws-cn-global\",\n-                                        \"value\": \"aws-cn-global\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : aws-global\",\n-                                        \"displayName\": \"aws-global\",\n-                                        \"value\": \"aws-global\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : aws-iso-b-global\",\n-                                        \"displayName\": \"aws-iso-b-global\",\n-                                        \"value\": \"aws-iso-b-global\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : aws-iso-global\",\n-                                        \"displayName\": \"aws-iso-global\",\n-                                        \"value\": \"aws-iso-global\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : aws-us-gov-global\",\n-                                        \"displayName\": \"aws-us-gov-global\",\n-                                        \"value\": \"aws-us-gov-global\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"us-west-2\",\n-                                \"description\": \"\",\n-                                \"displayName\": \"Region\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Region\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"amazon-kinesis-stream-partition-key\": {\n-                                \"defaultValue\": \"${kinesis.partition.key}\",\n-                                \"description\": \"The partition key attribute.  If it is not set, a random value is used\",\n-                                \"displayName\": \"Amazon Kinesis Stream Partition Key\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"amazon-kinesis-stream-partition-key\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"kinesis-stream-name\": {\n-                                \"description\": \"The name of Kinesis Stream\",\n-                                \"displayName\": \"Amazon Kinesis Stream Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"kinesis-stream-name\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"max-message-buffer-size\": {\n-                                \"defaultValue\": \"1 MB\",\n-                                \"description\": \"Max message buffer size in Mega-bytes\",\n-                                \"displayName\": \"Max message buffer size (MB)\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"max-message-buffer-size\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"message-batch-size\": {\n-                                \"defaultValue\": \"250\",\n-                                \"description\": \"Batch size for messages (1-500).\",\n-                                \"displayName\": \"Message Batch Size\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"message-batch-size\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"proxy-configuration-service\": {\n-                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests.\",\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\": \"2.0.0-M3\"\n-                                }\n-                            }\n-                        },\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.aws.kinesis.stream.ConsumeKinesisStream\"\n-                        ],\n-                        \"sideEffectFree\": false,\n-                        \"supportedRelationships\": [\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-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"amazon\",\n-                            \"aws\",\n-                            \"kinesis\",\n-                            \"put\",\n-                            \"stream\"\n-                        ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.aws.kinesis.stream.PutKinesisStream\",\n-                        \"typeDescription\": \"Sends the contents to a specified Amazon Kinesis. In order to send data to Kinesis, the stream name has to be specified.\",\n-                        \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"Error message on posting message to AWS Kinesis\",\n-                                \"name\": \"aws.kinesis.error.message\"\n-                            },\n-                            {\n-                                \"description\": \"Error code for the message when posting to AWS Kinesis\",\n-                                \"name\": \"aws.kinesis.error.code\"\n-                            },\n-                            {\n-                                \"description\": \"Sequence number for the message when posting to AWS Kinesis\",\n-                                \"name\": \"aws.kinesis.sequence.number\"\n-                            },\n-                            {\n-                                \"description\": \"Shard id of the message posted to AWS Kinesis\",\n-                                \"name\": \"aws.kinesis.shard.id\"\n-                            }\n-                        ]\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-aws-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"f2215c6\"\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-                        \"multiProcessorUseCases\": [],\n-                        \"primaryNodeOnly\": false,\n-                        \"propertyDescriptors\": {\n-                            \"AWS Credentials Provider service\": {\n-                                \"description\": \"The Controller Service that is used to obtain AWS credentials provider\",\n-                                \"displayName\": \"AWS Credentials Provider Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"AWS Credentials Provider service\",\n-                                \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-aws-service-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.processors.aws.credentials.provider.service.AWSCredentialsProviderService\",\n-                                    \"version\": \"2.0.0-M3\"\n-                                }\n-                            },\n-                            \"Amazon Lambda Name\": {\n-                                \"description\": \"The Lambda Function Name\",\n-                                \"displayName\": \"Amazon Lambda Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Amazon Lambda Name\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Amazon Lambda Qualifier (version)\": {\n-                                \"defaultValue\": \"$LATEST\",\n-                                \"description\": \"The Lambda Function Version\",\n-                                \"displayName\": \"Amazon Lambda Qualifier (version)\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Amazon Lambda Qualifier (version)\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Communications Timeout\": {\n-                                \"defaultValue\": \"30 secs\",\n-                                \"description\": \"\",\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-                            \"Endpoint Override URL\": {\n-                                \"description\": \"Endpoint URL to use instead of the AWS default including scheme, host, port, and path. The AWS libraries select an endpoint URL based on the AWS region, but this property overrides the selected endpoint URL, allowing use with other S3-compatible endpoints.\",\n-                                \"displayName\": \"Endpoint Override URL\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Endpoint Override URL\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Region\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-gov-east-1\",\n-                                        \"displayName\": \"AWS GovCloud (US-East)\",\n-                                        \"value\": \"us-gov-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-gov-west-1\",\n-                                        \"displayName\": \"AWS GovCloud (US-West)\",\n-                                        \"value\": \"us-gov-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : af-south-1\",\n-                                        \"displayName\": \"Africa (Cape Town)\",\n-                                        \"value\": \"af-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-east-1\",\n-                                        \"displayName\": \"Asia Pacific (Hong Kong)\",\n-                                        \"value\": \"ap-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-south-2\",\n-                                        \"displayName\": \"Asia Pacific (Hyderabad)\",\n-                                        \"value\": \"ap-south-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-3\",\n-                                        \"displayName\": \"Asia Pacific (Jakarta)\",\n-                                        \"value\": \"ap-southeast-3\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-4\",\n-                                        \"displayName\": \"Asia Pacific (Melbourne)\",\n-                                        \"value\": \"ap-southeast-4\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-south-1\",\n-                                        \"displayName\": \"Asia Pacific (Mumbai)\",\n-                                        \"value\": \"ap-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-northeast-3\",\n-                                        \"displayName\": \"Asia Pacific (Osaka)\",\n-                                        \"value\": \"ap-northeast-3\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-northeast-2\",\n-                                        \"displayName\": \"Asia Pacific (Seoul)\",\n-                                        \"value\": \"ap-northeast-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-1\",\n-                                        \"displayName\": \"Asia Pacific (Singapore)\",\n-                                        \"value\": \"ap-southeast-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-2\",\n-                                        \"displayName\": \"Asia Pacific (Sydney)\",\n-                                        \"value\": \"ap-southeast-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-northeast-1\",\n-                                        \"displayName\": \"Asia Pacific (Tokyo)\",\n-                                        \"value\": \"ap-northeast-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ca-central-1\",\n-                                        \"displayName\": \"Canada (Central)\",\n-                                        \"value\": \"ca-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ca-west-1\",\n-                                        \"displayName\": \"Canada West (Calgary)\",\n-                                        \"value\": \"ca-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : cn-north-1\",\n-                                        \"displayName\": \"China (Beijing)\",\n-                                        \"value\": \"cn-north-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : cn-northwest-1\",\n-                                        \"displayName\": \"China (Ningxia)\",\n-                                        \"value\": \"cn-northwest-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-central-1\",\n-                                        \"displayName\": \"Europe (Frankfurt)\",\n-                                        \"value\": \"eu-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-west-1\",\n-                                        \"displayName\": \"Europe (Ireland)\",\n-                                        \"value\": \"eu-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-west-2\",\n-                                        \"displayName\": \"Europe (London)\",\n-                                        \"value\": \"eu-west-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-south-1\",\n-                                        \"displayName\": \"Europe (Milan)\",\n-                                        \"value\": \"eu-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-west-3\",\n-                                        \"displayName\": \"Europe (Paris)\",\n-                                        \"value\": \"eu-west-3\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-south-2\",\n-                                        \"displayName\": \"Europe (Spain)\",\n-                                        \"value\": \"eu-south-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-north-1\",\n-                                        \"displayName\": \"Europe (Stockholm)\",\n-                                        \"value\": \"eu-north-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-central-2\",\n-                                        \"displayName\": \"Europe (Zurich)\",\n-                                        \"value\": \"eu-central-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : il-central-1\",\n-                                        \"displayName\": \"Israel (Tel Aviv)\",\n-                                        \"value\": \"il-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : me-south-1\",\n-                                        \"displayName\": \"Middle East (Bahrain)\",\n-                                        \"value\": \"me-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : me-central-1\",\n-                                        \"displayName\": \"Middle East (UAE)\",\n-                                        \"value\": \"me-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : sa-east-1\",\n-                                        \"displayName\": \"South America (Sao Paulo)\",\n-                                        \"value\": \"sa-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-east-1\",\n-                                        \"displayName\": \"US East (N. Virginia)\",\n-                                        \"value\": \"us-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-east-2\",\n-                                        \"displayName\": \"US East (Ohio)\",\n-                                        \"value\": \"us-east-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-iso-east-1\",\n-                                        \"displayName\": \"US ISO East\",\n-                                        \"value\": \"us-iso-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-iso-west-1\",\n-                                        \"displayName\": \"US ISO WEST\",\n-                                        \"value\": \"us-iso-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-isob-east-1\",\n-                                        \"displayName\": \"US ISOB East (Ohio)\",\n-                                        \"value\": \"us-isob-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-west-1\",\n-                                        \"displayName\": \"US West (N. California)\",\n-                                        \"value\": \"us-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-west-2\",\n-                                        \"displayName\": \"US West (Oregon)\",\n-                                        \"value\": \"us-west-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : aws-cn-global\",\n-                                        \"displayName\": \"aws-cn-global\",\n-                                        \"value\": \"aws-cn-global\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : aws-global\",\n-                                        \"displayName\": \"aws-global\",\n-                                        \"value\": \"aws-global\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : aws-iso-b-global\",\n-                                        \"displayName\": \"aws-iso-b-global\",\n-                                        \"value\": \"aws-iso-b-global\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : aws-iso-global\",\n-                                        \"displayName\": \"aws-iso-global\",\n-                                        \"value\": \"aws-iso-global\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : aws-us-gov-global\",\n-                                        \"displayName\": \"aws-us-gov-global\",\n-                                        \"value\": \"aws-us-gov-global\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"us-west-2\",\n-                                \"description\": \"\",\n-                                \"displayName\": \"Region\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Region\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"proxy-configuration-service\": {\n-                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests.\",\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\": \"2.0.0-M3\"\n-                                }\n-                            }\n-                        },\n-                        \"sideEffectFree\": false,\n-                        \"supportedRelationships\": [\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-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"amazon\",\n-                            \"aws\",\n-                            \"lambda\",\n-                            \"put\"\n-                        ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.aws.lambda.PutLambda\",\n-                        \"typeDescription\": \"Sends the contents to a specified Amazon Lambda Function. The AWS credentials used for authentication must have permissions execute the Lambda function (lambda:InvokeFunction).The FlowFile content must be JSON.\",\n-                        \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"Function error message in result on posting message to AWS Lambda\",\n-                                \"name\": \"aws.lambda.result.function.error\"\n-                            },\n-                            {\n-                                \"description\": \"Status code in the result for the message when posting to AWS Lambda\",\n-                                \"name\": \"aws.lambda.result.status.code\"\n-                            },\n-                            {\n-                                \"description\": \"Payload in the result from AWS Lambda\",\n-                                \"name\": \"aws.lambda.result.payload\"\n-                            },\n-                            {\n-                                \"description\": \"Log in the result of the message posted to Lambda\",\n-                                \"name\": \"aws.lambda.result.log\"\n-                            },\n-                            {\n-                                \"description\": \"Exception message on invoking from AWS Lambda\",\n-                                \"name\": \"aws.lambda.exception.message\"\n-                            },\n-                            {\n-                                \"description\": \"Exception cause on invoking from AWS Lambda\",\n-                                \"name\": \"aws.lambda.exception.cause\"\n-                            },\n-                            {\n-                                \"description\": \"Exception error code on invoking from AWS Lambda\",\n-                                \"name\": \"aws.lambda.exception.error.code\"\n-                            },\n-                            {\n-                                \"description\": \"Exception request id on invoking from AWS Lambda\",\n-                                \"name\": \"aws.lambda.exception.request.id\"\n-                            },\n-                            {\n-                                \"description\": \"Exception status code on invoking from AWS Lambda\",\n-                                \"name\": \"aws.lambda.exception.status.code\"\n-                            }\n-                        ]\n-                    },\n-                    {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-aws-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"f2215c6\"\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-                        \"multiProcessorUseCases\": [],\n-                        \"primaryNodeOnly\": false,\n-                        \"propertyDescriptors\": {\n-                            \"AWS Credentials Provider service\": {\n-                                \"description\": \"The Controller Service that is used to obtain AWS credentials provider\",\n-                                \"displayName\": \"AWS Credentials Provider Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"AWS Credentials Provider service\",\n-                                \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-aws-service-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.processors.aws.credentials.provider.service.AWSCredentialsProviderService\",\n-                                    \"version\": \"2.0.0-M3\"\n-                                }\n-                            },\n-                            \"Communications Timeout\": {\n-                                \"defaultValue\": \"30 secs\",\n-                                \"description\": \"\",\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-                            \"Endpoint Override URL\": {\n-                                \"description\": \"Endpoint URL to use instead of the AWS default including scheme, host, port, and path. The AWS libraries select an endpoint URL based on the AWS region, but this property overrides the selected endpoint URL, allowing use with other S3-compatible endpoints.\",\n-                                \"displayName\": \"Endpoint Override URL\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Endpoint Override URL\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Region\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-gov-east-1\",\n-                                        \"displayName\": \"AWS GovCloud (US-East)\",\n-                                        \"value\": \"us-gov-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-gov-west-1\",\n-                                        \"displayName\": \"AWS GovCloud (US-West)\",\n-                                        \"value\": \"us-gov-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : af-south-1\",\n-                                        \"displayName\": \"Africa (Cape Town)\",\n-                                        \"value\": \"af-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-east-1\",\n-                                        \"displayName\": \"Asia Pacific (Hong Kong)\",\n-                                        \"value\": \"ap-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-south-2\",\n-                                        \"displayName\": \"Asia Pacific (Hyderabad)\",\n-                                        \"value\": \"ap-south-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-3\",\n-                                        \"displayName\": \"Asia Pacific (Jakarta)\",\n-                                        \"value\": \"ap-southeast-3\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-4\",\n-                                        \"displayName\": \"Asia Pacific (Melbourne)\",\n-                                        \"value\": \"ap-southeast-4\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-south-1\",\n-                                        \"displayName\": \"Asia Pacific (Mumbai)\",\n-                                        \"value\": \"ap-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-northeast-3\",\n-                                        \"displayName\": \"Asia Pacific (Osaka)\",\n-                                        \"value\": \"ap-northeast-3\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-northeast-2\",\n-                                        \"displayName\": \"Asia Pacific (Seoul)\",\n-                                        \"value\": \"ap-northeast-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-1\",\n-                                        \"displayName\": \"Asia Pacific (Singapore)\",\n-                                        \"value\": \"ap-southeast-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-2\",\n-                                        \"displayName\": \"Asia Pacific (Sydney)\",\n-                                        \"value\": \"ap-southeast-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-northeast-1\",\n-                                        \"displayName\": \"Asia Pacific (Tokyo)\",\n-                                        \"value\": \"ap-northeast-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ca-central-1\",\n-                                        \"displayName\": \"Canada (Central)\",\n-                                        \"value\": \"ca-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ca-west-1\",\n-                                        \"displayName\": \"Canada West (Calgary)\",\n-                                        \"value\": \"ca-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : cn-north-1\",\n-                                        \"displayName\": \"China (Beijing)\",\n-                                        \"value\": \"cn-north-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : cn-northwest-1\",\n-                                        \"displayName\": \"China (Ningxia)\",\n-                                        \"value\": \"cn-northwest-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-central-1\",\n-                                        \"displayName\": \"Europe (Frankfurt)\",\n-                                        \"value\": \"eu-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-west-1\",\n-                                        \"displayName\": \"Europe (Ireland)\",\n-                                        \"value\": \"eu-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-west-2\",\n-                                        \"displayName\": \"Europe (London)\",\n-                                        \"value\": \"eu-west-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-south-1\",\n-                                        \"displayName\": \"Europe (Milan)\",\n-                                        \"value\": \"eu-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-west-3\",\n-                                        \"displayName\": \"Europe (Paris)\",\n-                                        \"value\": \"eu-west-3\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-south-2\",\n-                                        \"displayName\": \"Europe (Spain)\",\n-                                        \"value\": \"eu-south-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-north-1\",\n-                                        \"displayName\": \"Europe (Stockholm)\",\n-                                        \"value\": \"eu-north-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-central-2\",\n-                                        \"displayName\": \"Europe (Zurich)\",\n-                                        \"value\": \"eu-central-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : il-central-1\",\n-                                        \"displayName\": \"Israel (Tel Aviv)\",\n-                                        \"value\": \"il-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : me-south-1\",\n-                                        \"displayName\": \"Middle East (Bahrain)\",\n-                                        \"value\": \"me-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : me-central-1\",\n-                                        \"displayName\": \"Middle East (UAE)\",\n-                                        \"value\": \"me-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : sa-east-1\",\n-                                        \"displayName\": \"South America (Sao Paulo)\",\n-                                        \"value\": \"sa-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-east-1\",\n-                                        \"displayName\": \"US East (N. Virginia)\",\n-                                        \"value\": \"us-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-east-2\",\n-                                        \"displayName\": \"US East (Ohio)\",\n-                                        \"value\": \"us-east-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-iso-east-1\",\n-                                        \"displayName\": \"US ISO East\",\n-                                        \"value\": \"us-iso-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-iso-west-1\",\n-                                        \"displayName\": \"US ISO WEST\",\n-                                        \"value\": \"us-iso-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-isob-east-1\",\n-                                        \"displayName\": \"US ISOB East (Ohio)\",\n-                                        \"value\": \"us-isob-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-west-1\",\n-                                        \"displayName\": \"US West (N. California)\",\n-                                        \"value\": \"us-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-west-2\",\n-                                        \"displayName\": \"US West (Oregon)\",\n-                                        \"value\": \"us-west-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : aws-cn-global\",\n-                                        \"displayName\": \"aws-cn-global\",\n-                                        \"value\": \"aws-cn-global\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : aws-global\",\n-                                        \"displayName\": \"aws-global\",\n-                                        \"value\": \"aws-global\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : aws-iso-b-global\",\n-                                        \"displayName\": \"aws-iso-b-global\",\n-                                        \"value\": \"aws-iso-b-global\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : aws-iso-global\",\n-                                        \"displayName\": \"aws-iso-global\",\n-                                        \"value\": \"aws-iso-global\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : aws-us-gov-global\",\n-                                        \"displayName\": \"aws-us-gov-global\",\n-                                        \"value\": \"aws-us-gov-global\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"us-west-2\",\n-                                \"description\": \"\",\n-                                \"displayName\": \"Region\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Region\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\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\": \"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\": \"2.0.0-M3\"\n-                                }\n-                            },\n-                            \"awsTaskId\": {\n-                                \"defaultValue\": \"${awsTaskId}\",\n-                                \"description\": \"\",\n-                                \"displayName\": \"AWS Task ID\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"awsTaskId\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"proxy-configuration-service\": {\n-                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests.\",\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\": \"2.0.0-M3\"\n-                                }\n-                            }\n-                        },\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.aws.ml.polly.StartAwsPollyJob\"\n-                        ],\n-                        \"sideEffectFree\": false,\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"Job successfully finished. FlowFile will be routed to this relation.\",\n-                                \"name\": \"success\"\n-                            },\n-                            {\n-                                \"description\": \"The job failed, the original FlowFile will be routed to this 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-                                \"description\": \"The job is currently still being processed\",\n-                                \"name\": \"running\"\n-                            }\n-                        ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"AWS\",\n-                            \"Amazon\",\n-                            \"ML\",\n-                            \"Machine Learning\",\n-                            \"Polly\"\n-                        ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.aws.ml.polly.GetAwsPollyJobStatus\",\n-                        \"typeDescription\": \"Retrieves the current status of an AWS Polly job.\",\n-                        \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"The bucket name where polly output will be located.\",\n-                                \"name\": \"PollyS3OutputBucket\"\n-                            },\n-                            {\n-                                \"description\": \"Object key of polly output.\",\n-                                \"name\": \"filename\"\n-                            },\n-                            {\n-                                \"description\": \"S3 path-style output location of the result.\",\n-                                \"name\": \"outputLocation\"\n-                            }\n-                        ]\n-                    },\n-                    {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-aws-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"f2215c6\"\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-                        \"multiProcessorUseCases\": [],\n-                        \"primaryNodeOnly\": false,\n-                        \"propertyDescriptors\": {\n-                            \"AWS Credentials Provider service\": {\n-                                \"description\": \"The Controller Service that is used to obtain AWS credentials provider\",\n-                                \"displayName\": \"AWS Credentials Provider Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"AWS Credentials Provider service\",\n-                                \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-aws-service-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.processors.aws.credentials.provider.service.AWSCredentialsProviderService\",\n-                                    \"version\": \"2.0.0-M3\"\n-                                }\n-                            },\n-                            \"Communications Timeout\": {\n-                                \"defaultValue\": \"30 secs\",\n-                                \"description\": \"\",\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-                            \"Endpoint Override URL\": {\n-                                \"description\": \"Endpoint URL to use instead of the AWS default including scheme, host, port, and path. The AWS libraries select an endpoint URL based on the AWS region, but this property overrides the selected endpoint URL, allowing use with other S3-compatible endpoints.\",\n-                                \"displayName\": \"Endpoint Override URL\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Endpoint Override URL\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Region\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-gov-east-1\",\n-                                        \"displayName\": \"AWS GovCloud (US-East)\",\n-                                        \"value\": \"us-gov-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-gov-west-1\",\n-                                        \"displayName\": \"AWS GovCloud (US-West)\",\n-                                        \"value\": \"us-gov-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : af-south-1\",\n-                                        \"displayName\": \"Africa (Cape Town)\",\n-                                        \"value\": \"af-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-east-1\",\n-                                        \"displayName\": \"Asia Pacific (Hong Kong)\",\n-                                        \"value\": \"ap-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-south-2\",\n-                                        \"displayName\": \"Asia Pacific (Hyderabad)\",\n-                                        \"value\": \"ap-south-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-3\",\n-                                        \"displayName\": \"Asia Pacific (Jakarta)\",\n-                                        \"value\": \"ap-southeast-3\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-4\",\n-                                        \"displayName\": \"Asia Pacific (Melbourne)\",\n-                                        \"value\": \"ap-southeast-4\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-south-1\",\n-                                        \"displayName\": \"Asia Pacific (Mumbai)\",\n-                                        \"value\": \"ap-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-northeast-3\",\n-                                        \"displayName\": \"Asia Pacific (Osaka)\",\n-                                        \"value\": \"ap-northeast-3\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-northeast-2\",\n-                                        \"displayName\": \"Asia Pacific (Seoul)\",\n-                                        \"value\": \"ap-northeast-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-1\",\n-                                        \"displayName\": \"Asia Pacific (Singapore)\",\n-                                        \"value\": \"ap-southeast-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-2\",\n-                                        \"displayName\": \"Asia Pacific (Sydney)\",\n-                                        \"value\": \"ap-southeast-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-northeast-1\",\n-                                        \"displayName\": \"Asia Pacific (Tokyo)\",\n-                                        \"value\": \"ap-northeast-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ca-central-1\",\n-                                        \"displayName\": \"Canada (Central)\",\n-                                        \"value\": \"ca-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ca-west-1\",\n-                                        \"displayName\": \"Canada West (Calgary)\",\n-                                        \"value\": \"ca-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : cn-north-1\",\n-                                        \"displayName\": \"China (Beijing)\",\n-                                        \"value\": \"cn-north-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : cn-northwest-1\",\n-                                        \"displayName\": \"China (Ningxia)\",\n-                                        \"value\": \"cn-northwest-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-central-1\",\n-                                        \"displayName\": \"Europe (Frankfurt)\",\n-                                        \"value\": \"eu-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-west-1\",\n-                                        \"displayName\": \"Europe (Ireland)\",\n-                                        \"value\": \"eu-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-west-2\",\n-                                        \"displayName\": \"Europe (London)\",\n-                                        \"value\": \"eu-west-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-south-1\",\n-                                        \"displayName\": \"Europe (Milan)\",\n-                                        \"value\": \"eu-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-west-3\",\n-                                        \"displayName\": \"Europe (Paris)\",\n-                                        \"value\": \"eu-west-3\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-south-2\",\n-                                        \"displayName\": \"Europe (Spain)\",\n-                                        \"value\": \"eu-south-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-north-1\",\n-                                        \"displayName\": \"Europe (Stockholm)\",\n-                                        \"value\": \"eu-north-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-central-2\",\n-                                        \"displayName\": \"Europe (Zurich)\",\n-                                        \"value\": \"eu-central-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : il-central-1\",\n-                                        \"displayName\": \"Israel (Tel Aviv)\",\n-                                        \"value\": \"il-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : me-south-1\",\n-                                        \"displayName\": \"Middle East (Bahrain)\",\n-                                        \"value\": \"me-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : me-central-1\",\n-                                        \"displayName\": \"Middle East (UAE)\",\n-                                        \"value\": \"me-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : sa-east-1\",\n-                                        \"displayName\": \"South America (Sao Paulo)\",\n-                                        \"value\": \"sa-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-east-1\",\n-                                        \"displayName\": \"US East (N. Virginia)\",\n-                                        \"value\": \"us-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-east-2\",\n-                                        \"displayName\": \"US East (Ohio)\",\n-                                        \"value\": \"us-east-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-iso-east-1\",\n-                                        \"displayName\": \"US ISO East\",\n-                                        \"value\": \"us-iso-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-iso-west-1\",\n-                                        \"displayName\": \"US ISO WEST\",\n-                                        \"value\": \"us-iso-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-isob-east-1\",\n-                                        \"displayName\": \"US ISOB East (Ohio)\",\n-                                        \"value\": \"us-isob-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-west-1\",\n-                                        \"displayName\": \"US West (N. California)\",\n-                                        \"value\": \"us-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-west-2\",\n-                                        \"displayName\": \"US West (Oregon)\",\n-                                        \"value\": \"us-west-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : aws-cn-global\",\n-                                        \"displayName\": \"aws-cn-global\",\n-                                        \"value\": \"aws-cn-global\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : aws-global\",\n-                                        \"displayName\": \"aws-global\",\n-                                        \"value\": \"aws-global\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : aws-iso-b-global\",\n-                                        \"displayName\": \"aws-iso-b-global\",\n-                                        \"value\": \"aws-iso-b-global\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : aws-iso-global\",\n-                                        \"displayName\": \"aws-iso-global\",\n-                                        \"value\": \"aws-iso-global\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : aws-us-gov-global\",\n-                                        \"displayName\": \"aws-us-gov-global\",\n-                                        \"value\": \"aws-us-gov-global\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"us-west-2\",\n-                                \"description\": \"\",\n-                                \"displayName\": \"Region\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Region\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\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\": \"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\": \"2.0.0-M3\"\n-                                }\n-                            },\n-                            \"json-payload\": {\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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"json-payload\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            }\n-                        },\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.aws.ml.polly.GetAwsPollyJobStatus\"\n-                        ],\n-                        \"sideEffectFree\": false,\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"FlowFiles are routed to failure relationship\",\n-                                \"name\": \"failure\"\n-                            },\n-                            {\n-                                \"description\": \"FlowFiles are routed to success relationship\",\n-                                \"name\": \"success\"\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-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"AWS\",\n-                            \"Amazon\",\n-                            \"ML\",\n-                            \"Machine Learning\",\n-                            \"Polly\"\n-                        ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.aws.ml.polly.StartAwsPollyJob\",\n-                        \"typeDescription\": \"Trigger a AWS Polly job. It should be followed by GetAwsPollyJobStatus processor in order to monitor job status.\",\n-                        \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"The task ID that can be used to poll for Job completion in GetAwsPollyJobStatus\",\n-                                \"name\": \"awsTaskId\"\n-                            }\n-                        ]\n-                    },\n-                    {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-aws-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"f2215c6\"\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-                        \"multiProcessorUseCases\": [],\n-                        \"primaryNodeOnly\": false,\n-                        \"propertyDescriptors\": {\n-                            \"AWS Credentials Provider service\": {\n-                                \"description\": \"The Controller Service that is used to obtain AWS credentials provider\",\n-                                \"displayName\": \"AWS Credentials Provider Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"AWS Credentials Provider service\",\n-                                \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-aws-service-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.processors.aws.credentials.provider.service.AWSCredentialsProviderService\",\n-                                    \"version\": \"2.0.0-M3\"\n-                                }\n-                            },\n-                            \"Communications Timeout\": {\n-                                \"defaultValue\": \"30 secs\",\n-                                \"description\": \"\",\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-                            \"Endpoint Override URL\": {\n-                                \"description\": \"Endpoint URL to use instead of the AWS default including scheme, host, port, and path. The AWS libraries select an endpoint URL based on the AWS region, but this property overrides the selected endpoint URL, allowing use with other S3-compatible endpoints.\",\n-                                \"displayName\": \"Endpoint Override URL\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Endpoint Override URL\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Region\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-gov-east-1\",\n-                                        \"displayName\": \"AWS GovCloud (US-East)\",\n-                                        \"value\": \"us-gov-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-gov-west-1\",\n-                                        \"displayName\": \"AWS GovCloud (US-West)\",\n-                                        \"value\": \"us-gov-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : af-south-1\",\n-                                        \"displayName\": \"Africa (Cape Town)\",\n-                                        \"value\": \"af-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-east-1\",\n-                                        \"displayName\": \"Asia Pacific (Hong Kong)\",\n-                                        \"value\": \"ap-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-south-2\",\n-                                        \"displayName\": \"Asia Pacific (Hyderabad)\",\n-                                        \"value\": \"ap-south-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-3\",\n-                                        \"displayName\": \"Asia Pacific (Jakarta)\",\n-                                        \"value\": \"ap-southeast-3\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-4\",\n-                                        \"displayName\": \"Asia Pacific (Melbourne)\",\n-                                        \"value\": \"ap-southeast-4\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-south-1\",\n-                                        \"displayName\": \"Asia Pacific (Mumbai)\",\n-                                        \"value\": \"ap-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-northeast-3\",\n-                                        \"displayName\": \"Asia Pacific (Osaka)\",\n-                                        \"value\": \"ap-northeast-3\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-northeast-2\",\n-                                        \"displayName\": \"Asia Pacific (Seoul)\",\n-                                        \"value\": \"ap-northeast-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-1\",\n-                                        \"displayName\": \"Asia Pacific (Singapore)\",\n-                                        \"value\": \"ap-southeast-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-2\",\n-                                        \"displayName\": \"Asia Pacific (Sydney)\",\n-                                        \"value\": \"ap-southeast-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-northeast-1\",\n-                                        \"displayName\": \"Asia Pacific (Tokyo)\",\n-                                        \"value\": \"ap-northeast-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ca-central-1\",\n-                                        \"displayName\": \"Canada (Central)\",\n-                                        \"value\": \"ca-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ca-west-1\",\n-                                        \"displayName\": \"Canada West (Calgary)\",\n-                                        \"value\": \"ca-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : cn-north-1\",\n-                                        \"displayName\": \"China (Beijing)\",\n-                                        \"value\": \"cn-north-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : cn-northwest-1\",\n-                                        \"displayName\": \"China (Ningxia)\",\n-                                        \"value\": \"cn-northwest-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-central-1\",\n-                                        \"displayName\": \"Europe (Frankfurt)\",\n-                                        \"value\": \"eu-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-west-1\",\n-                                        \"displayName\": \"Europe (Ireland)\",\n-                                        \"value\": \"eu-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-west-2\",\n-                                        \"displayName\": \"Europe (London)\",\n-                                        \"value\": \"eu-west-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-south-1\",\n-                                        \"displayName\": \"Europe (Milan)\",\n-                                        \"value\": \"eu-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-west-3\",\n-                                        \"displayName\": \"Europe (Paris)\",\n-                                        \"value\": \"eu-west-3\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-south-2\",\n-                                        \"displayName\": \"Europe (Spain)\",\n-                                        \"value\": \"eu-south-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-north-1\",\n-                                        \"displayName\": \"Europe (Stockholm)\",\n-                                        \"value\": \"eu-north-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-central-2\",\n-                                        \"displayName\": \"Europe (Zurich)\",\n-                                        \"value\": \"eu-central-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : il-central-1\",\n-                                        \"displayName\": \"Israel (Tel Aviv)\",\n-                                        \"value\": \"il-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : me-south-1\",\n-                                        \"displayName\": \"Middle East (Bahrain)\",\n-                                        \"value\": \"me-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : me-central-1\",\n-                                        \"displayName\": \"Middle East (UAE)\",\n-                                        \"value\": \"me-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : sa-east-1\",\n-                                        \"displayName\": \"South America (Sao Paulo)\",\n-                                        \"value\": \"sa-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-east-1\",\n-                                        \"displayName\": \"US East (N. Virginia)\",\n-                                        \"value\": \"us-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-east-2\",\n-                                        \"displayName\": \"US East (Ohio)\",\n-                                        \"value\": \"us-east-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-iso-east-1\",\n-                                        \"displayName\": \"US ISO East\",\n-                                        \"value\": \"us-iso-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-iso-west-1\",\n-                                        \"displayName\": \"US ISO WEST\",\n-                                        \"value\": \"us-iso-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-isob-east-1\",\n-                                        \"displayName\": \"US ISOB East (Ohio)\",\n-                                        \"value\": \"us-isob-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-west-1\",\n-                                        \"displayName\": \"US West (N. California)\",\n-                                        \"value\": \"us-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-west-2\",\n-                                        \"displayName\": \"US West (Oregon)\",\n-                                        \"value\": \"us-west-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : aws-cn-global\",\n-                                        \"displayName\": \"aws-cn-global\",\n-                                        \"value\": \"aws-cn-global\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : aws-global\",\n-                                        \"displayName\": \"aws-global\",\n-                                        \"value\": \"aws-global\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : aws-iso-b-global\",\n-                                        \"displayName\": \"aws-iso-b-global\",\n-                                        \"value\": \"aws-iso-b-global\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : aws-iso-global\",\n-                                        \"displayName\": \"aws-iso-global\",\n-                                        \"value\": \"aws-iso-global\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : aws-us-gov-global\",\n-                                        \"displayName\": \"aws-us-gov-global\",\n-                                        \"value\": \"aws-us-gov-global\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"us-west-2\",\n-                                \"description\": \"\",\n-                                \"displayName\": \"Region\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Region\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\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\": \"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\": \"2.0.0-M3\"\n-                                }\n-                            },\n-                            \"awsTaskId\": {\n-                                \"defaultValue\": \"${awsTaskId}\",\n-                                \"description\": \"\",\n-                                \"displayName\": \"AWS Task ID\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"awsTaskId\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"proxy-configuration-service\": {\n-                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests.\",\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\": \"2.0.0-M3\"\n-                                }\n-                            },\n-                            \"textract-type\": {\n-                                \"defaultValue\": \"${awsTextractType}\",\n-                                \"description\": \"Supported values: \\\"Document Analysis\\\", \\\"Document Text Detection\\\", \\\"Expense Analysis\\\"\",\n-                                \"displayName\": \"Textract Type\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"textract-type\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            }\n-                        },\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.aws.ml.textract.StartAwsTextractJob\"\n-                        ],\n-                        \"sideEffectFree\": false,\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"Retrieving results failed for some reason, but the issue is likely to resolve on its own, such as Provisioned Throughput Exceeded or a Throttling failure. It is generally expected to retry this relationship.\",\n-                                \"name\": \"throttled\"\n-                            },\n-                            {\n-                                \"description\": \"The job is currently still being processed\",\n-                                \"name\": \"running\"\n-                            },\n-                            {\n-                                \"description\": \"Upon successful completion, the original FlowFile will be routed to this relationship.\",\n-                                \"name\": \"original\"\n-                            },\n-                            {\n-                                \"description\": \"The job failed, the original FlowFile will be routed to this relationship.\",\n-                                \"name\": \"failure\"\n-                            },\n-                            {\n-                                \"description\": \"Job successfully finished. FlowFile will be routed to this relation.\",\n-                                \"name\": \"success\"\n-                            }\n-                        ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"AWS\",\n-                            \"Amazon\",\n-                            \"ML\",\n-                            \"Machine Learning\",\n-                            \"Textract\"\n-                        ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.aws.ml.textract.GetAwsTextractJobStatus\",\n-                        \"typeDescription\": \"Retrieves the current status of an AWS Textract job.\",\n-                        \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\"\n-                    },\n-                    {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-aws-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"f2215c6\"\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-                        \"multiProcessorUseCases\": [],\n-                        \"primaryNodeOnly\": false,\n-                        \"propertyDescriptors\": {\n-                            \"AWS Credentials Provider service\": {\n-                                \"description\": \"The Controller Service that is used to obtain AWS credentials provider\",\n-                                \"displayName\": \"AWS Credentials Provider Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"AWS Credentials Provider service\",\n-                                \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-aws-service-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.processors.aws.credentials.provider.service.AWSCredentialsProviderService\",\n-                                    \"version\": \"2.0.0-M3\"\n-                                }\n-                            },\n-                            \"Communications Timeout\": {\n-                                \"defaultValue\": \"30 secs\",\n-                                \"description\": \"\",\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-                            \"Endpoint Override URL\": {\n-                                \"description\": \"Endpoint URL to use instead of the AWS default including scheme, host, port, and path. The AWS libraries select an endpoint URL based on the AWS region, but this property overrides the selected endpoint URL, allowing use with other S3-compatible endpoints.\",\n-                                \"displayName\": \"Endpoint Override URL\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Endpoint Override URL\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Region\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-gov-east-1\",\n-                                        \"displayName\": \"AWS GovCloud (US-East)\",\n-                                        \"value\": \"us-gov-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-gov-west-1\",\n-                                        \"displayName\": \"AWS GovCloud (US-West)\",\n-                                        \"value\": \"us-gov-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : af-south-1\",\n-                                        \"displayName\": \"Africa (Cape Town)\",\n-                                        \"value\": \"af-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-east-1\",\n-                                        \"displayName\": \"Asia Pacific (Hong Kong)\",\n-                                        \"value\": \"ap-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-south-2\",\n-                                        \"displayName\": \"Asia Pacific (Hyderabad)\",\n-                                        \"value\": \"ap-south-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-3\",\n-                                        \"displayName\": \"Asia Pacific (Jakarta)\",\n-                                        \"value\": \"ap-southeast-3\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-4\",\n-                                        \"displayName\": \"Asia Pacific (Melbourne)\",\n-                                        \"value\": \"ap-southeast-4\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-south-1\",\n-                                        \"displayName\": \"Asia Pacific (Mumbai)\",\n-                                        \"value\": \"ap-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-northeast-3\",\n-                                        \"displayName\": \"Asia Pacific (Osaka)\",\n-                                        \"value\": \"ap-northeast-3\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-northeast-2\",\n-                                        \"displayName\": \"Asia Pacific (Seoul)\",\n-                                        \"value\": \"ap-northeast-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-1\",\n-                                        \"displayName\": \"Asia Pacific (Singapore)\",\n-                                        \"value\": \"ap-southeast-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-2\",\n-                                        \"displayName\": \"Asia Pacific (Sydney)\",\n-                                        \"value\": \"ap-southeast-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-northeast-1\",\n-                                        \"displayName\": \"Asia Pacific (Tokyo)\",\n-                                        \"value\": \"ap-northeast-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ca-central-1\",\n-                                        \"displayName\": \"Canada (Central)\",\n-                                        \"value\": \"ca-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ca-west-1\",\n-                                        \"displayName\": \"Canada West (Calgary)\",\n-                                        \"value\": \"ca-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : cn-north-1\",\n-                                        \"displayName\": \"China (Beijing)\",\n-                                        \"value\": \"cn-north-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : cn-northwest-1\",\n-                                        \"displayName\": \"China (Ningxia)\",\n-                                        \"value\": \"cn-northwest-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-central-1\",\n-                                        \"displayName\": \"Europe (Frankfurt)\",\n-                                        \"value\": \"eu-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-west-1\",\n-                                        \"displayName\": \"Europe (Ireland)\",\n-                                        \"value\": \"eu-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-west-2\",\n-                                        \"displayName\": \"Europe (London)\",\n-                                        \"value\": \"eu-west-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-south-1\",\n-                                        \"displayName\": \"Europe (Milan)\",\n-                                        \"value\": \"eu-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-west-3\",\n-                                        \"displayName\": \"Europe (Paris)\",\n-                                        \"value\": \"eu-west-3\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-south-2\",\n-                                        \"displayName\": \"Europe (Spain)\",\n-                                        \"value\": \"eu-south-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-north-1\",\n-                                        \"displayName\": \"Europe (Stockholm)\",\n-                                        \"value\": \"eu-north-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-central-2\",\n-                                        \"displayName\": \"Europe (Zurich)\",\n-                                        \"value\": \"eu-central-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : il-central-1\",\n-                                        \"displayName\": \"Israel (Tel Aviv)\",\n-                                        \"value\": \"il-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : me-south-1\",\n-                                        \"displayName\": \"Middle East (Bahrain)\",\n-                                        \"value\": \"me-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : me-central-1\",\n-                                        \"displayName\": \"Middle East (UAE)\",\n-                                        \"value\": \"me-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : sa-east-1\",\n-                                        \"displayName\": \"South America (Sao Paulo)\",\n-                                        \"value\": \"sa-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-east-1\",\n-                                        \"displayName\": \"US East (N. Virginia)\",\n-                                        \"value\": \"us-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-east-2\",\n-                                        \"displayName\": \"US East (Ohio)\",\n-                                        \"value\": \"us-east-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-iso-east-1\",\n-                                        \"displayName\": \"US ISO East\",\n-                                        \"value\": \"us-iso-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-iso-west-1\",\n-                                        \"displayName\": \"US ISO WEST\",\n-                                        \"value\": \"us-iso-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-isob-east-1\",\n-                                        \"displayName\": \"US ISOB East (Ohio)\",\n-                                        \"value\": \"us-isob-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-west-1\",\n-                                        \"displayName\": \"US West (N. California)\",\n-                                        \"value\": \"us-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-west-2\",\n-                                        \"displayName\": \"US West (Oregon)\",\n-                                        \"value\": \"us-west-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : aws-cn-global\",\n-                                        \"displayName\": \"aws-cn-global\",\n-                                        \"value\": \"aws-cn-global\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : aws-global\",\n-                                        \"displayName\": \"aws-global\",\n-                                        \"value\": \"aws-global\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : aws-iso-b-global\",\n-                                        \"displayName\": \"aws-iso-b-global\",\n-                                        \"value\": \"aws-iso-b-global\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : aws-iso-global\",\n-                                        \"displayName\": \"aws-iso-global\",\n-                                        \"value\": \"aws-iso-global\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : aws-us-gov-global\",\n-                                        \"displayName\": \"aws-us-gov-global\",\n-                                        \"value\": \"aws-us-gov-global\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"us-west-2\",\n-                                \"description\": \"\",\n-                                \"displayName\": \"Region\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Region\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\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\": \"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\": \"2.0.0-M3\"\n-                                }\n-                            },\n-                            \"json-payload\": {\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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"json-payload\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"textract-type\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Expense Analysis\",\n-                                        \"value\": \"Expense Analysis\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Document Analysis\",\n-                                        \"value\": \"Document Analysis\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Document Text Detection\",\n-                                        \"value\": \"Document Text Detection\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"Document Analysis\",\n-                                \"description\": \"Supported values: \\\"Document Analysis\\\", \\\"Document Text Detection\\\", \\\"Expense Analysis\\\"\",\n-                                \"displayName\": \"Textract Type\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"textract-type\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            }\n-                        },\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.aws.ml.textract.GetAwsTextractJobStatus\"\n-                        ],\n-                        \"sideEffectFree\": false,\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"FlowFiles are routed to failure relationship\",\n-                                \"name\": \"failure\"\n-                            },\n-                            {\n-                                \"description\": \"FlowFiles are routed to success relationship\",\n-                                \"name\": \"success\"\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-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"AWS\",\n-                            \"Amazon\",\n-                            \"ML\",\n-                            \"Machine Learning\",\n-                            \"Textract\"\n-                        ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.aws.ml.textract.StartAwsTextractJob\",\n-                        \"typeDescription\": \"Trigger a AWS Textract job. It should be followed by GetAwsTextractJobStatus processor in order to monitor job status.\",\n-                        \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"The task ID that can be used to poll for Job completion in GetAwsTextractJobStatus\",\n-                                \"name\": \"awsTaskId\"\n-                            },\n-                            {\n-                                \"description\": \"The selected Textract type, which can be used in GetAwsTextractJobStatus\",\n-                                \"name\": \"awsTextractType\"\n-                            }\n-                        ]\n-                    },\n-                    {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-aws-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"f2215c6\"\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-                        \"multiProcessorUseCases\": [],\n-                        \"primaryNodeOnly\": false,\n-                        \"propertyDescriptors\": {\n-                            \"AWS Credentials Provider service\": {\n-                                \"description\": \"The Controller Service that is used to obtain AWS credentials provider\",\n-                                \"displayName\": \"AWS Credentials Provider Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"AWS Credentials Provider service\",\n-                                \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-aws-service-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.processors.aws.credentials.provider.service.AWSCredentialsProviderService\",\n-                                    \"version\": \"2.0.0-M3\"\n-                                }\n-                            },\n-                            \"Communications Timeout\": {\n-                                \"defaultValue\": \"30 secs\",\n-                                \"description\": \"\",\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-                            \"Endpoint Override URL\": {\n-                                \"description\": \"Endpoint URL to use instead of the AWS default including scheme, host, port, and path. The AWS libraries select an endpoint URL based on the AWS region, but this property overrides the selected endpoint URL, allowing use with other S3-compatible endpoints.\",\n-                                \"displayName\": \"Endpoint Override URL\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Endpoint Override URL\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Region\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-gov-east-1\",\n-                                        \"displayName\": \"AWS GovCloud (US-East)\",\n-                                        \"value\": \"us-gov-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-gov-west-1\",\n-                                        \"displayName\": \"AWS GovCloud (US-West)\",\n-                                        \"value\": \"us-gov-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : af-south-1\",\n-                                        \"displayName\": \"Africa (Cape Town)\",\n-                                        \"value\": \"af-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-east-1\",\n-                                        \"displayName\": \"Asia Pacific (Hong Kong)\",\n-                                        \"value\": \"ap-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-south-2\",\n-                                        \"displayName\": \"Asia Pacific (Hyderabad)\",\n-                                        \"value\": \"ap-south-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-3\",\n-                                        \"displayName\": \"Asia Pacific (Jakarta)\",\n-                                        \"value\": \"ap-southeast-3\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-4\",\n-                                        \"displayName\": \"Asia Pacific (Melbourne)\",\n-                                        \"value\": \"ap-southeast-4\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-south-1\",\n-                                        \"displayName\": \"Asia Pacific (Mumbai)\",\n-                                        \"value\": \"ap-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-northeast-3\",\n-                                        \"displayName\": \"Asia Pacific (Osaka)\",\n-                                        \"value\": \"ap-northeast-3\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-northeast-2\",\n-                                        \"displayName\": \"Asia Pacific (Seoul)\",\n-                                        \"value\": \"ap-northeast-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-1\",\n-                                        \"displayName\": \"Asia Pacific (Singapore)\",\n-                                        \"value\": \"ap-southeast-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-2\",\n-                                        \"displayName\": \"Asia Pacific (Sydney)\",\n-                                        \"value\": \"ap-southeast-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-northeast-1\",\n-                                        \"displayName\": \"Asia Pacific (Tokyo)\",\n-                                        \"value\": \"ap-northeast-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ca-central-1\",\n-                                        \"displayName\": \"Canada (Central)\",\n-                                        \"value\": \"ca-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ca-west-1\",\n-                                        \"displayName\": \"Canada West (Calgary)\",\n-                                        \"value\": \"ca-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : cn-north-1\",\n-                                        \"displayName\": \"China (Beijing)\",\n-                                        \"value\": \"cn-north-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : cn-northwest-1\",\n-                                        \"displayName\": \"China (Ningxia)\",\n-                                        \"value\": \"cn-northwest-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-central-1\",\n-                                        \"displayName\": \"Europe (Frankfurt)\",\n-                                        \"value\": \"eu-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-west-1\",\n-                                        \"displayName\": \"Europe (Ireland)\",\n-                                        \"value\": \"eu-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-west-2\",\n-                                        \"displayName\": \"Europe (London)\",\n-                                        \"value\": \"eu-west-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-south-1\",\n-                                        \"displayName\": \"Europe (Milan)\",\n-                                        \"value\": \"eu-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-west-3\",\n-                                        \"displayName\": \"Europe (Paris)\",\n-                                        \"value\": \"eu-west-3\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-south-2\",\n-                                        \"displayName\": \"Europe (Spain)\",\n-                                        \"value\": \"eu-south-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-north-1\",\n-                                        \"displayName\": \"Europe (Stockholm)\",\n-                                        \"value\": \"eu-north-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-central-2\",\n-                                        \"displayName\": \"Europe (Zurich)\",\n-                                        \"value\": \"eu-central-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : il-central-1\",\n-                                        \"displayName\": \"Israel (Tel Aviv)\",\n-                                        \"value\": \"il-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : me-south-1\",\n-                                        \"displayName\": \"Middle East (Bahrain)\",\n-                                        \"value\": \"me-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : me-central-1\",\n-                                        \"displayName\": \"Middle East (UAE)\",\n-                                        \"value\": \"me-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : sa-east-1\",\n-                                        \"displayName\": \"South America (Sao Paulo)\",\n-                                        \"value\": \"sa-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-east-1\",\n-                                        \"displayName\": \"US East (N. Virginia)\",\n-                                        \"value\": \"us-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-east-2\",\n-                                        \"displayName\": \"US East (Ohio)\",\n-                                        \"value\": \"us-east-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-iso-east-1\",\n-                                        \"displayName\": \"US ISO East\",\n-                                        \"value\": \"us-iso-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-iso-west-1\",\n-                                        \"displayName\": \"US ISO WEST\",\n-                                        \"value\": \"us-iso-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-isob-east-1\",\n-                                        \"displayName\": \"US ISOB East (Ohio)\",\n-                                        \"value\": \"us-isob-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-west-1\",\n-                                        \"displayName\": \"US West (N. California)\",\n-                                        \"value\": \"us-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-west-2\",\n-                                        \"displayName\": \"US West (Oregon)\",\n-                                        \"value\": \"us-west-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : aws-cn-global\",\n-                                        \"displayName\": \"aws-cn-global\",\n-                                        \"value\": \"aws-cn-global\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : aws-global\",\n-                                        \"displayName\": \"aws-global\",\n-                                        \"value\": \"aws-global\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : aws-iso-b-global\",\n-                                        \"displayName\": \"aws-iso-b-global\",\n-                                        \"value\": \"aws-iso-b-global\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : aws-iso-global\",\n-                                        \"displayName\": \"aws-iso-global\",\n-                                        \"value\": \"aws-iso-global\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : aws-us-gov-global\",\n-                                        \"displayName\": \"aws-us-gov-global\",\n-                                        \"value\": \"aws-us-gov-global\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"us-west-2\",\n-                                \"description\": \"\",\n-                                \"displayName\": \"Region\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Region\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\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\": \"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\": \"2.0.0-M3\"\n-                                }\n-                            },\n-                            \"awsTaskId\": {\n-                                \"defaultValue\": \"${awsTaskId}\",\n-                                \"description\": \"\",\n-                                \"displayName\": \"AWS Task ID\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"awsTaskId\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"proxy-configuration-service\": {\n-                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests.\",\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\": \"2.0.0-M3\"\n-                                }\n-                            }\n-                        },\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.aws.ml.transcribe.StartAwsTranscribeJob\"\n-                        ],\n-                        \"sideEffectFree\": false,\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"Retrieving results failed for some reason, but the issue is likely to resolve on its own, such as Provisioned Throughput Exceeded or a Throttling failure. It is generally expected to retry this relationship.\",\n-                                \"name\": \"throttled\"\n-                            },\n-                            {\n-                                \"description\": \"The job is currently still being processed\",\n-                                \"name\": \"running\"\n-                            },\n-                            {\n-                                \"description\": \"Upon successful completion, the original FlowFile will be routed to this relationship.\",\n-                                \"name\": \"original\"\n-                            },\n-                            {\n-                                \"description\": \"The job failed, the original FlowFile will be routed to this relationship.\",\n-                                \"name\": \"failure\"\n-                            },\n-                            {\n-                                \"description\": \"Job successfully finished. FlowFile will be routed to this relation.\",\n-                                \"name\": \"success\"\n-                            }\n-                        ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"AWS\",\n-                            \"Amazon\",\n-                            \"ML\",\n-                            \"Machine Learning\",\n-                            \"Transcribe\"\n-                        ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.aws.ml.transcribe.GetAwsTranscribeJobStatus\",\n-                        \"typeDescription\": \"Retrieves the current status of an AWS Transcribe job.\",\n-                        \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"S3 path-style output location of the result.\",\n-                                \"name\": \"outputLocation\"\n-                            }\n-                        ]\n-                    },\n-                    {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-aws-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"f2215c6\"\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-                        \"multiProcessorUseCases\": [],\n-                        \"primaryNodeOnly\": false,\n-                        \"propertyDescriptors\": {\n-                            \"AWS Credentials Provider service\": {\n-                                \"description\": \"The Controller Service that is used to obtain AWS credentials provider\",\n-                                \"displayName\": \"AWS Credentials Provider Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"AWS Credentials Provider service\",\n-                                \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-aws-service-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.processors.aws.credentials.provider.service.AWSCredentialsProviderService\",\n-                                    \"version\": \"2.0.0-M3\"\n-                                }\n-                            },\n-                            \"Communications Timeout\": {\n-                                \"defaultValue\": \"30 secs\",\n-                                \"description\": \"\",\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-                            \"Endpoint Override URL\": {\n-                                \"description\": \"Endpoint URL to use instead of the AWS default including scheme, host, port, and path. The AWS libraries select an endpoint URL based on the AWS region, but this property overrides the selected endpoint URL, allowing use with other S3-compatible endpoints.\",\n-                                \"displayName\": \"Endpoint Override URL\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Endpoint Override URL\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Region\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-gov-east-1\",\n-                                        \"displayName\": \"AWS GovCloud (US-East)\",\n-                                        \"value\": \"us-gov-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-gov-west-1\",\n-                                        \"displayName\": \"AWS GovCloud (US-West)\",\n-                                        \"value\": \"us-gov-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : af-south-1\",\n-                                        \"displayName\": \"Africa (Cape Town)\",\n-                                        \"value\": \"af-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-east-1\",\n-                                        \"displayName\": \"Asia Pacific (Hong Kong)\",\n-                                        \"value\": \"ap-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-south-2\",\n-                                        \"displayName\": \"Asia Pacific (Hyderabad)\",\n-                                        \"value\": \"ap-south-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-3\",\n-                                        \"displayName\": \"Asia Pacific (Jakarta)\",\n-                                        \"value\": \"ap-southeast-3\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-4\",\n-                                        \"displayName\": \"Asia Pacific (Melbourne)\",\n-                                        \"value\": \"ap-southeast-4\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-south-1\",\n-                                        \"displayName\": \"Asia Pacific (Mumbai)\",\n-                                        \"value\": \"ap-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-northeast-3\",\n-                                        \"displayName\": \"Asia Pacific (Osaka)\",\n-                                        \"value\": \"ap-northeast-3\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-northeast-2\",\n-                                        \"displayName\": \"Asia Pacific (Seoul)\",\n-                                        \"value\": \"ap-northeast-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-1\",\n-                                        \"displayName\": \"Asia Pacific (Singapore)\",\n-                                        \"value\": \"ap-southeast-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-2\",\n-                                        \"displayName\": \"Asia Pacific (Sydney)\",\n-                                        \"value\": \"ap-southeast-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-northeast-1\",\n-                                        \"displayName\": \"Asia Pacific (Tokyo)\",\n-                                        \"value\": \"ap-northeast-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ca-central-1\",\n-                                        \"displayName\": \"Canada (Central)\",\n-                                        \"value\": \"ca-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ca-west-1\",\n-                                        \"displayName\": \"Canada West (Calgary)\",\n-                                        \"value\": \"ca-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : cn-north-1\",\n-                                        \"displayName\": \"China (Beijing)\",\n-                                        \"value\": \"cn-north-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : cn-northwest-1\",\n-                                        \"displayName\": \"China (Ningxia)\",\n-                                        \"value\": \"cn-northwest-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-central-1\",\n-                                        \"displayName\": \"Europe (Frankfurt)\",\n-                                        \"value\": \"eu-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-west-1\",\n-                                        \"displayName\": \"Europe (Ireland)\",\n-                                        \"value\": \"eu-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-west-2\",\n-                                        \"displayName\": \"Europe (London)\",\n-                                        \"value\": \"eu-west-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-south-1\",\n-                                        \"displayName\": \"Europe (Milan)\",\n-                                        \"value\": \"eu-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-west-3\",\n-                                        \"displayName\": \"Europe (Paris)\",\n-                                        \"value\": \"eu-west-3\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-south-2\",\n-                                        \"displayName\": \"Europe (Spain)\",\n-                                        \"value\": \"eu-south-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-north-1\",\n-                                        \"displayName\": \"Europe (Stockholm)\",\n-                                        \"value\": \"eu-north-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-central-2\",\n-                                        \"displayName\": \"Europe (Zurich)\",\n-                                        \"value\": \"eu-central-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : il-central-1\",\n-                                        \"displayName\": \"Israel (Tel Aviv)\",\n-                                        \"value\": \"il-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : me-south-1\",\n-                                        \"displayName\": \"Middle East (Bahrain)\",\n-                                        \"value\": \"me-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : me-central-1\",\n-                                        \"displayName\": \"Middle East (UAE)\",\n-                                        \"value\": \"me-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : sa-east-1\",\n-                                        \"displayName\": \"South America (Sao Paulo)\",\n-                                        \"value\": \"sa-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-east-1\",\n-                                        \"displayName\": \"US East (N. Virginia)\",\n-                                        \"value\": \"us-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-east-2\",\n-                                        \"displayName\": \"US East (Ohio)\",\n-                                        \"value\": \"us-east-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-iso-east-1\",\n-                                        \"displayName\": \"US ISO East\",\n-                                        \"value\": \"us-iso-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-iso-west-1\",\n-                                        \"displayName\": \"US ISO WEST\",\n-                                        \"value\": \"us-iso-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-isob-east-1\",\n-                                        \"displayName\": \"US ISOB East (Ohio)\",\n-                                        \"value\": \"us-isob-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-west-1\",\n-                                        \"displayName\": \"US West (N. California)\",\n-                                        \"value\": \"us-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-west-2\",\n-                                        \"displayName\": \"US West (Oregon)\",\n-                                        \"value\": \"us-west-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : aws-cn-global\",\n-                                        \"displayName\": \"aws-cn-global\",\n-                                        \"value\": \"aws-cn-global\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : aws-global\",\n-                                        \"displayName\": \"aws-global\",\n-                                        \"value\": \"aws-global\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : aws-iso-b-global\",\n-                                        \"displayName\": \"aws-iso-b-global\",\n-                                        \"value\": \"aws-iso-b-global\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : aws-iso-global\",\n-                                        \"displayName\": \"aws-iso-global\",\n-                                        \"value\": \"aws-iso-global\"\n+                                        \"propertyDisplayName\": \"SNMP Security Level\",\n+                                        \"propertyName\": \"snmp-security-level\"\n                                     },\n                                     {\n-                                        \"description\": \"AWS Region Code : aws-us-gov-global\",\n-                                        \"displayName\": \"aws-us-gov-global\",\n-                                        \"value\": \"aws-us-gov-global\"\n+                                        \"dependentValues\": [\n+                                            \"usm-security-names\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"USM Users Source\",\n+                                        \"propertyName\": \"snmp-usm-users-source\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"us-west-2\",\n-                                \"description\": \"\",\n-                                \"displayName\": \"Region\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Region\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\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\": \"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\": \"2.0.0-M3\"\n-                                }\n-                            },\n-                            \"json-payload\": {\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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"json-payload\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            }\n-                        },\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.aws.ml.transcribe.GetAwsTranscribeJobStatus\"\n-                        ],\n-                        \"sideEffectFree\": false,\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"FlowFiles are routed to failure relationship\",\n-                                \"name\": \"failure\"\n-                            },\n-                            {\n-                                \"description\": \"FlowFiles are routed to success relationship\",\n-                                \"name\": \"success\"\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-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"AWS\",\n-                            \"Amazon\",\n-                            \"ML\",\n-                            \"Machine Learning\",\n-                            \"Transcribe\"\n-                        ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.aws.ml.transcribe.StartAwsTranscribeJob\",\n-                        \"typeDescription\": \"Trigger a AWS Transcribe job. It should be followed by GetAwsTranscribeStatus processor in order to monitor job status.\",\n-                        \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"The task ID that can be used to poll for Job completion in GetAwsTranscribeJobStatus\",\n-                                \"name\": \"awsTaskId\"\n-                            }\n-                        ]\n-                    },\n-                    {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-aws-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"f2215c6\"\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-                        \"multiProcessorUseCases\": [],\n-                        \"primaryNodeOnly\": false,\n-                        \"propertyDescriptors\": {\n-                            \"AWS Credentials Provider service\": {\n-                                \"description\": \"The Controller Service that is used to obtain AWS credentials provider\",\n-                                \"displayName\": \"AWS Credentials Provider Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"AWS Credentials Provider service\",\n-                                \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-aws-service-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.processors.aws.credentials.provider.service.AWSCredentialsProviderService\",\n-                                    \"version\": \"2.0.0-M3\"\n-                                }\n-                            },\n-                            \"Communications Timeout\": {\n-                                \"defaultValue\": \"30 secs\",\n-                                \"description\": \"\",\n-                                \"displayName\": \"Communications Timeout\",\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\": \"Communications Timeout\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Endpoint Override URL\": {\n-                                \"description\": \"Endpoint URL to use instead of the AWS default including scheme, host, port, and path. The AWS libraries select an endpoint URL based on the AWS region, but this property overrides the selected endpoint URL, allowing use with other S3-compatible endpoints.\",\n-                                \"displayName\": \"Endpoint Override URL\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Endpoint Override URL\",\n+                                \"name\": \"snmp-usm-security-names\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Region\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-gov-east-1\",\n-                                        \"displayName\": \"AWS GovCloud (US-East)\",\n-                                        \"value\": \"us-gov-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-gov-west-1\",\n-                                        \"displayName\": \"AWS GovCloud (US-West)\",\n-                                        \"value\": \"us-gov-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : af-south-1\",\n-                                        \"displayName\": \"Africa (Cape Town)\",\n-                                        \"value\": \"af-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-east-1\",\n-                                        \"displayName\": \"Asia Pacific (Hong Kong)\",\n-                                        \"value\": \"ap-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-south-2\",\n-                                        \"displayName\": \"Asia Pacific (Hyderabad)\",\n-                                        \"value\": \"ap-south-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-3\",\n-                                        \"displayName\": \"Asia Pacific (Jakarta)\",\n-                                        \"value\": \"ap-southeast-3\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-4\",\n-                                        \"displayName\": \"Asia Pacific (Melbourne)\",\n-                                        \"value\": \"ap-southeast-4\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-south-1\",\n-                                        \"displayName\": \"Asia Pacific (Mumbai)\",\n-                                        \"value\": \"ap-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-northeast-3\",\n-                                        \"displayName\": \"Asia Pacific (Osaka)\",\n-                                        \"value\": \"ap-northeast-3\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-northeast-2\",\n-                                        \"displayName\": \"Asia Pacific (Seoul)\",\n-                                        \"value\": \"ap-northeast-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-1\",\n-                                        \"displayName\": \"Asia Pacific (Singapore)\",\n-                                        \"value\": \"ap-southeast-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-2\",\n-                                        \"displayName\": \"Asia Pacific (Sydney)\",\n-                                        \"value\": \"ap-southeast-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-northeast-1\",\n-                                        \"displayName\": \"Asia Pacific (Tokyo)\",\n-                                        \"value\": \"ap-northeast-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ca-central-1\",\n-                                        \"displayName\": \"Canada (Central)\",\n-                                        \"value\": \"ca-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ca-west-1\",\n-                                        \"displayName\": \"Canada West (Calgary)\",\n-                                        \"value\": \"ca-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : cn-north-1\",\n-                                        \"displayName\": \"China (Beijing)\",\n-                                        \"value\": \"cn-north-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : cn-northwest-1\",\n-                                        \"displayName\": \"China (Ningxia)\",\n-                                        \"value\": \"cn-northwest-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-central-1\",\n-                                        \"displayName\": \"Europe (Frankfurt)\",\n-                                        \"value\": \"eu-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-west-1\",\n-                                        \"displayName\": \"Europe (Ireland)\",\n-                                        \"value\": \"eu-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-west-2\",\n-                                        \"displayName\": \"Europe (London)\",\n-                                        \"value\": \"eu-west-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-south-1\",\n-                                        \"displayName\": \"Europe (Milan)\",\n-                                        \"value\": \"eu-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-west-3\",\n-                                        \"displayName\": \"Europe (Paris)\",\n-                                        \"value\": \"eu-west-3\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-south-2\",\n-                                        \"displayName\": \"Europe (Spain)\",\n-                                        \"value\": \"eu-south-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-north-1\",\n-                                        \"displayName\": \"Europe (Stockholm)\",\n-                                        \"value\": \"eu-north-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-central-2\",\n-                                        \"displayName\": \"Europe (Zurich)\",\n-                                        \"value\": \"eu-central-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : il-central-1\",\n-                                        \"displayName\": \"Israel (Tel Aviv)\",\n-                                        \"value\": \"il-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : me-south-1\",\n-                                        \"displayName\": \"Middle East (Bahrain)\",\n-                                        \"value\": \"me-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : me-central-1\",\n-                                        \"displayName\": \"Middle East (UAE)\",\n-                                        \"value\": \"me-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : sa-east-1\",\n-                                        \"displayName\": \"South America (Sao Paulo)\",\n-                                        \"value\": \"sa-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-east-1\",\n-                                        \"displayName\": \"US East (N. Virginia)\",\n-                                        \"value\": \"us-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-east-2\",\n-                                        \"displayName\": \"US East (Ohio)\",\n-                                        \"value\": \"us-east-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-iso-east-1\",\n-                                        \"displayName\": \"US ISO East\",\n-                                        \"value\": \"us-iso-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-iso-west-1\",\n-                                        \"displayName\": \"US ISO WEST\",\n-                                        \"value\": \"us-iso-west-1\"\n-                                    },\n+                            \"snmp-usm-users-file-path\": {\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"AWS Region Code : us-isob-east-1\",\n-                                        \"displayName\": \"US ISOB East (Ohio)\",\n-                                        \"value\": \"us-isob-east-1\"\n+                                        \"dependentValues\": [\n+                                            \"SNMPv3\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"SNMP Version\",\n+                                        \"propertyName\": \"snmp-version\"\n                                     },\n                                     {\n-                                        \"description\": \"AWS Region Code : us-west-1\",\n-                                        \"displayName\": \"US West (N. California)\",\n-                                        \"value\": \"us-west-1\"\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\": \"snmp-usm-users-file-path\",\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-                                        \"description\": \"AWS Region Code : us-west-2\",\n-                                        \"displayName\": \"US West (Oregon)\",\n-                                        \"value\": \"us-west-2\"\n+                                        \"dependentValues\": [\n+                                            \"SNMPv3\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"SNMP Version\",\n+                                        \"propertyName\": \"snmp-version\"\n                                     },\n                                     {\n-                                        \"description\": \"AWS Region Code : aws-cn-global\",\n-                                        \"displayName\": \"aws-cn-global\",\n-                                        \"value\": \"aws-cn-global\"\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\": \"snmp-usm-users-json-content\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"snmp-usm-users-source\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"description\": \"AWS Region Code : aws-global\",\n-                                        \"displayName\": \"aws-global\",\n-                                        \"value\": \"aws-global\"\n+                                        \"description\": \"The JSON containing the USM users\",\n+                                        \"displayName\": \"Json Content\",\n+                                        \"value\": \"usm-json-content\"\n                                     },\n                                     {\n-                                        \"description\": \"AWS Region Code : aws-iso-b-global\",\n-                                        \"displayName\": \"aws-iso-b-global\",\n-                                        \"value\": \"aws-iso-b-global\"\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\": \"AWS Region Code : aws-iso-global\",\n-                                        \"displayName\": \"aws-iso-global\",\n-                                        \"value\": \"aws-iso-global\"\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-                                        \"description\": \"AWS Region Code : aws-us-gov-global\",\n-                                        \"displayName\": \"aws-us-gov-global\",\n-                                        \"value\": \"aws-us-gov-global\"\n+                                        \"dependentValues\": [\n+                                            \"SNMPv3\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"SNMP Version\",\n+                                        \"propertyName\": \"snmp-version\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"us-west-2\",\n-                                \"description\": \"\",\n-                                \"displayName\": \"Region\",\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\": \"Region\",\n+                                \"name\": \"snmp-usm-users-source\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\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+                            \"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\": \"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\": \"2.0.0-M3\"\n-                                }\n-                            },\n-                            \"awsTaskId\": {\n-                                \"defaultValue\": \"${awsTaskId}\",\n-                                \"description\": \"\",\n-                                \"displayName\": \"AWS Task ID\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"awsTaskId\",\n+                                \"name\": \"snmp-version\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n-                            },\n-                            \"proxy-configuration-service\": {\n-                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests.\",\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\": \"2.0.0-M3\"\n-                                }\n                             }\n                         },\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.aws.ml.translate.StartAwsTranslateJob\"\n-                        ],\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"Retrieving results failed for some reason, but the issue is likely to resolve on its own, such as Provisioned Throughput Exceeded or a Throttling failure. It is generally expected to retry this relationship.\",\n-                                \"name\": \"throttled\"\n-                            },\n-                            {\n-                                \"description\": \"The job is currently still being processed\",\n-                                \"name\": \"running\"\n-                            },\n-                            {\n-                                \"description\": \"Upon successful completion, the original FlowFile will be routed to this relationship.\",\n-                                \"name\": \"original\"\n+                                \"description\": \"All FlowFiles that are received from the SNMP agent are routed to this relationship\",\n+                                \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"The job failed, the original FlowFile will be routed to this relationship.\",\n+                                \"description\": \"All FlowFiles that cannot received from the SNMP agent are routed to this relationship\",\n                                 \"name\": \"failure\"\n-                            },\n-                            {\n-                                \"description\": \"Job successfully finished. FlowFile will be routed to this relation.\",\n-                                \"name\": \"success\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"AWS\",\n-                            \"Amazon\",\n-                            \"ML\",\n-                            \"Machine Learning\",\n-                            \"Translate\"\n+                            \"listen\",\n+                            \"snmp\",\n+                            \"trap\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.aws.ml.translate.GetAwsTranslateJobStatus\",\n-                        \"typeDescription\": \"Retrieves the current status of an AWS Translate job.\",\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                         \"useCases\": [],\n                         \"version\": \"2.0.0-M3\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"S3 path-style output location of the result.\",\n-                                \"name\": \"outputLocation\"\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\": true,\n-                        \"artifact\": \"nifi-aws-nar\",\n+                        \"artifact\": \"nifi-snmp-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -86919,349 +88783,484 @@\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                         \"multiProcessorUseCases\": [],\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"AWS Credentials Provider service\": {\n-                                \"description\": \"The Controller Service that is used to obtain AWS credentials provider\",\n-                                \"displayName\": \"AWS Credentials Provider Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"AWS Credentials Provider service\",\n-                                \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-aws-service-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.processors.aws.credentials.provider.service.AWSCredentialsProviderService\",\n-                                    \"version\": \"2.0.0-M3\"\n-                                }\n-                            },\n-                            \"Communications Timeout\": {\n-                                \"defaultValue\": \"30 secs\",\n-                                \"description\": \"\",\n-                                \"displayName\": \"Communications Timeout\",\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\": \"Communications Timeout\",\n+                                \"name\": \"snmp-authentication-passphrase\",\n                                 \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Endpoint Override URL\": {\n-                                \"description\": \"Endpoint URL to use instead of the AWS default including scheme, host, port, and path. The AWS libraries select an endpoint URL based on the AWS region, but this property overrides the selected endpoint URL, allowing use with other S3-compatible endpoints.\",\n-                                \"displayName\": \"Endpoint Override URL\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Endpoint Override URL\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n+                                \"sensitive\": true\n                             },\n-                            \"Region\": {\n+                            \"snmp-authentication-protocol\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"AWS Region Code : us-gov-east-1\",\n-                                        \"displayName\": \"AWS GovCloud (US-East)\",\n-                                        \"value\": \"us-gov-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-gov-west-1\",\n-                                        \"displayName\": \"AWS GovCloud (US-West)\",\n-                                        \"value\": \"us-gov-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : af-south-1\",\n-                                        \"displayName\": \"Africa (Cape Town)\",\n-                                        \"value\": \"af-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-east-1\",\n-                                        \"displayName\": \"Asia Pacific (Hong Kong)\",\n-                                        \"value\": \"ap-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-south-2\",\n-                                        \"displayName\": \"Asia Pacific (Hyderabad)\",\n-                                        \"value\": \"ap-south-2\"\n+                                        \"description\": \"Provides authentication based on the HMAC-MD5 algorithm.\",\n+                                        \"displayName\": \"MD5\",\n+                                        \"value\": \"MD5\"\n                                     },\n                                     {\n-                                        \"description\": \"AWS Region Code : ap-southeast-3\",\n-                                        \"displayName\": \"Asia Pacific (Jakarta)\",\n-                                        \"value\": \"ap-southeast-3\"\n+                                        \"description\": \"Provides authentication based on the HMAC-SHA algorithm.\",\n+                                        \"displayName\": \"SHA\",\n+                                        \"value\": \"SHA\"\n                                     },\n                                     {\n-                                        \"description\": \"AWS Region Code : ap-southeast-4\",\n-                                        \"displayName\": \"Asia Pacific (Melbourne)\",\n-                                        \"value\": \"ap-southeast-4\"\n+                                        \"description\": \"Provides authentication based on the HMAC-SHA-2 algorithm.\",\n+                                        \"displayName\": \"SHA224\",\n+                                        \"value\": \"HMAC128SHA224\"\n                                     },\n                                     {\n-                                        \"description\": \"AWS Region Code : ap-south-1\",\n-                                        \"displayName\": \"Asia Pacific (Mumbai)\",\n-                                        \"value\": \"ap-south-1\"\n+                                        \"description\": \"Provides authentication based on the HMAC-SHA-2 algorithm.\",\n+                                        \"displayName\": \"SHA256\",\n+                                        \"value\": \"HMAC192SHA256\"\n                                     },\n                                     {\n-                                        \"description\": \"AWS Region Code : ap-northeast-3\",\n-                                        \"displayName\": \"Asia Pacific (Osaka)\",\n-                                        \"value\": \"ap-northeast-3\"\n+                                        \"description\": \"Provides authentication based on the HMAC-SHA-2 algorithm.\",\n+                                        \"displayName\": \"SHA384\",\n+                                        \"value\": \"HMAC256SHA384\"\n                                     },\n                                     {\n-                                        \"description\": \"AWS Region Code : ap-northeast-2\",\n-                                        \"displayName\": \"Asia Pacific (Seoul)\",\n-                                        \"value\": \"ap-northeast-2\"\n-                                    },\n+                                        \"description\": \"Provides authentication based on the HMAC-SHA-2 algorithm.\",\n+                                        \"displayName\": \"SHA512\",\n+                                        \"value\": \"HMAC384SHA512\"\n+                                    }\n+                                ],\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"AWS Region Code : ap-southeast-1\",\n-                                        \"displayName\": \"Asia Pacific (Singapore)\",\n-                                        \"value\": \"ap-southeast-1\"\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\": \"snmp-authentication-protocol\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"snmp-community\": {\n+                                \"defaultValue\": \"public\",\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"AWS Region Code : ap-southeast-2\",\n-                                        \"displayName\": \"Asia Pacific (Sydney)\",\n-                                        \"value\": \"ap-southeast-2\"\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\": \"snmp-community\",\n+                                \"required\": true,\n+                                \"sensitive\": true\n+                            },\n+                            \"snmp-private-protocol\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"description\": \"AWS Region Code : ap-northeast-1\",\n-                                        \"displayName\": \"Asia Pacific (Tokyo)\",\n-                                        \"value\": \"ap-northeast-1\"\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\": \"AWS Region Code : ca-central-1\",\n-                                        \"displayName\": \"Canada (Central)\",\n-                                        \"value\": \"ca-central-1\"\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\": \"AWS Region Code : ca-west-1\",\n-                                        \"displayName\": \"Canada West (Calgary)\",\n-                                        \"value\": \"ca-west-1\"\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\": \"AWS Region Code : cn-north-1\",\n-                                        \"displayName\": \"China (Beijing)\",\n-                                        \"value\": \"cn-north-1\"\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\": \"AWS Region Code : cn-northwest-1\",\n-                                        \"displayName\": \"China (Ningxia)\",\n-                                        \"value\": \"cn-northwest-1\"\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-                                        \"description\": \"AWS Region Code : eu-central-1\",\n-                                        \"displayName\": \"Europe (Frankfurt)\",\n-                                        \"value\": \"eu-central-1\"\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\": \"snmp-private-protocol\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"snmp-private-protocol-passphrase\": {\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"AWS Region Code : eu-west-1\",\n-                                        \"displayName\": \"Europe (Ireland)\",\n-                                        \"value\": \"eu-west-1\"\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+                                \"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+                                \"allowableValues\": [\n                                     {\n-                                        \"description\": \"AWS Region Code : eu-west-2\",\n-                                        \"displayName\": \"Europe (London)\",\n-                                        \"value\": \"eu-west-2\"\n+                                        \"description\": \"Communication without authentication and privacy.\",\n+                                        \"displayName\": \"noAuthNoPriv\",\n+                                        \"value\": \"noAuthNoPriv\"\n                                     },\n                                     {\n-                                        \"description\": \"AWS Region Code : eu-south-1\",\n-                                        \"displayName\": \"Europe (Milan)\",\n-                                        \"value\": \"eu-south-1\"\n+                                        \"description\": \"Communication with authentication and without privacy.\",\n+                                        \"displayName\": \"authNoPriv\",\n+                                        \"value\": \"authNoPriv\"\n                                     },\n                                     {\n-                                        \"description\": \"AWS Region Code : eu-west-3\",\n-                                        \"displayName\": \"Europe (Paris)\",\n-                                        \"value\": \"eu-west-3\"\n-                                    },\n+                                        \"description\": \"Communication with authentication and privacy.\",\n+                                        \"displayName\": \"authPriv\",\n+                                        \"value\": \"authPriv\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"noAuthNoPriv\",\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"AWS Region Code : eu-south-2\",\n-                                        \"displayName\": \"Europe (Spain)\",\n-                                        \"value\": \"eu-south-2\"\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\": \"snmp-security-level\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"snmp-security-name\": {\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"AWS Region Code : eu-north-1\",\n-                                        \"displayName\": \"Europe (Stockholm)\",\n-                                        \"value\": \"eu-north-1\"\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\": \"snmp-security-name\",\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"snmp-timeout\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"snmp-trap-agent-address\": {\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"AWS Region Code : eu-central-2\",\n-                                        \"displayName\": \"Europe (Zurich)\",\n-                                        \"value\": \"eu-central-2\"\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\": \"Environment variables 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-                                        \"description\": \"AWS Region Code : il-central-1\",\n-                                        \"displayName\": \"Israel (Tel Aviv)\",\n-                                        \"value\": \"il-central-1\"\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\": \"Environment variables 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\": \"AWS Region Code : me-south-1\",\n-                                        \"displayName\": \"Middle East (Bahrain)\",\n-                                        \"value\": \"me-south-1\"\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\": \"AWS Region Code : me-central-1\",\n-                                        \"displayName\": \"Middle East (UAE)\",\n-                                        \"value\": \"me-central-1\"\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\": \"AWS Region Code : sa-east-1\",\n-                                        \"displayName\": \"South America (Sao Paulo)\",\n-                                        \"value\": \"sa-east-1\"\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\": \"AWS Region Code : us-east-1\",\n-                                        \"displayName\": \"US East (N. Virginia)\",\n-                                        \"value\": \"us-east-1\"\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\": \"AWS Region Code : us-east-2\",\n-                                        \"displayName\": \"US East (Ohio)\",\n-                                        \"value\": \"us-east-2\"\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\": \"AWS Region Code : us-iso-east-1\",\n-                                        \"displayName\": \"US ISO East\",\n-                                        \"value\": \"us-iso-east-1\"\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\": \"AWS Region Code : us-iso-west-1\",\n-                                        \"displayName\": \"US ISO WEST\",\n-                                        \"value\": \"us-iso-west-1\"\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\": \"AWS Region Code : us-isob-east-1\",\n-                                        \"displayName\": \"US ISOB East (Ohio)\",\n-                                        \"value\": \"us-isob-east-1\"\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-                                        \"description\": \"AWS Region Code : us-west-1\",\n-                                        \"displayName\": \"US West (N. California)\",\n-                                        \"value\": \"us-west-1\"\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\": \"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\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"snmp-trap-manager-host\",\n+                                \"required\": true,\n+                                \"sensitive\": false\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables 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-                                        \"description\": \"AWS Region Code : us-west-2\",\n-                                        \"displayName\": \"US West (Oregon)\",\n-                                        \"value\": \"us-west-2\"\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"snmp-trap-oid-value\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"snmp-trap-specific-type\": {\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"AWS Region Code : aws-cn-global\",\n-                                        \"displayName\": \"aws-cn-global\",\n-                                        \"value\": \"aws-cn-global\"\n+                                        \"dependentValues\": [\n+                                            \"6\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Generic Trap Type\",\n+                                        \"propertyName\": \"snmp-trap-generic-type\"\n                                     },\n                                     {\n-                                        \"description\": \"AWS Region Code : aws-global\",\n-                                        \"displayName\": \"aws-global\",\n-                                        \"value\": \"aws-global\"\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\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"snmp-trap-specific-type\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"snmp-version\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"description\": \"AWS Region Code : aws-iso-b-global\",\n-                                        \"displayName\": \"aws-iso-b-global\",\n-                                        \"value\": \"aws-iso-b-global\"\n+                                        \"description\": \"SNMP version 1\",\n+                                        \"displayName\": \"v1\",\n+                                        \"value\": \"SNMPv1\"\n                                     },\n                                     {\n-                                        \"description\": \"AWS Region Code : aws-iso-global\",\n-                                        \"displayName\": \"aws-iso-global\",\n-                                        \"value\": \"aws-iso-global\"\n+                                        \"description\": \"SNMP version 2c\",\n+                                        \"displayName\": \"v2c\",\n+                                        \"value\": \"SNMPv2c\"\n                                     },\n                                     {\n-                                        \"description\": \"AWS Region Code : aws-us-gov-global\",\n-                                        \"displayName\": \"aws-us-gov-global\",\n-                                        \"value\": \"aws-us-gov-global\"\n+                                        \"description\": \"SNMP version 3 with improved security\",\n+                                        \"displayName\": \"v3\",\n+                                        \"value\": \"SNMPv3\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"us-west-2\",\n-                                \"description\": \"\",\n-                                \"displayName\": \"Region\",\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\": \"Region\",\n+                                \"name\": \"snmp-version\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n-                            },\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\": \"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\": \"2.0.0-M3\"\n-                                }\n-                            },\n-                            \"json-payload\": {\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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"json-payload\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n                             }\n                         },\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.aws.ml.translate.GetAwsTranslateJobStatus\"\n-                        ],\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"FlowFiles are routed to failure relationship\",\n-                                \"name\": \"failure\"\n-                            },\n-                            {\n-                                \"description\": \"FlowFiles are routed to success 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\": \"Upon successful completion, the original FlowFile will be routed to this relationship.\",\n-                                \"name\": \"original\"\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                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"AWS\",\n-                            \"Amazon\",\n-                            \"ML\",\n-                            \"Machine Learning\",\n-                            \"Translate\"\n+                            \"send\",\n+                            \"snmp\",\n+                            \"trap\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.aws.ml.translate.StartAwsTranslateJob\",\n-                        \"typeDescription\": \"Trigger a AWS Translate job. It should be followed by GetAwsTranslateJobStatus processor in order to monitor job status.\",\n+                        \"type\": \"org.apache.nifi.snmp.processors.SendTrapSNMP\",\n+                        \"typeDescription\": \"Sends information to SNMP Manager.\",\n                         \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"The task ID that can be used to poll for Job completion in GetAwsTranslateJobStatus\",\n-                                \"name\": \"awsTaskId\"\n-                            }\n-                        ]\n+                        \"version\": \"2.0.0-M3\"\n                     },\n                     {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-aws-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-snmp-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -87274,1920 +89273,2835 @@\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"multiProcessorUseCases\": [],\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"AWS Credentials Provider service\": {\n-                                \"description\": \"The Controller Service that is used to obtain AWS credentials provider\",\n-                                \"displayName\": \"AWS Credentials Provider Service\",\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\": \"AWS Credentials Provider service\",\n+                                \"name\": \"snmp-authentication-passphrase\",\n                                 \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-aws-service-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.processors.aws.credentials.provider.service.AWSCredentialsProviderService\",\n-                                    \"version\": \"2.0.0-M3\"\n-                                }\n+                                \"sensitive\": true\n                             },\n-                            \"Bucket\": {\n-                                \"defaultValue\": \"${s3.bucket}\",\n-                                \"description\": \"The S3 Bucket to interact with\",\n-                                \"displayName\": \"Bucket\",\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                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Bucket\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"snmp-authentication-protocol\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Communications Timeout\": {\n-                                \"defaultValue\": \"30 secs\",\n-                                \"description\": \"The amount of time to wait in order to establish a connection to AWS or receive data from AWS before timing out.\",\n-                                \"displayName\": \"Communications Timeout\",\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\": \"Communications Timeout\",\n+                                \"name\": \"snmp-community\",\n                                 \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Endpoint Override URL\": {\n-                                \"description\": \"Endpoint URL to use instead of the AWS default including scheme, host, port, and path. The AWS libraries select an endpoint URL based on the AWS region, but this property overrides the selected endpoint URL, allowing use with other S3-compatible endpoints.\",\n-                                \"displayName\": \"Endpoint Override URL\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Endpoint Override URL\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"FullControl User List\": {\n-                                \"defaultValue\": \"${s3.permissions.full.users}\",\n-                                \"description\": \"A comma-separated list of Amazon User ID's or E-mail addresses that specifies who should have Full Control for an object\",\n-                                \"displayName\": \"FullControl User List\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"FullControl User List\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n+                                \"sensitive\": true\n                             },\n-                            \"Object Key\": {\n-                                \"defaultValue\": \"${filename}\",\n-                                \"description\": \"The S3 Object Key to use. This is analogous to a filename for traditional file systems.\",\n-                                \"displayName\": \"Object Key\",\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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Object Key\",\n+                                \"name\": \"snmp-hostname\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Owner\": {\n-                                \"defaultValue\": \"${s3.owner}\",\n-                                \"description\": \"The Amazon ID to use for the object's owner\",\n-                                \"displayName\": \"Owner\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Owner\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Read ACL User List\": {\n-                                \"defaultValue\": \"${s3.permissions.readacl.users}\",\n-                                \"description\": \"A comma-separated list of Amazon User ID's or E-mail addresses that specifies who should have permissions to read the Access Control List for an object\",\n-                                \"displayName\": \"Read ACL User List\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Read ACL User List\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Read Permission User List\": {\n-                                \"defaultValue\": \"${s3.permissions.read.users}\",\n-                                \"description\": \"A comma-separated list of Amazon User ID's or E-mail addresses that specifies who should have Read Access for an object\",\n-                                \"displayName\": \"Read Permission User List\",\n+                            \"snmp-port\": {\n+                                \"defaultValue\": \"161\",\n+                                \"description\": \"Port of the SNMP Agent.\",\n+                                \"displayName\": \"SNMP Agent Port\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Read Permission User List\",\n-                                \"required\": false,\n+                                \"name\": \"snmp-port\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Region\": {\n+                            \"snmp-private-protocol\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"AWS Region Code : us-gov-west-1\",\n-                                        \"displayName\": \"AWS GovCloud (US)\",\n-                                        \"value\": \"us-gov-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-gov-east-1\",\n-                                        \"displayName\": \"AWS GovCloud (US-East)\",\n-                                        \"value\": \"us-gov-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-east-1\",\n-                                        \"displayName\": \"US East (N. Virginia)\",\n-                                        \"value\": \"us-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-east-2\",\n-                                        \"displayName\": \"US East (Ohio)\",\n-                                        \"value\": \"us-east-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-west-1\",\n-                                        \"displayName\": \"US West (N. California)\",\n-                                        \"value\": \"us-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-west-2\",\n-                                        \"displayName\": \"US West (Oregon)\",\n-                                        \"value\": \"us-west-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-west-1\",\n-                                        \"displayName\": \"EU (Ireland)\",\n-                                        \"value\": \"eu-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-west-2\",\n-                                        \"displayName\": \"EU (London)\",\n-                                        \"value\": \"eu-west-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-west-3\",\n-                                        \"displayName\": \"EU (Paris)\",\n-                                        \"value\": \"eu-west-3\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-central-1\",\n-                                        \"displayName\": \"EU (Frankfurt)\",\n-                                        \"value\": \"eu-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-central-2\",\n-                                        \"displayName\": \"EU (Zurich)\",\n-                                        \"value\": \"eu-central-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-north-1\",\n-                                        \"displayName\": \"EU (Stockholm)\",\n-                                        \"value\": \"eu-north-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-south-1\",\n-                                        \"displayName\": \"EU (Milan)\",\n-                                        \"value\": \"eu-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-south-2\",\n-                                        \"displayName\": \"EU (Spain)\",\n-                                        \"value\": \"eu-south-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-east-1\",\n-                                        \"displayName\": \"Asia Pacific (Hong Kong)\",\n-                                        \"value\": \"ap-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-south-1\",\n-                                        \"displayName\": \"Asia Pacific (Mumbai)\",\n-                                        \"value\": \"ap-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-south-2\",\n-                                        \"displayName\": \"Asia Pacific (Hyderabad)\",\n-                                        \"value\": \"ap-south-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-1\",\n-                                        \"displayName\": \"Asia Pacific (Singapore)\",\n-                                        \"value\": \"ap-southeast-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-2\",\n-                                        \"displayName\": \"Asia Pacific (Sydney)\",\n-                                        \"value\": \"ap-southeast-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-3\",\n-                                        \"displayName\": \"Asia Pacific (Jakarta)\",\n-                                        \"value\": \"ap-southeast-3\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-4\",\n-                                        \"displayName\": \"Asia Pacific (Melbourne)\",\n-                                        \"value\": \"ap-southeast-4\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-northeast-1\",\n-                                        \"displayName\": \"Asia Pacific (Tokyo)\",\n-                                        \"value\": \"ap-northeast-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-northeast-2\",\n-                                        \"displayName\": \"Asia Pacific (Seoul)\",\n-                                        \"value\": \"ap-northeast-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-northeast-3\",\n-                                        \"displayName\": \"Asia Pacific (Osaka)\",\n-                                        \"value\": \"ap-northeast-3\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : sa-east-1\",\n-                                        \"displayName\": \"South America (Sao Paulo)\",\n-                                        \"value\": \"sa-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : cn-north-1\",\n-                                        \"displayName\": \"China (Beijing)\",\n-                                        \"value\": \"cn-north-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : cn-northwest-1\",\n-                                        \"displayName\": \"China (Ningxia)\",\n-                                        \"value\": \"cn-northwest-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ca-central-1\",\n-                                        \"displayName\": \"Canada (Central)\",\n-                                        \"value\": \"ca-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ca-west-1\",\n-                                        \"displayName\": \"Canada West (Calgary)\",\n-                                        \"value\": \"ca-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : me-central-1\",\n-                                        \"displayName\": \"Middle East (UAE)\",\n-                                        \"value\": \"me-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : me-south-1\",\n-                                        \"displayName\": \"Middle East (Bahrain)\",\n-                                        \"value\": \"me-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : af-south-1\",\n-                                        \"displayName\": \"Africa (Cape Town)\",\n-                                        \"value\": \"af-south-1\"\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\": \"AWS Region Code : us-iso-east-1\",\n-                                        \"displayName\": \"US ISO East\",\n-                                        \"value\": \"us-iso-east-1\"\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\": \"AWS Region Code : us-isob-east-1\",\n-                                        \"displayName\": \"US ISOB East (Ohio)\",\n-                                        \"value\": \"us-isob-east-1\"\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\": \"AWS Region Code : us-iso-west-1\",\n-                                        \"displayName\": \"US ISO West\",\n-                                        \"value\": \"us-iso-west-1\"\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\": \"AWS Region Code : il-central-1\",\n-                                        \"displayName\": \"Israel (Tel Aviv)\",\n-                                        \"value\": \"il-central-1\"\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-                                        \"description\": \"Uses 's3.region' FlowFile attribute as region.\",\n-                                        \"displayName\": \"Use 's3.region' Attribute\",\n-                                        \"value\": \"attribute-defined-region\"\n+                                        \"dependentValues\": [\n+                                            \"authPriv\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"SNMP Security Level\",\n+                                        \"propertyName\": \"snmp-security-level\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"us-west-2\",\n-                                \"description\": \"The AWS Region to connect to.\",\n-                                \"displayName\": \"Region\",\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\": \"Region\",\n+                                \"name\": \"snmp-private-protocol\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\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+                            \"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+                                \"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-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n-                                    \"version\": \"2.0.0-M3\"\n-                                }\n+                                \"sensitive\": false\n                             },\n-                            \"Signer Override\": {\n+                            \"snmp-security-level\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Default Signature\",\n-                                        \"value\": \"Default Signature\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Signature Version 4\",\n-                                        \"value\": \"AWSS3V4SignerType\"\n+                                        \"description\": \"Communication without authentication and privacy.\",\n+                                        \"displayName\": \"noAuthNoPriv\",\n+                                        \"value\": \"noAuthNoPriv\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Signature Version 2\",\n-                                        \"value\": \"S3SignerType\"\n+                                        \"description\": \"Communication with authentication and without privacy.\",\n+                                        \"displayName\": \"authNoPriv\",\n+                                        \"value\": \"authNoPriv\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Custom Signature\",\n-                                        \"value\": \"CustomSignerType\"\n+                                        \"description\": \"Communication with authentication and privacy.\",\n+                                        \"displayName\": \"authPriv\",\n+                                        \"value\": \"authPriv\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"Default Signature\",\n-                                \"description\": \"The AWS S3 library uses Signature Version 4 by default but this property allows you to specify the Version 2 signer to support older S3-compatible services or even to plug in your own custom signer implementation.\",\n-                                \"displayName\": \"Signer Override\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Signer Override\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Version\": {\n-                                \"description\": \"The Version of the Object to delete\",\n-                                \"displayName\": \"Version\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Version\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Write ACL User List\": {\n-                                \"defaultValue\": \"${s3.permissions.writeacl.users}\",\n-                                \"description\": \"A comma-separated list of Amazon User ID's or E-mail addresses that specifies who should have permissions to change the Access Control List for an object\",\n-                                \"displayName\": \"Write ACL User List\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Write ACL User List\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Write Permission User List\": {\n-                                \"defaultValue\": \"${s3.permissions.write.users}\",\n-                                \"description\": \"A comma-separated list of Amazon User ID's or E-mail addresses that specifies who should have Write Access for an object\",\n-                                \"displayName\": \"Write Permission User List\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Write Permission User List\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"custom-signer-class-name\": {\n+                                \"defaultValue\": \"noAuthNoPriv\",\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"CustomSignerType\"\n+                                            \"SNMPv3\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Signer Override\",\n-                                        \"propertyName\": \"Signer Override\"\n+                                        \"propertyDisplayName\": \"SNMP Version\",\n+                                        \"propertyName\": \"snmp-version\"\n                                     }\n                                 ],\n-                                \"description\": \"Fully qualified class name of the custom signer class. The signer must implement com.amazonaws.auth.Signer interface.\",\n-                                \"displayName\": \"Custom Signer Class Name\",\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"custom-signer-class-name\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"snmp-security-level\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"custom-signer-module-location\": {\n+                            \"snmp-security-name\": {\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"CustomSignerType\"\n+                                            \"SNMPv3\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Signer Override\",\n-                                        \"propertyName\": \"Signer Override\"\n+                                        \"propertyDisplayName\": \"SNMP Version\",\n+                                        \"propertyName\": \"snmp-version\"\n                                     }\n                                 ],\n-                                \"description\": \"Comma-separated list of paths to files and/or directories which contain the custom signer's JAR file and its dependencies (if any).\",\n-                                \"displayName\": \"Custom Signer Module Location\",\n+                                \"description\": \"User name used for SNMP v3 Authentication.\",\n+                                \"displayName\": \"SNMP Security Name\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"custom-signer-module-location\",\n-                                \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"MULTIPLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\",\n-                                        \"DIRECTORY\"\n-                                    ]\n-                                },\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"snmp-security-name\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"proxy-configuration-service\": {\n-                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests.\",\n-                                \"displayName\": \"Proxy Configuration Service\",\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\": \"proxy-configuration-service\",\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.proxy.ProxyConfigurationService\",\n-                                    \"version\": \"2.0.0-M3\"\n-                                }\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"snmp-version\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             }\n                         },\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.aws.s3.FetchS3Object\",\n-                            \"org.apache.nifi.processors.aws.s3.ListS3\",\n-                            \"org.apache.nifi.processors.aws.s3.PutS3Object\"\n-                        ],\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"FlowFiles are routed to this Relationship after they have been successfully processed.\",\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\": \"If the Processor is unable to process a given FlowFile, it will be routed to this Relationship.\",\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                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"AWS\",\n-                            \"Amazon\",\n-                            \"Archive\",\n-                            \"Delete\",\n-                            \"S3\"\n+                            \"oid\",\n+                            \"set\",\n+                            \"snmp\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.aws.s3.DeleteS3Object\",\n-                        \"typeDescription\": \"Deletes a file from an Amazon S3 Bucket. If attempting to delete a file that does not exist, FlowFile is routed to success.\",\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                         \"useCases\": [],\n                         \"version\": \"2.0.0-M3\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"The class name of the exception thrown during processor execution\",\n-                                \"name\": \"s3.exception\"\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 S3 supplied detail from the failed operation\",\n-                                \"name\": \"s3.additionalDetails\"\n+                                \"description\": \"Denotes the variable binding in which the error occured.\",\n+                                \"name\": \"snmp$errorIndex\"\n                             },\n                             {\n-                                \"description\": \"The HTTP error code (if available) from the failed operation\",\n-                                \"name\": \"s3.statusCode\"\n+                                \"description\": \"The snmp4j error status of the PDU.\",\n+                                \"name\": \"snmp$errorStatus\"\n                             },\n                             {\n-                                \"description\": \"The S3 moniker of the failed operation\",\n-                                \"name\": \"s3.errorCode\"\n+                                \"description\": \"The description of error status.\",\n+                                \"name\": \"snmp$errorStatusText\"\n                             },\n                             {\n-                                \"description\": \"The S3 exception message from the failed operation\",\n-                                \"name\": \"s3.errorMessage\"\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\": \"2.0.0-M3\"\n+        },\n+        {\n+            \"artifact\": \"nifi-pgp-service-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-aws-nar\",\n+                        \"artifact\": \"nifi-pgp-service-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-pgp-service-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"f2215c6\"\n                         },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n-                        \"multiProcessorUseCases\": [\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"keyring-file\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            }\n+                        },\n+                        \"providedApiImplementations\": [\n                             {\n-                                \"configurations\": [\n+                                \"artifact\": \"nifi-pgp-service-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.pgp.service.api.PGPPublicKeyService\",\n+                                \"version\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\n+                    }\n+                ],\n+                \"processors\": [],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"2.0.0-M3\"\n+        },\n+        {\n+            \"artifact\": \"nifi-azure-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-azure-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"f2215c6\"\n+                        },\n+                        \"group\": \"org.apache.nifi\",\n+                        \"propertyDescriptors\": {\n+                            \"credential-configuration-strategy\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"configuration\": \"The \\\"Bucket\\\" property should be set to the name of the S3 bucket that files reside in. If the flow being built is to be reused elsewhere, it's a good idea to parameterize     this property by setting it to something like `#{S3_SOURCE_BUCKET}`.\\nThe \\\"Region\\\" property must be set to denote the S3 region that the Bucket resides in. If the flow being built is to be reused elsewhere, it's a good idea to parameterize     this property by setting it to something like `#{S3_SOURCE_REGION}`.\\n\\nThe \\\"AWS Credentials Provider service\\\" property should specify an instance of the AWSCredentialsProviderControllerService in order to provide credentials for accessing the bucket.\\n\\nThe 'success' Relationship of this Processor is then connected to FetchS3Object.\\n\",\n-                                        \"processorClassName\": \"org.apache.nifi.processors.aws.s3.ListS3\"\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-                                        \"configuration\": \"\\\"Bucket\\\" = \\\"${s3.bucket}\\\"\\n\\\"Object Key\\\" = \\\"${filename}\\\"\\n\\nThe \\\"AWS Credentials Provider service\\\" property should specify an instance of the AWSCredentialsProviderControllerService in order to provide credentials for accessing the bucket.\\n\\nThe \\\"Region\\\" property must be set to the same value as the \\\"Region\\\" property of the ListS3 Processor.\\n\",\n-                                        \"processorClassName\": \"org.apache.nifi.processors.aws.s3.FetchS3Object\"\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\": \"Retrieve all files in an S3 bucket\",\n-                                \"keywords\": [\n-                                    \"s3\",\n-                                    \"state\",\n-                                    \"retrieve\",\n-                                    \"fetch\",\n-                                    \"all\",\n-                                    \"stream\"\n-                                ],\n-                                \"notes\": \"\"\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+                            \"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-                                \"configurations\": [\n+                                \"artifact\": \"nifi-azure-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.services.azure.AzureCredentialsService\",\n+                                \"version\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-azure-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"f2215c6\"\n+                        },\n+                        \"group\": \"org.apache.nifi\",\n+                        \"propertyDescriptors\": {\n+                            \"azure-cosmos-db-consistency-level\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"configuration\": \"The \\\"Bucket\\\" property should be set to the name of the S3 bucket that files reside in. If the flow being built is to be reused elsewhere, it's a good idea to parameterize     this property by setting it to something like `#{S3_SOURCE_BUCKET}`.\\nThe \\\"Region\\\" property must be set to denote the S3 region that the Bucket resides in. If the flow being built is to be reused elsewhere, it's a good idea to parameterize     this property by setting it to something like `#{S3_SOURCE_REGION}`.\\n\\nThe \\\"AWS Credentials Provider service\\\" property should specify an instance of the AWSCredentialsProviderControllerService in order to provide credentials for accessing the bucket.\\n\\nThe 'success' Relationship of this Processor is then connected to RouteOnAttribute.\\n\",\n-                                        \"processorClassName\": \"org.apache.nifi.processors.aws.s3.ListS3\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"STRONG\",\n+                                        \"value\": \"STRONG\"\n                                     },\n                                     {\n-                                        \"configuration\": \"If you would like to \\\"OR\\\" together all of the conditions (i.e., the file should be retrieved if any of the conditions are met), set \\\"Routing Strategy\\\" to \\\"Route to 'matched' if any matches\\\".\\nIf you would like to \\\"AND\\\" together all of the conditions (i.e., the file should only be retrieved if all of the conditions are met), set \\\"Routing Strategy\\\" to \\\"Route to 'matched' if all match\\\".\\n\\nFor each condition that you would like to filter on, add a new property. The name of the property should describe the condition. The value of the property should be an Expression Language expression that returns `true` if the file meets the condition or `false` if the file does not meet the condition.\\n\\nSome attributes that you may consider filtering on are:\\n- `filename` (the name of the file)\\n- `s3.length` (the number of bytes in the file)\\n- `s3.tag.<tag name>` (the value of the s3 tag with the name `tag name`)\\n- `s3.user.metadata.<key name>` (the value of the user metadata with the key named `key name`)\\n\\nFor example, to fetch only files that are at least 1 MB and have a filename ending in `.zip` we would set the following properties:\\n- \\\"Routing Strategy\\\" = \\\"Route to 'matched' if all match\\\"\\n- \\\"At least 1 MB\\\" = \\\"${s3.length:ge(1000000)}\\\"\\n- \\\"Ends in .zip\\\" = \\\"${filename:endsWith('.zip')}\\\"\\n\\nAuto-terminate the `unmatched` Relationship.\\nConnect the `matched` Relationship to the FetchS3Object processor.\\n\",\n-                                        \"processorClassName\": \"org.apache.nifi.processors.standard.RouteOnAttribute\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"BOUNDED_STALENESS\",\n+                                        \"value\": \"BOUNDED_STALENESS\"\n                                     },\n                                     {\n-                                        \"configuration\": \"\\\"Bucket\\\" = \\\"${s3.bucket}\\\"\\n\\\"Object Key\\\" = \\\"${filename}\\\"\\n\\nThe \\\"AWS Credentials Provider service\\\" property should specify an instance of the AWSCredentialsProviderControllerService in order to provide credentials for accessing the bucket.\\n\\nThe \\\"Region\\\" property must be set to the same value as the \\\"Region\\\" property of the ListS3 Processor.\\n\",\n-                                        \"processorClassName\": \"org.apache.nifi.processors.aws.s3.FetchS3Object\"\n-                                    }\n-                                ],\n-                                \"description\": \"Retrieve only files from S3 that meet some specified criteria\",\n-                                \"keywords\": [\n-                                    \"s3\",\n-                                    \"state\",\n-                                    \"retrieve\",\n-                                    \"filter\",\n-                                    \"select\",\n-                                    \"fetch\",\n-                                    \"criteria\"\n-                                ],\n-                                \"notes\": \"\"\n-                            },\n-                            {\n-                                \"configurations\": [\n-                                    {\n-                                        \"configuration\": \"The \\\"Queue URL\\\" must be set to the appropriate URL for the SQS queue. It is recommended that this property be parameterized, using a value such as `#{SQS_QUEUE_URL}`.\\nThe \\\"Region\\\" property must be set to denote the SQS region that the queue resides in. It's a good idea to parameterize this property by setting it to something like `#{SQS_REGION}`.\\n\\nThe \\\"AWS Credentials Provider service\\\" property should specify an instance of the AWSCredentialsProviderControllerService in order to provide credentials for accessing the bucket.\\n\\nThe 'success' relationship is connected to EvaluateJsonPath.\\n\",\n-                                        \"processorClassName\": \"org.apache.nifi.processors.aws.sqs.GetSQS\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SESSION\",\n+                                        \"value\": \"SESSION\"\n                                     },\n                                     {\n-                                        \"configuration\": \"\\\"Destination\\\" = \\\"flowfile-attribute\\\"\\n\\\"s3.bucket\\\" = \\\"$.Records[0].s3.bucket.name\\\"\\n\\\"filename\\\" = \\\"$.Records[0].s3.object.key\\\"\\n\\nThe 'success' relationship is connected to FetchS3Object.\\n\",\n-                                        \"processorClassName\": \"org.apache.nifi.processors.standard.EvaluateJsonPath\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"CONSISTENT_PREFIX\",\n+                                        \"value\": \"CONSISTENT_PREFIX\"\n                                     },\n                                     {\n-                                        \"configuration\": \"\\\"Bucket\\\" = \\\"${s3.bucket}\\\"\\n\\\"Object Key\\\" = \\\"${filename}\\\"\\n\\nThe \\\"Region\\\" property must be set to the same value as the \\\"Region\\\" property of the GetSQS Processor.\\nThe \\\"AWS Credentials Provider service\\\" property should specify an instance of the AWSCredentialsProviderControllerService in order to provide credentials for accessing the bucket.\\n\",\n-                                        \"processorClassName\": \"org.apache.nifi.processors.aws.s3.FetchS3Object\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"EVENTUAL\",\n+                                        \"value\": \"EVENTUAL\"\n                                     }\n                                 ],\n-                                \"description\": \"Retrieve new files as they arrive in an S3 bucket\",\n-                                \"keywords\": [],\n-                                \"notes\": \"This method of retrieving files from S3 is more efficient than using ListS3 and more cost effective. It is the pattern recommended by AWS. However, it does require that the S3 bucket be configured to place notifications on an SQS queue when new files arrive. For more information, see https://docs.aws.amazon.com/AmazonS3/latest/userguide/ways-to-add-notification-config-to-bucket.html\"\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\": \"azure-cosmos-db-consistency-level\",\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"azure-cosmos-db-key\",\n+                                \"required\": false,\n+                                \"sensitive\": true\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\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\": \"2.0.0-M3\"\n                             }\n                         ],\n-                        \"primaryNodeOnly\": false,\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\": \"2.0.0-M3\"\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-azure-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"f2215c6\"\n+                        },\n+                        \"group\": \"org.apache.nifi\",\n                         \"propertyDescriptors\": {\n-                            \"AWS Credentials Provider service\": {\n-                                \"description\": \"The Controller Service that is used to obtain AWS credentials provider\",\n-                                \"displayName\": \"AWS Credentials Provider Service\",\n+                            \"Application Client ID\": {\n+                                \"description\": \"Azure Data Explorer Application Client Identifier for Authentication\",\n+                                \"displayName\": \"Application Client ID\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"AWS Credentials Provider service\",\n+                                \"name\": \"Application Client ID\",\n                                 \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-aws-service-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.processors.aws.credentials.provider.service.AWSCredentialsProviderService\",\n-                                    \"version\": \"2.0.0-M3\"\n-                                }\n+                                \"sensitive\": false\n                             },\n-                            \"Bucket\": {\n-                                \"defaultValue\": \"${s3.bucket}\",\n-                                \"description\": \"The S3 Bucket to interact with\",\n-                                \"displayName\": \"Bucket\",\n+                            \"Application Key\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"APPLICATION_CREDENTIALS\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Authentication Strategy\",\n+                                        \"propertyName\": \"Authentication Strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"Azure Data Explorer Application Key for Authentication\",\n+                                \"displayName\": \"Application Key\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Bucket\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Application Key\",\n                                 \"required\": true,\n-                                \"sensitive\": false\n+                                \"sensitive\": true\n                             },\n-                            \"Communications Timeout\": {\n-                                \"defaultValue\": \"30 secs\",\n-                                \"description\": \"The amount of time to wait in order to establish a connection to AWS or receive data from AWS before timing out.\",\n-                                \"displayName\": \"Communications Timeout\",\n+                            \"Application Tenant ID\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"APPLICATION_CREDENTIALS\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Authentication Strategy\",\n+                                        \"propertyName\": \"Authentication Strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"Azure Data Explorer Application Tenant Identifier for Authentication\",\n+                                \"displayName\": \"Application Tenant ID\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Communications Timeout\",\n+                                \"name\": \"Application Tenant ID\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Endpoint Override URL\": {\n-                                \"description\": \"Endpoint URL to use instead of the AWS default including scheme, host, port, and path. The AWS libraries select an endpoint URL based on the AWS region, but this property overrides the selected endpoint URL, allowing use with other S3-compatible endpoints.\",\n-                                \"displayName\": \"Endpoint Override URL\",\n+                            \"Authentication Strategy\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Azure Application Registration with Application Key\",\n+                                        \"displayName\": \"Application Credentials\",\n+                                        \"value\": \"APPLICATION_CREDENTIALS\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Azure Managed Identity\",\n+                                        \"displayName\": \"Managed Identity\",\n+                                        \"value\": \"MANAGED_IDENTITY\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"MANAGED_IDENTITY\",\n+                                \"description\": \"Authentication method for access to Azure Data Explorer\",\n+                                \"displayName\": \"Authentication Strategy\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Endpoint Override URL\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Authentication Strategy\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Object Key\": {\n-                                \"defaultValue\": \"${filename}\",\n-                                \"description\": \"The S3 Object Key to use. This is analogous to a filename for traditional file systems.\",\n-                                \"displayName\": \"Object Key\",\n+                            \"Cluster URI\": {\n+                                \"description\": \"Azure Data Explorer Cluster URI\",\n+                                \"displayName\": \"Cluster URI\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Object Key\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Cluster URI\",\n+                                \"required\": true,\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.data.explorer.KustoIngestService\",\n+                                \"version\": \"2.0.0-M3\"\n+                            }\n+                        ],\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"ADX\",\n+                            \"Azure\",\n+                            \"Data\",\n+                            \"Explorer\",\n+                            \"Kusto\",\n+                            \"azure\",\n+                            \"ingest\"\n+                        ],\n+                        \"type\": \"org.apache.nifi.services.azure.data.explorer.StandardKustoIngestService\",\n+                        \"typeDescription\": \"Sends batches of flowfile content or stream flowfile content to an Azure ADX cluster.\",\n+                        \"version\": \"2.0.0-M3\"\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-azure-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"f2215c6\"\n+                        },\n+                        \"group\": \"org.apache.nifi\",\n+                        \"propertyDescriptors\": {\n+                            \"Application Client ID\": {\n+                                \"description\": \"Azure Data Explorer Application Client Identifier for Authentication\",\n+                                \"displayName\": \"Application Client ID\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Application Client ID\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Region\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-gov-west-1\",\n-                                        \"displayName\": \"AWS GovCloud (US)\",\n-                                        \"value\": \"us-gov-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-gov-east-1\",\n-                                        \"displayName\": \"AWS GovCloud (US-East)\",\n-                                        \"value\": \"us-gov-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-east-1\",\n-                                        \"displayName\": \"US East (N. Virginia)\",\n-                                        \"value\": \"us-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-east-2\",\n-                                        \"displayName\": \"US East (Ohio)\",\n-                                        \"value\": \"us-east-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-west-1\",\n-                                        \"displayName\": \"US West (N. California)\",\n-                                        \"value\": \"us-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-west-2\",\n-                                        \"displayName\": \"US West (Oregon)\",\n-                                        \"value\": \"us-west-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-west-1\",\n-                                        \"displayName\": \"EU (Ireland)\",\n-                                        \"value\": \"eu-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-west-2\",\n-                                        \"displayName\": \"EU (London)\",\n-                                        \"value\": \"eu-west-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-west-3\",\n-                                        \"displayName\": \"EU (Paris)\",\n-                                        \"value\": \"eu-west-3\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-central-1\",\n-                                        \"displayName\": \"EU (Frankfurt)\",\n-                                        \"value\": \"eu-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-central-2\",\n-                                        \"displayName\": \"EU (Zurich)\",\n-                                        \"value\": \"eu-central-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-north-1\",\n-                                        \"displayName\": \"EU (Stockholm)\",\n-                                        \"value\": \"eu-north-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-south-1\",\n-                                        \"displayName\": \"EU (Milan)\",\n-                                        \"value\": \"eu-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-south-2\",\n-                                        \"displayName\": \"EU (Spain)\",\n-                                        \"value\": \"eu-south-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-east-1\",\n-                                        \"displayName\": \"Asia Pacific (Hong Kong)\",\n-                                        \"value\": \"ap-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-south-1\",\n-                                        \"displayName\": \"Asia Pacific (Mumbai)\",\n-                                        \"value\": \"ap-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-south-2\",\n-                                        \"displayName\": \"Asia Pacific (Hyderabad)\",\n-                                        \"value\": \"ap-south-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-1\",\n-                                        \"displayName\": \"Asia Pacific (Singapore)\",\n-                                        \"value\": \"ap-southeast-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-2\",\n-                                        \"displayName\": \"Asia Pacific (Sydney)\",\n-                                        \"value\": \"ap-southeast-2\"\n-                                    },\n+                            \"Application Key\": {\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"AWS Region Code : ap-southeast-3\",\n-                                        \"displayName\": \"Asia Pacific (Jakarta)\",\n-                                        \"value\": \"ap-southeast-3\"\n-                                    },\n+                                        \"dependentValues\": [\n+                                            \"APPLICATION_CREDENTIALS\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Authentication Strategy\",\n+                                        \"propertyName\": \"Authentication Strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"Azure Data Explorer Application Key for Authentication\",\n+                                \"displayName\": \"Application Key\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Application Key\",\n+                                \"required\": true,\n+                                \"sensitive\": true\n+                            },\n+                            \"Application Tenant ID\": {\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"AWS Region Code : ap-southeast-4\",\n-                                        \"displayName\": \"Asia Pacific (Melbourne)\",\n-                                        \"value\": \"ap-southeast-4\"\n-                                    },\n+                                        \"dependentValues\": [\n+                                            \"APPLICATION_CREDENTIALS\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Authentication Strategy\",\n+                                        \"propertyName\": \"Authentication Strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"Azure Data Explorer Application Tenant Identifier for Authentication\",\n+                                \"displayName\": \"Application Tenant ID\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Application Tenant ID\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Authentication Strategy\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"description\": \"AWS Region Code : ap-northeast-1\",\n-                                        \"displayName\": \"Asia Pacific (Tokyo)\",\n-                                        \"value\": \"ap-northeast-1\"\n+                                        \"description\": \"Azure Application Registration with Application Key\",\n+                                        \"displayName\": \"Application Credentials\",\n+                                        \"value\": \"APPLICATION_CREDENTIALS\"\n                                     },\n                                     {\n-                                        \"description\": \"AWS Region Code : ap-northeast-2\",\n-                                        \"displayName\": \"Asia Pacific (Seoul)\",\n-                                        \"value\": \"ap-northeast-2\"\n-                                    },\n+                                        \"description\": \"Azure Managed Identity\",\n+                                        \"displayName\": \"Managed Identity\",\n+                                        \"value\": \"MANAGED_IDENTITY\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"MANAGED_IDENTITY\",\n+                                \"description\": \"Authentication method for access to Azure Data Explorer\",\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+                            \"Cluster URI\": {\n+                                \"description\": \"Azure Data Explorer Cluster URI\",\n+                                \"displayName\": \"Cluster URI\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Cluster URI\",\n+                                \"required\": true,\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.data.explorer.KustoQueryService\",\n+                                \"version\": \"2.0.0-M3\"\n+                            }\n+                        ],\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"ADX\",\n+                            \"Azure\",\n+                            \"Data\",\n+                            \"Explorer\",\n+                            \"Kusto\"\n+                        ],\n+                        \"type\": \"org.apache.nifi.services.azure.data.explorer.StandardKustoQueryService\",\n+                        \"typeDescription\": \"Standard implementation of Kusto Query Service for Azure Data Explorer\",\n+                        \"version\": \"2.0.0-M3\"\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-azure-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"f2215c6\"\n+                        },\n+                        \"group\": \"org.apache.nifi\",\n+                        \"propertyDescriptors\": {\n+                            \"Authentication Strategy\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"description\": \"AWS Region Code : ap-northeast-3\",\n-                                        \"displayName\": \"Asia Pacific (Osaka)\",\n-                                        \"value\": \"ap-northeast-3\"\n+                                        \"description\": \"Azure Event Hub shared access key\",\n+                                        \"displayName\": \"Shared Access Key\",\n+                                        \"value\": \"SHARED_ACCESS_KEY\"\n                                     },\n                                     {\n-                                        \"description\": \"AWS Region Code : sa-east-1\",\n-                                        \"displayName\": \"South America (Sao Paulo)\",\n-                                        \"value\": \"sa-east-1\"\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+                            \"Event Hub Name\": {\n+                                \"description\": \"Provides the Event Hub Name for connections\",\n+                                \"displayName\": \"Event Hub Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Event Hub Name\",\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Event Hub Namespace\",\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Partition Key\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Service Bus Endpoint\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"description\": \"AWS Region Code : cn-north-1\",\n-                                        \"displayName\": \"China (Beijing)\",\n-                                        \"value\": \"cn-north-1\"\n+                                        \"description\": \"Default Service Bus Endpoint\",\n+                                        \"displayName\": \"Azure\",\n+                                        \"value\": \".servicebus.windows.net\"\n                                     },\n                                     {\n-                                        \"description\": \"AWS Region Code : cn-northwest-1\",\n-                                        \"displayName\": \"China (Ningxia)\",\n-                                        \"value\": \"cn-northwest-1\"\n+                                        \"description\": \"China Service Bus Endpoint\",\n+                                        \"displayName\": \"Azure China\",\n+                                        \"value\": \".servicebus.chinacloudapi.cn\"\n                                     },\n                                     {\n-                                        \"description\": \"AWS Region Code : ca-central-1\",\n-                                        \"displayName\": \"Canada (Central)\",\n-                                        \"value\": \"ca-central-1\"\n+                                        \"description\": \"Germany Service Bus Endpoint\",\n+                                        \"displayName\": \"Azure Germany\",\n+                                        \"value\": \".servicebus.cloudapi.de\"\n                                     },\n                                     {\n-                                        \"description\": \"AWS Region Code : ca-west-1\",\n-                                        \"displayName\": \"Canada West (Calgary)\",\n-                                        \"value\": \"ca-west-1\"\n-                                    },\n+                                        \"description\": \"United States Government Endpoint\",\n+                                        \"displayName\": \"Azure US Government\",\n+                                        \"value\": \".servicebus.usgovcloudapi.net\"\n+                                    }\n+                                ],\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\": \"Service Bus Endpoint\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Shared Access Policy\": {\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"AWS Region Code : me-central-1\",\n-                                        \"displayName\": \"Middle East (UAE)\",\n-                                        \"value\": \"me-central-1\"\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\": \"Shared Access Policy\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Shared Access Policy Key\": {\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"AWS Region Code : me-south-1\",\n-                                        \"displayName\": \"Middle East (Bahrain)\",\n-                                        \"value\": \"me-south-1\"\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\": \"Shared Access Policy Key\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n+                            },\n+                            \"Transport Type\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"description\": \"AWS Region Code : af-south-1\",\n-                                        \"displayName\": \"Africa (Cape Town)\",\n-                                        \"value\": \"af-south-1\"\n+                                        \"description\": \"AMQP over TCP on ports 5671 and 5672\",\n+                                        \"displayName\": \"AMQP\",\n+                                        \"value\": \"Amqp\"\n                                     },\n                                     {\n-                                        \"description\": \"AWS Region Code : us-iso-east-1\",\n-                                        \"displayName\": \"US ISO East\",\n-                                        \"value\": \"us-iso-east-1\"\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+                            },\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\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\n+                    },\n+                    {\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-azure-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"f2215c6\"\n+                        },\n+                        \"group\": \"org.apache.nifi\",\n+                        \"propertyDescriptors\": {\n+                            \"credentials-type\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"description\": \"AWS Region Code : us-isob-east-1\",\n-                                        \"displayName\": \"US ISOB East (Ohio)\",\n-                                        \"value\": \"us-isob-east-1\"\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\": \"AWS Region Code : us-iso-west-1\",\n-                                        \"displayName\": \"US ISO West\",\n-                                        \"value\": \"us-iso-west-1\"\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\": \"AWS Region Code : il-central-1\",\n-                                        \"displayName\": \"Israel (Tel Aviv)\",\n-                                        \"value\": \"il-central-1\"\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\": \"Uses 's3.region' FlowFile attribute as region.\",\n-                                        \"displayName\": \"Use 's3.region' Attribute\",\n-                                        \"value\": \"attribute-defined-region\"\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\": \"us-west-2\",\n-                                \"description\": \"The AWS Region to connect to.\",\n-                                \"displayName\": \"Region\",\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\": \"Region\",\n+                                \"name\": \"credentials-type\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\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+                            \"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\": \"SSL Context Service\",\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\": \"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\": \"2.0.0-M3\"\n                                 }\n                             },\n-                            \"Signer Override\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Default Signature\",\n-                                        \"value\": \"Default Signature\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Signature Version 4\",\n-                                        \"value\": \"AWSS3V4SignerType\"\n-                                    },\n+                            \"service-principal-client-id\": {\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Signature Version 2\",\n-                                        \"value\": \"S3SignerType\"\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.\",\n+                                \"displayName\": \"Service Principal Client ID\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"service-principal-client-id\",\n+                                \"required\": true,\n+                                \"sensitive\": true\n+                            },\n+                            \"service-principal-client-secret\": {\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Custom Signature\",\n-                                        \"value\": \"CustomSignerType\"\n+                                        \"dependentValues\": [\n+                                            \"SERVICE_PRINCIPAL\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Credentials Type\",\n+                                        \"propertyName\": \"credentials-type\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"Default Signature\",\n-                                \"description\": \"The AWS S3 library uses Signature Version 4 by default but this property allows you to specify the Version 2 signer to support older S3-compatible services or even to plug in your own custom signer implementation.\",\n-                                \"displayName\": \"Signer Override\",\n+                                \"description\": \"Password of the Client/Application.\",\n+                                \"displayName\": \"Service Principal Client Secret\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Signer Override\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n+                                \"name\": \"service-principal-client-secret\",\n+                                \"required\": true,\n+                                \"sensitive\": true\n                             },\n-                            \"Version\": {\n-                                \"description\": \"The Version of the Object to download\",\n-                                \"displayName\": \"Version\",\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.\",\n+                                \"displayName\": \"Service Principal Tenant ID\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Version\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"service-principal-tenant-id\",\n+                                \"required\": true,\n+                                \"sensitive\": true\n                             },\n-                            \"custom-signer-class-name\": {\n+                            \"storage-account-key\": {\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"CustomSignerType\"\n+                                            \"ACCOUNT_KEY\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Signer Override\",\n-                                        \"propertyName\": \"Signer Override\"\n+                                        \"propertyDisplayName\": \"Credentials Type\",\n+                                        \"propertyName\": \"credentials-type\"\n                                     }\n                                 ],\n-                                \"description\": \"Fully qualified class name of the custom signer class. The signer must implement com.amazonaws.auth.Signer interface.\",\n-                                \"displayName\": \"Custom Signer Class Name\",\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, Managed Identity or Service Principal 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\": \"Account Key\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"storage-account-key\",\n+                                \"required\": true,\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\": \"Environment variables 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\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"custom-signer-class-name\",\n+                                \"name\": \"storage-endpoint-suffix\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"custom-signer-module-location\": {\n+                            \"storage-sas-token\": {\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"CustomSignerType\"\n+                                            \"SAS_TOKEN\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Signer Override\",\n-                                        \"propertyName\": \"Signer Override\"\n+                                        \"propertyDisplayName\": \"Credentials Type\",\n+                                        \"propertyName\": \"credentials-type\"\n                                     }\n                                 ],\n-                                \"description\": \"Comma-separated list of paths to files and/or directories which contain the custom signer's JAR file and its dependencies (if any).\",\n-                                \"displayName\": \"Custom Signer Module Location\",\n+                                \"description\": \"Shared Access Signature token (the leading '?' may be included) 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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"custom-signer-module-location\",\n-                                \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"MULTIPLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\",\n-                                        \"DIRECTORY\"\n-                                    ]\n-                                },\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\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.ADLSCredentialsService\",\n+                                \"version\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-azure-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"f2215c6\"\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\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-azure-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"f2215c6\"\n+                        },\n+                        \"group\": \"org.apache.nifi\",\n+                        \"propertyDescriptors\": {\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\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"blob-name\",\n+                                \"required\": true,\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+                            \"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\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"container-name\",\n+                                \"required\": true,\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\": \"encryption-service\",\n-                                \"required\": false,\n+                                \"name\": \"storage-credentials-service\",\n+                                \"required\": true,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-aws-service-api-nar\",\n+                                    \"artifact\": \"nifi-azure-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.processors.aws.s3.AmazonS3EncryptionService\",\n+                                    \"type\": \"org.apache.nifi.services.azure.storage.AzureStorageCredentialsService_v12\",\n                                     \"version\": \"2.0.0-M3\"\n                                 }\n-                            },\n-                            \"proxy-configuration-service\": {\n-                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests.\",\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.fileresource.service.api.FileResourceService\",\n+                                \"version\": \"2.0.0-M3\"\n+                            }\n+                        ],\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.azure.storage.FetchAzureBlobStorage_v12\"\n+                        ],\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"azure\",\n+                            \"blob\",\n+                            \"cloud\",\n+                            \"file\",\n+                            \"microsoft\",\n+                            \"resource\",\n+                            \"storage\"\n+                        ],\n+                        \"type\": \"org.apache.nifi.services.azure.storage.AzureBlobStorageFileResourceService\",\n+                        \"typeDescription\": \"Provides an Azure Blob Storage file resource for other components.\",\n+                        \"version\": \"2.0.0-M3\"\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-azure-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"f2215c6\"\n+                        },\n+                        \"group\": \"org.apache.nifi\",\n+                        \"propertyDescriptors\": {\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\": \"proxy-configuration-service\",\n-                                \"required\": false,\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.proxy.ProxyConfigurationService\",\n+                                    \"type\": \"org.apache.nifi.services.azure.storage.ADLSCredentialsService\",\n                                     \"version\": \"2.0.0-M3\"\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+                            \"directory-name\": {\n+                                \"defaultValue\": \"${azure.directory}\",\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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"range-length\",\n-                                \"required\": false,\n+                                \"name\": \"directory-name\",\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+                            \"file-name\": {\n+                                \"defaultValue\": \"${azure.filename}\",\n+                                \"description\": \"The filename\",\n+                                \"displayName\": \"File Name\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"range-start\",\n-                                \"required\": false,\n+                                \"name\": \"file-name\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"requester-pays\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Indicates that the requester consents to pay any charges associated with retrieving objects from the S3 bucket.\",\n-                                        \"displayName\": \"True\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Does not consent to pay requester charges for retrieving objects from the S3 bucket.\",\n-                                        \"displayName\": \"False\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"If true, indicates that the requester consents to pay any charges associated with retrieving objects from the S3 bucket.  This sets the 'x-amz-request-payer' header to 'requester'.\",\n-                                \"displayName\": \"Requester Pays\",\n+                            \"filesystem-name\": {\n+                                \"defaultValue\": \"${azure.filesystem}\",\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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"requester-pays\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"filesystem-name\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.aws.s3.DeleteS3Object\",\n-                            \"org.apache.nifi.processors.aws.s3.ListS3\",\n-                            \"org.apache.nifi.processors.aws.s3.PutS3Object\"\n-                        ],\n-                        \"sideEffectFree\": false,\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"FlowFiles are routed to this Relationship after they have been successfully processed.\",\n-                                \"name\": \"success\"\n-                            },\n+                        \"providedApiImplementations\": [\n                             {\n-                                \"description\": \"If the Processor is unable to process a given FlowFile, 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.fileresource.service.api.FileResourceService\",\n+                                \"version\": \"2.0.0-M3\"\n                             }\n                         ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.azure.storage.FetchAzureDataLakeStorage\"\n                         ],\n-                        \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"AWS\",\n-                            \"Amazon\",\n-                            \"Fetch\",\n-                            \"Get\",\n-                            \"S3\"\n+                            \"adlsgen2\",\n+                            \"azure\",\n+                            \"cloud\",\n+                            \"datalake\",\n+                            \"file\",\n+                            \"microsoft\",\n+                            \"resource\",\n+                            \"storage\"\n                         ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.aws.s3.FetchS3Object\",\n-                        \"typeDescription\": \"Retrieves the contents of an S3 Object and writes it to the content of a FlowFile\",\n-                        \"useCases\": [\n+                        \"type\": \"org.apache.nifi.services.azure.storage.AzureDataLakeStorageFileResourceService\",\n+                        \"typeDescription\": \"Provides an Azure Data Lake Storage (ADLS) file resource for other components.\",\n+                        \"version\": \"2.0.0-M3\"\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-azure-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"f2215c6\"\n+                        },\n+                        \"dynamicProperties\": [\n                             {\n-                                \"configuration\": \"The \\\"Bucket\\\" property should be set to the name of the S3 bucket that contains the file. Typically this is defined as an attribute on an incoming FlowFile, so this property is set to `${s3.bucket}`.\\nThe \\\"Object Key\\\" property denotes the fully qualified filename of the file to fetch. Typically, the FlowFile's `filename` attribute is used, so this property is set to `${filename}`.\\nThe \\\"Region\\\" property must be set to denote the S3 region that the Bucket resides in. If the flow being built is to be reused elsewhere, it's a good idea to parameterize this property by setting it to something like `#{S3_REGION}`.\\n\\nThe \\\"AWS Credentials Provider service\\\" property should specify an instance of the AWSCredentialsProviderControllerService in order to provide credentials for accessing the file.\\n\",\n-                                \"description\": \"Fetch a specific file from S3\",\n-                                \"keywords\": [],\n-                                \"notes\": \"\"\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-                        \"version\": \"2.0.0-M3\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"The URL that can be used to access the S3 object\",\n-                                \"name\": \"s3.url\"\n-                            },\n-                            {\n-                                \"description\": \"The name of the S3 bucket\",\n-                                \"name\": \"s3.bucket\"\n-                            },\n-                            {\n-                                \"description\": \"The path of the file\",\n-                                \"name\": \"path\"\n-                            },\n-                            {\n-                                \"description\": \"The path of the file\",\n-                                \"name\": \"absolute.path\"\n-                            },\n-                            {\n-                                \"description\": \"The name of the file\",\n-                                \"name\": \"filename\"\n-                            },\n-                            {\n-                                \"description\": \"The MD5 sum of the file\",\n-                                \"name\": \"hash.value\"\n-                            },\n-                            {\n-                                \"description\": \"MD5\",\n-                                \"name\": \"hash.algorithm\"\n-                            },\n-                            {\n-                                \"description\": \"If S3 provides the content type/MIME type, this attribute will hold that file\",\n-                                \"name\": \"mime.type\"\n-                            },\n-                            {\n-                                \"description\": \"The ETag that can be used to see if the file has changed\",\n-                                \"name\": \"s3.etag\"\n-                            },\n+                        \"group\": \"org.apache.nifi\",\n+                        \"providedApiImplementations\": [\n                             {\n-                                \"description\": \"The class name of the exception thrown during processor execution\",\n-                                \"name\": \"s3.exception\"\n+                                \"artifact\": \"nifi-azure-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.services.azure.storage.AzureStorageCredentialsService_v12\",\n+                                \"version\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-azure-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"f2215c6\"\n+                        },\n+                        \"group\": \"org.apache.nifi\",\n+                        \"propertyDescriptors\": {\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-                            {\n-                                \"description\": \"The S3 supplied detail from the failed operation\",\n-                                \"name\": \"s3.additionalDetails\"\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-                            {\n-                                \"description\": \"The HTTP error code (if available) from the failed operation\",\n-                                \"name\": \"s3.statusCode\"\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\": \"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\": \"2.0.0-M3\"\n+                                }\n                             },\n-                            {\n-                                \"description\": \"The S3 moniker of the failed operation\",\n-                                \"name\": \"s3.errorCode\"\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.\",\n+                                \"displayName\": \"Service Principal Client ID\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"service-principal-client-id\",\n+                                \"required\": true,\n+                                \"sensitive\": true\n                             },\n-                            {\n-                                \"description\": \"The S3 exception message from the failed operation\",\n-                                \"name\": \"s3.errorMessage\"\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.\",\n+                                \"displayName\": \"Service Principal Client Secret\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"service-principal-client-secret\",\n+                                \"required\": true,\n+                                \"sensitive\": true\n                             },\n-                            {\n-                                \"description\": \"If the file has an expiration date, this attribute will be set, containing the milliseconds since epoch in UTC time\",\n-                                \"name\": \"s3.expirationTime\"\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.\",\n+                                \"displayName\": \"Service Principal Tenant ID\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"service-principal-tenant-id\",\n+                                \"required\": true,\n+                                \"sensitive\": true\n                             },\n-                            {\n-                                \"description\": \"The ID of the rule that dictates this object's expiration time\",\n-                                \"name\": \"s3.expirationTimeRuleId\"\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, Managed Identity or Service Principal instead for fine-grained control with policies.\",\n+                                \"displayName\": \"Account Key\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"storage-account-key\",\n+                                \"required\": true,\n+                                \"sensitive\": true\n                             },\n-                            {\n-                                \"description\": \"The server side encryption algorithm of the object\",\n-                                \"name\": \"s3.sseAlgorithm\"\n+                            \"storage-account-name\": {\n+                                \"description\": \"The storage account name.\",\n+                                \"displayName\": \"Storage Account Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"storage-account-name\",\n+                                \"required\": true,\n+                                \"sensitive\": true\n                             },\n-                            {\n-                                \"description\": \"The version of the S3 object\",\n-                                \"name\": \"s3.version\"\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\": \"storage-endpoint-suffix\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             },\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 (the leading '?' may be included)\",\n+                                \"displayName\": \"SAS Token\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"storage-sas-token\",\n+                                \"required\": true,\n+                                \"sensitive\": true\n+                            }\n+                        },\n+                        \"providedApiImplementations\": [\n                             {\n-                                \"description\": \"The name of the encryption strategy that was used to store the S3 object (if it is encrypted)\",\n-                                \"name\": \"s3.encryptionStrategy\"\n+                                \"artifact\": \"nifi-azure-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.services.azure.storage.AzureStorageCredentialsService_v12\",\n+                                \"version\": \"2.0.0-M3\"\n                             }\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_v12\",\n+                        \"typeDescription\": \"Provides credentials for Azure Storage processors using Azure Storage client library v12.\",\n+                        \"version\": \"2.0.0-M3\"\n+                    }\n+                ],\n+                \"processors\": [\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-aws-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-azure-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\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+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"multiProcessorUseCases\": [],\n-                        \"primaryNodeOnly\": true,\n+                        \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"AWS Credentials Provider service\": {\n-                                \"description\": \"The Controller Service that is used to obtain AWS credentials provider\",\n-                                \"displayName\": \"AWS Credentials Provider Service\",\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\": \"AWS Credentials Provider service\",\n-                                \"required\": true,\n+                                \"name\": \"azure-cosmos-db-conflict-handling-strategy\",\n+                                \"required\": false,\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+                                \"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-aws-service-api-nar\",\n+                                    \"artifact\": \"nifi-azure-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.processors.aws.credentials.provider.service.AWSCredentialsProviderService\",\n+                                    \"type\": \"org.apache.nifi.services.azure.cosmos.AzureCosmosDBConnectionService\",\n                                     \"version\": \"2.0.0-M3\"\n                                 }\n                             },\n-                            \"Bucket\": {\n-                                \"description\": \"The S3 Bucket to interact with\",\n-                                \"displayName\": \"Bucket\",\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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Bucket\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"azure-cosmos-db-consistency-level\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Communications Timeout\": {\n-                                \"defaultValue\": \"30 secs\",\n-                                \"description\": \"The amount of time to wait in order to establish a connection to AWS or receive data from AWS before timing out.\",\n-                                \"displayName\": \"Communications Timeout\",\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\": \"Communications Timeout\",\n+                                \"name\": \"azure-cosmos-db-container-id\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Endpoint Override URL\": {\n-                                \"description\": \"Endpoint URL to use instead of the AWS default including scheme, host, port, and path. The AWS libraries select an endpoint URL based on the AWS region, but this property overrides the selected endpoint URL, allowing use with other S3-compatible endpoints.\",\n-                                \"displayName\": \"Endpoint Override URL\",\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Endpoint Override URL\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"azure-cosmos-db-key\",\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-                            \"Listing Batch Size\": {\n-                                \"defaultValue\": \"100\",\n-                                \"description\": \"If not using a Record Writer, this property dictates how many S3 objects should be listed in a single batch. Once this number is reached, the FlowFiles that have been created will be transferred out of the Processor. Setting this value lower may result in lower latency by sending out the FlowFiles before the complete listing has finished. However, it can significantly reduce performance. Larger values may take more memory to store all of the information before sending the FlowFiles out. This property is ignored if using a Record Writer, as one of the main benefits of the Record Writer is being able to emit the entire listing as a single FlowFile.\",\n-                                \"displayName\": \"Listing 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\": \"Listing Batch Size\",\n+                                \"name\": \"azure-cosmos-db-partition-key\",\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\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-                            \"Region\": {\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\": \"2.0.0-M3\"\n+                                }\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+                            {\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+                        ],\n+                        \"supportsBatching\": false,\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": 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+                            \"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.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+                        \"useCases\": [],\n+                        \"version\": \"2.0.0-M3\"\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-azure-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"f2215c6\"\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+                        \"multiProcessorUseCases\": [],\n+                        \"primaryNodeOnly\": false,\n+                        \"propertyDescriptors\": {\n+                            \"Data Format\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"AWS Region Code : us-gov-west-1\",\n-                                        \"displayName\": \"AWS GovCloud (US)\",\n-                                        \"value\": \"us-gov-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-gov-east-1\",\n-                                        \"displayName\": \"AWS GovCloud (US-East)\",\n-                                        \"value\": \"us-gov-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-east-1\",\n-                                        \"displayName\": \"US East (N. Virginia)\",\n-                                        \"value\": \"us-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-east-2\",\n-                                        \"displayName\": \"US East (Ohio)\",\n-                                        \"value\": \"us-east-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-west-1\",\n-                                        \"displayName\": \"US West (N. California)\",\n-                                        \"value\": \"us-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-west-2\",\n-                                        \"displayName\": \"US West (Oregon)\",\n-                                        \"value\": \"us-west-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-west-1\",\n-                                        \"displayName\": \"EU (Ireland)\",\n-                                        \"value\": \"eu-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-west-2\",\n-                                        \"displayName\": \"EU (London)\",\n-                                        \"value\": \"eu-west-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-west-3\",\n-                                        \"displayName\": \"EU (Paris)\",\n-                                        \"value\": \"eu-west-3\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-central-1\",\n-                                        \"displayName\": \"EU (Frankfurt)\",\n-                                        \"value\": \"eu-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-central-2\",\n-                                        \"displayName\": \"EU (Zurich)\",\n-                                        \"value\": \"eu-central-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-north-1\",\n-                                        \"displayName\": \"EU (Stockholm)\",\n-                                        \"value\": \"eu-north-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-south-1\",\n-                                        \"displayName\": \"EU (Milan)\",\n-                                        \"value\": \"eu-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-south-2\",\n-                                        \"displayName\": \"EU (Spain)\",\n-                                        \"value\": \"eu-south-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-east-1\",\n-                                        \"displayName\": \"Asia Pacific (Hong Kong)\",\n-                                        \"value\": \"ap-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-south-1\",\n-                                        \"displayName\": \"Asia Pacific (Mumbai)\",\n-                                        \"value\": \"ap-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-south-2\",\n-                                        \"displayName\": \"Asia Pacific (Hyderabad)\",\n-                                        \"value\": \"ap-south-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-1\",\n-                                        \"displayName\": \"Asia Pacific (Singapore)\",\n-                                        \"value\": \"ap-southeast-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-2\",\n-                                        \"displayName\": \"Asia Pacific (Sydney)\",\n-                                        \"value\": \"ap-southeast-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-3\",\n-                                        \"displayName\": \"Asia Pacific (Jakarta)\",\n-                                        \"value\": \"ap-southeast-3\"\n+                                        \"description\": \"An Avro format with support for logical types and for the snappy compression codec\",\n+                                        \"displayName\": \"avro\",\n+                                        \"value\": \"avro\"\n                                     },\n                                     {\n-                                        \"description\": \"AWS Region Code : ap-southeast-4\",\n-                                        \"displayName\": \"Asia Pacific (Melbourne)\",\n-                                        \"value\": \"ap-southeast-4\"\n+                                        \"description\": \"An Avro format with support for logical types and for the snappy compression codec.\",\n+                                        \"displayName\": \"apacheavro\",\n+                                        \"value\": \"apacheavro\"\n                                     },\n                                     {\n-                                        \"description\": \"AWS Region Code : ap-northeast-1\",\n-                                        \"displayName\": \"Asia Pacific (Tokyo)\",\n-                                        \"value\": \"ap-northeast-1\"\n+                                        \"description\": \"A text file with comma-separated values (,). For more information, see RFC 4180: Common Format and MIME Type for Comma-Separated Values (CSV) Files.\",\n+                                        \"displayName\": \"csv\",\n+                                        \"value\": \"csv\"\n                                     },\n                                     {\n-                                        \"description\": \"AWS Region Code : ap-northeast-2\",\n-                                        \"displayName\": \"Asia Pacific (Seoul)\",\n-                                        \"value\": \"ap-northeast-2\"\n+                                        \"description\": \"A text file containing JSON objects separated by \\\\n or \\\\r\\\\n. For more information, see JSON Lines (JSONL).\",\n+                                        \"displayName\": \"json\",\n+                                        \"value\": \"json\"\n                                     },\n                                     {\n-                                        \"description\": \"AWS Region Code : ap-northeast-3\",\n-                                        \"displayName\": \"Asia Pacific (Osaka)\",\n-                                        \"value\": \"ap-northeast-3\"\n+                                        \"description\": \"A text file containing a JSON array of property containers (each representing a record) or any number of property containers separated by spaces, \\\\n or \\\\r\\\\n. Each property container may be spread across multiple lines. This format is preferable to JSON unless the data is not property containers.\",\n+                                        \"displayName\": \"multijson\",\n+                                        \"value\": \"multijson\"\n                                     },\n                                     {\n-                                        \"description\": \"AWS Region Code : sa-east-1\",\n-                                        \"displayName\": \"South America (Sao Paulo)\",\n-                                        \"value\": \"sa-east-1\"\n+                                        \"description\": \"An ORC file.\",\n+                                        \"displayName\": \"orc\",\n+                                        \"value\": \"orc\"\n                                     },\n                                     {\n-                                        \"description\": \"AWS Region Code : cn-north-1\",\n-                                        \"displayName\": \"China (Beijing)\",\n-                                        \"value\": \"cn-north-1\"\n+                                        \"description\": \"A parquet file.\",\n+                                        \"displayName\": \"parquet\",\n+                                        \"value\": \"parquet\"\n                                     },\n                                     {\n-                                        \"description\": \"AWS Region Code : cn-northwest-1\",\n-                                        \"displayName\": \"China (Ningxia)\",\n-                                        \"value\": \"cn-northwest-1\"\n+                                        \"description\": \"A text file with values separated by vertical bars (|).\",\n+                                        \"displayName\": \"psv\",\n+                                        \"value\": \"psv\"\n                                     },\n                                     {\n-                                        \"description\": \"AWS Region Code : ca-central-1\",\n-                                        \"displayName\": \"Canada (Central)\",\n-                                        \"value\": \"ca-central-1\"\n+                                        \"description\": \"A text file with values separated by semicolons (;).\",\n+                                        \"displayName\": \"scsv\",\n+                                        \"value\": \"scsv\"\n                                     },\n                                     {\n-                                        \"description\": \"AWS Region Code : ca-west-1\",\n-                                        \"displayName\": \"Canada West (Calgary)\",\n-                                        \"value\": \"ca-west-1\"\n+                                        \"description\": \"A text file with SOH-separated values. (SOH is the ASCII code point 1. This format is used by Hive in HDInsight).\",\n+                                        \"displayName\": \"sohsv\",\n+                                        \"value\": \"sohsv\"\n                                     },\n                                     {\n-                                        \"description\": \"AWS Region Code : me-central-1\",\n-                                        \"displayName\": \"Middle East (UAE)\",\n-                                        \"value\": \"me-central-1\"\n+                                        \"description\": \"A text file with tab delimited values (\\\\t).\",\n+                                        \"displayName\": \"tsv\",\n+                                        \"value\": \"tsv\"\n                                     },\n                                     {\n-                                        \"description\": \"AWS Region Code : me-south-1\",\n-                                        \"displayName\": \"Middle East (Bahrain)\",\n-                                        \"value\": \"me-south-1\"\n+                                        \"description\": \"A text file with tab-delimited values (\\\\t). A backslash (\\\\) is used as escape character.\",\n+                                        \"displayName\": \"tsve\",\n+                                        \"value\": \"tsve\"\n                                     },\n                                     {\n-                                        \"description\": \"AWS Region Code : af-south-1\",\n-                                        \"displayName\": \"Africa (Cape Town)\",\n-                                        \"value\": \"af-south-1\"\n-                                    },\n+                                        \"description\": \"A text file with lines separated by \\\\n. Empty lines are skipped\",\n+                                        \"displayName\": \"txt\",\n+                                        \"value\": \"txt\"\n+                                    }\n+                                ],\n+                                \"description\": \"The format of the data that is sent to Azure Data Explorer. Supported formats include: avro, csv, json\",\n+                                \"displayName\": \"Data Format\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Data Format\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Database Name\": {\n+                                \"description\": \"Azure Data Explorer Database Name for ingesting data\",\n+                                \"displayName\": \"Database Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Database Name\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Ingest Mapping Name\": {\n+                                \"description\": \"The name of the mapping responsible for storing the data in the appropriate columns.\",\n+                                \"displayName\": \"Ingest Mapping Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Ingest Mapping Name\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Ingest Status Polling Interval\": {\n+                                \"defaultValue\": \"5 s\",\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"AWS Region Code : us-iso-east-1\",\n-                                        \"displayName\": \"US ISO East\",\n-                                        \"value\": \"us-iso-east-1\"\n-                                    },\n+                                        \"dependentValues\": [\n+                                            \"true\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Poll for Ingest Status\",\n+                                        \"propertyName\": \"Poll for Ingest Status\"\n+                                    }\n+                                ],\n+                                \"description\": \"Defines the value of interval of time to poll for ingestion status\",\n+                                \"displayName\": \"Ingest Status Polling Interval\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Ingest Status Polling Interval\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Ingest Status Polling Timeout\": {\n+                                \"defaultValue\": \"5 m\",\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"AWS Region Code : us-isob-east-1\",\n-                                        \"displayName\": \"US ISOB East (Ohio)\",\n-                                        \"value\": \"us-isob-east-1\"\n-                                    },\n+                                        \"dependentValues\": [\n+                                            \"true\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Poll for Ingest Status\",\n+                                        \"propertyName\": \"Poll for Ingest Status\"\n+                                    }\n+                                ],\n+                                \"description\": \"Defines the total amount time to poll for ingestion status\",\n+                                \"displayName\": \"Ingest Status Polling Timeout\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Ingest Status Polling Timeout\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Ingestion Ignore First Record\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"description\": \"AWS Region Code : us-iso-west-1\",\n-                                        \"displayName\": \"US ISO West\",\n-                                        \"value\": \"us-iso-west-1\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n-                                        \"description\": \"AWS Region Code : il-central-1\",\n-                                        \"displayName\": \"Israel (Tel Aviv)\",\n-                                        \"value\": \"il-central-1\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"us-west-2\",\n-                                \"description\": \"The AWS Region to connect to.\",\n-                                \"displayName\": \"Region\",\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Defines whether ignore first record while ingestion.\",\n+                                \"displayName\": \"Ingestion Ignore First Record\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Region\",\n+                                \"name\": \"Ingestion Ignore First Record\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\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+                            \"Kusto Ingest Service\": {\n+                                \"description\": \"Azure Data Explorer Kusto Ingest Service\",\n+                                \"displayName\": \"Kusto Ingest Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"SSL Context Service\",\n-                                \"required\": false,\n+                                \"name\": \"Kusto Ingest 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.ssl.SSLContextService\",\n+                                    \"type\": \"org.apache.nifi.services.azure.data.explorer.KustoIngestService\",\n                                     \"version\": \"2.0.0-M3\"\n                                 }\n                             },\n-                            \"Signer Override\": {\n+                            \"Partially Succeeded Routing Strategy\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"Default Signature\",\n-                                        \"value\": \"Default Signature\"\n+                                        \"displayName\": \"success\",\n+                                        \"value\": \"success\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"Signature Version 4\",\n-                                        \"value\": \"AWSS3V4SignerType\"\n-                                    },\n+                                        \"displayName\": \"failure\",\n+                                        \"value\": \"failure\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"failure\",\n+                                \"description\": \"Defines where to route FlowFiles that resulted in a partially succeeded status.\",\n+                                \"displayName\": \"Partially Succeeded Routing Strategy\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Partially Succeeded Routing Strategy\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Poll for Ingest Status\": {\n+                                \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"Signature Version 2\",\n-                                        \"value\": \"S3SignerType\"\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"Custom Signature\",\n-                                        \"value\": \"CustomSignerType\"\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"Default Signature\",\n-                                \"description\": \"The AWS S3 library uses Signature Version 4 by default but this property allows you to specify the Version 2 signer to support older S3-compatible services or even to plug in your own custom signer implementation.\",\n-                                \"displayName\": \"Signer Override\",\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Determines whether to poll on ingestion status after an ingestion to Azure Data Explorer is completed\",\n+                                \"displayName\": \"Poll for Ingest Status\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Signer Override\",\n-                                \"required\": false,\n+                                \"name\": \"Poll for Ingest Status\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"custom-signer-class-name\": {\n-                                \"dependencies\": [\n+                            \"Streaming Enabled\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"CustomSignerType\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Signer Override\",\n-                                        \"propertyName\": \"Signer Override\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"description\": \"Fully qualified class name of the custom signer class. The signer must implement com.amazonaws.auth.Signer interface.\",\n-                                \"displayName\": \"Custom Signer Class Name\",\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Whether to stream data to Azure Data Explorer.\",\n+                                \"displayName\": \"Streaming Enabled\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"custom-signer-class-name\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Streaming Enabled\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"custom-signer-module-location\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"CustomSignerType\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Signer Override\",\n-                                        \"propertyName\": \"Signer Override\"\n-                                    }\n-                                ],\n-                                \"description\": \"Comma-separated list of paths to files and/or directories which contain the custom signer's JAR file and its dependencies (if any).\",\n-                                \"displayName\": \"Custom Signer Module Location\",\n+                            \"Table Name\": {\n+                                \"description\": \"Azure Data Explorer Table Name for ingesting data\",\n+                                \"displayName\": \"Table Name\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"custom-signer-module-location\",\n-                                \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"MULTIPLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\",\n-                                        \"DIRECTORY\"\n-                                    ]\n-                                },\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Table Name\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n+                            }\n+                        },\n+                        \"sideEffectFree\": false,\n+                        \"supportedRelationships\": [\n+                            {\n+                                \"description\": \"Ingest processing succeeded\",\n+                                \"name\": \"success\"\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+                            {\n+                                \"description\": \"Ingest processing 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+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"ADX\",\n+                            \"Azure\",\n+                            \"Data\",\n+                            \"Explorer\",\n+                            \"Kusto\"\n+                        ],\n+                        \"triggerSerially\": false,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.azure.data.explorer.PutAzureDataExplorer\",\n+                        \"typeDescription\": \"Acts as an Azure Data Explorer sink which sends FlowFiles to the provided endpoint. Data can be sent through queued ingestion or streaming ingestion to the Azure Data Explorer cluster.\",\n+                        \"useCases\": [],\n+                        \"version\": \"2.0.0-M3\"\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-azure-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"f2215c6\"\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+                        \"multiProcessorUseCases\": [],\n+                        \"primaryNodeOnly\": false,\n+                        \"propertyDescriptors\": {\n+                            \"Database Name\": {\n+                                \"description\": \"Azure Data Explorer Database Name for querying\",\n+                                \"displayName\": \"Database Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Database Name\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Kusto Query Service\": {\n+                                \"description\": \"Azure Data Explorer Kusto Query Service\",\n+                                \"displayName\": \"Kusto Query Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"delimiter\",\n-                                \"required\": false,\n+                                \"name\": \"Kusto Query 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.data.explorer.KustoQueryService\",\n+                                    \"version\": \"2.0.0-M3\"\n+                                }\n+                            },\n+                            \"Query\": {\n+                                \"description\": \"Query to be run against Azure Data Explorer\",\n+                                \"displayName\": \"Query\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Query\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n+                            }\n+                        },\n+                        \"sideEffectFree\": false,\n+                        \"supportedRelationships\": [\n+                            {\n+                                \"description\": \"FlowFiles containing results of a successful Query\",\n+                                \"name\": \"success\"\n                             },\n-                            \"et-initial-listing-target\": {\n+                            {\n+                                \"description\": \"FlowFiles containing original input associated with a failed Query\",\n+                                \"name\": \"failure\"\n+                            }\n+                        ],\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": false,\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"ADX\",\n+                            \"Azure\",\n+                            \"Data\",\n+                            \"Explorer\",\n+                            \"Kusto\"\n+                        ],\n+                        \"triggerSerially\": false,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.azure.data.explorer.QueryAzureDataExplorer\",\n+                        \"typeDescription\": \"Query Azure Data Explorer and stream JSON results to output FlowFiles\",\n+                        \"useCases\": [],\n+                        \"version\": \"2.0.0-M3\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"Azure Data Explorer query error message on failures\",\n+                                \"name\": \"query.error.message\"\n+                            },\n+                            {\n+                                \"description\": \"Azure Data Explorer query executed\",\n+                                \"name\": \"query.executed\"\n+                            },\n+                            {\n+                                \"description\": \"Content Type set to application/json\",\n+                                \"name\": \"mime.type\"\n+                            }\n+                        ]\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-azure-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"f2215c6\"\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+                        \"multiProcessorUseCases\": [],\n+                        \"primaryNodeOnly\": false,\n+                        \"propertyDescriptors\": {\n+                            \"Service Bus Endpoint\": {\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\": \"Servicebus endpoint for general use\",\n+                                        \"displayName\": \"Azure\",\n+                                        \"value\": \".servicebus.windows.net\"\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\": \"Servicebus endpoint for China\",\n+                                        \"displayName\": \"Azure China\",\n+                                        \"value\": \".servicebus.chinacloudapi.cn\"\n+                                    },\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"entities\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Listing Strategy\",\n-                                        \"propertyName\": \"listing-strategy\"\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-                                \"description\": \"Specify how initial listing should be handled. Used by 'Tracking Entities' strategy.\",\n-                                \"displayName\": \"Entity Tracking Initial Listing Target\",\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\": \"et-initial-listing-target\",\n+                                \"name\": \"Service Bus Endpoint\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"et-state-cache\": {\n-                                \"dependencies\": [\n+                            \"Transport Type\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"entities\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Listing Strategy\",\n-                                        \"propertyName\": \"listing-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\": \"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\": \"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\": \"et-state-cache\",\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\": \"2.0.0-M3\"\n-                                }\n-                            },\n-                            \"et-time-window\": {\n-                                \"defaultValue\": \"3 hours\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"propertyDisplayName\": \"Entity Tracking State Cache\",\n-                                        \"propertyName\": \"et-state-cache\"\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"et-time-window\",\n+                                \"name\": \"Transport Type\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"list-type\": {\n+                            \"checkpoint-strategy\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"List Objects V1\",\n-                                        \"value\": \"1\"\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\": \"List Objects V2\",\n-                                        \"value\": \"2\"\n+                                        \"description\": \"Use component state to store partition ownership and checkpoint information\",\n+                                        \"displayName\": \"Component State\",\n+                                        \"value\": \"COMPONENT_STATE\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"1\",\n-                                \"description\": \"Specifies whether to use the original List Objects or the newer List Objects Version 2 endpoint.\",\n-                                \"displayName\": \"List Type\",\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\": \"list-type\",\n+                                \"name\": \"checkpoint-strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"listing-strategy\": {\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"event-hub-consumer-group\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"event-hub-initial-offset\": {\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+                                        \"description\": \"Read from the oldest message retained in the stream.\",\n+                                        \"displayName\": \"Start of stream\",\n+                                        \"value\": \"start-of-stream\"\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+                                        \"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\": \"timestamps\",\n-                                \"description\": \"Specify how to determine new/updated entities. See each strategy descriptions for detail.\",\n-                                \"displayName\": \"Listing Strategy\",\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\": \"listing-strategy\",\n+                                \"name\": \"event-hub-initial-offset\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"max-age\": {\n-                                \"description\": \"The maximum age that an S3 object can be in order to be considered; any object older than this amount of time (according to last modification date) will be ignored\",\n-                                \"displayName\": \"Maximum Object Age\",\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\": \"max-age\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"event-hub-message-receive-timeout\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"min-age\": {\n-                                \"defaultValue\": \"0 sec\",\n-                                \"description\": \"The minimum age that an S3 object must be in order to be considered; any object younger than this amount of time (according to last modification date) will be ignored\",\n-                                \"displayName\": \"Minimum Object Age\",\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"min-age\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"event-hub-prefetch-count\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"prefix\": {\n-                                \"description\": \"The prefix used to filter the object list. Do not begin with a forward slash '/'. In most cases, it should end with a forward slash '/'.\",\n-                                \"displayName\": \"Prefix\",\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\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"prefix\",\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-                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests.\",\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\": \"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\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\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 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\": 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\": \"2.0.0-M3\"\n                                 }\n                             },\n-                            \"requester-pays\": {\n-                                \"allowableValues\": [\n+                            \"storage-account-key\": {\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"Indicates that the requester consents to pay any charges associated with listing the S3 bucket.\",\n-                                        \"displayName\": \"True\",\n-                                        \"value\": \"true\"\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"storage-account-key\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n+                            },\n+                            \"storage-account-name\": {\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"Does not consent to pay requester charges for listing the S3 bucket.\",\n-                                        \"displayName\": \"False\",\n-                                        \"value\": \"false\"\n+                                        \"dependentValues\": [\n+                                            \"AZURE_BLOB_STORAGE\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Checkpoint Strategy\",\n+                                        \"propertyName\": \"checkpoint-strategy\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"If true, indicates that the requester consents to pay any charges associated with listing the S3 bucket.  This sets the 'x-amz-request-payer' header to 'requester'.  Note that this setting is not applicable when 'Use Versions' is 'true'.\",\n-                                \"displayName\": \"Requester Pays\",\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\": \"requester-pays\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"storage-account-name\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"use-versions\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n+                            \"storage-container-name\": {\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"dependentValues\": [\n+                                            \"AZURE_BLOB_STORAGE\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Checkpoint Strategy\",\n+                                        \"propertyName\": \"checkpoint-strategy\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Specifies whether to use S3 versions, if applicable.  If false, only the latest version of each object will be returned.\",\n-                                \"displayName\": \"Use Versions\",\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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"use-versions\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"storage-container-name\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"write-s3-object-tags\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"True\",\n-                                        \"value\": \"true\"\n-                                    },\n+                            \"storage-sas-token\": {\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"False\",\n-                                        \"value\": \"false\"\n+                                        \"dependentValues\": [\n+                                            \"AZURE_BLOB_STORAGE\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Checkpoint Strategy\",\n+                                        \"propertyName\": \"checkpoint-strategy\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"If set to 'True', the tags associated with the S3 object will be written as FlowFile attributes\",\n-                                \"displayName\": \"Write Object Tags\",\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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"write-s3-object-tags\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"storage-sas-token\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n                             },\n-                            \"write-s3-user-metadata\": {\n+                            \"use-managed-identity\": {\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\": \"false\",\n-                                \"description\": \"If set to 'True', the user defined metadata associated with the S3 object will be added to FlowFile attributes/records\",\n-                                \"displayName\": \"Write User Metadata\",\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\": \"write-s3-user-metadata\",\n+                                \"name\": \"use-managed-identity\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.aws.s3.DeleteS3Object\",\n-                            \"org.apache.nifi.processors.aws.s3.FetchS3Object\",\n-                            \"org.apache.nifi.processors.aws.s3.PutS3Object\"\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+                            \"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+                                \"CLUSTER\",\n+                                \"LOCAL\"\n                             ]\n                         },\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"FlowFiles are routed to this Relationship after they have been successfully processed.\",\n+                                \"description\": \"FlowFiles received from Event Hub.\",\n                                 \"name\": \"success\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"AWS\",\n-                            \"Amazon\",\n-                            \"S3\",\n-                            \"list\"\n+                            \"azure\",\n+                            \"cloud\",\n+                            \"eventhub\",\n+                            \"events\",\n+                            \"microsoft\",\n+                            \"streaming\",\n+                            \"streams\"\n                         ],\n                         \"triggerSerially\": true,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": true,\n-                        \"type\": \"org.apache.nifi.processors.aws.s3.ListS3\",\n-                        \"typeDescription\": \"Retrieves a listing of objects from an S3 bucket. For each object that is listed, creates a FlowFile that represents the object so that it can be fetched in conjunction with FetchS3Object. 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.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                         \"useCases\": [],\n                         \"version\": \"2.0.0-M3\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"The name of the S3 bucket\",\n-                                \"name\": \"s3.bucket\"\n-                            },\n-                            {\n-                                \"description\": \"The region of the S3 bucket\",\n-                                \"name\": \"s3.region\"\n-                            },\n-                            {\n-                                \"description\": \"The name of the file\",\n-                                \"name\": \"filename\"\n-                            },\n-                            {\n-                                \"description\": \"The ETag that can be used to see if the file has changed\",\n-                                \"name\": \"s3.etag\"\n-                            },\n-                            {\n-                                \"description\": \"A boolean indicating if this is the latest version of the object\",\n-                                \"name\": \"s3.isLatest\"\n-                            },\n-                            {\n-                                \"description\": \"The last modified time in milliseconds since epoch in UTC time\",\n-                                \"name\": \"s3.lastModified\"\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 size of the object in bytes\",\n-                                \"name\": \"s3.length\"\n+                                \"description\": \"The offset into the partition at which the message was stored\",\n+                                \"name\": \"eventhub.offset\"\n                             },\n                             {\n-                                \"description\": \"The storage class of the object\",\n-                                \"name\": \"s3.storeClass\"\n+                                \"description\": \"The sequence number associated with the message\",\n+                                \"name\": \"eventhub.sequence\"\n                             },\n                             {\n-                                \"description\": \"The version of the object, if applicable\",\n-                                \"name\": \"s3.version\"\n+                                \"description\": \"The name of the event hub from which the message was pulled\",\n+                                \"name\": \"eventhub.name\"\n                             },\n                             {\n-                                \"description\": \"If 'Write Object Tags' is set to 'True', the tags associated to the S3 object that is being listed will be written as part of the flowfile attributes\",\n-                                \"name\": \"s3.tag.___\"\n+                                \"description\": \"The name of the partition from which the message was pulled\",\n+                                \"name\": \"eventhub.partition\"\n                             },\n                             {\n-                                \"description\": \"If 'Write User Metadata' is set to 'True', the user defined metadata associated to the S3 object that is being listed will be written as part of the flowfile attributes\",\n-                                \"name\": \"s3.user.metadata.___\"\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-aws-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-azure-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -89195,930 +92109,749 @@\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 S3 object as key/value pairs\",\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"name\": \"The name of a User-Defined Metadata field to add to the S3 Object\",\n-                                \"value\": \"The value of a User-Defined Metadata field to add to the S3 Object\"\n-                            }\n-                        ],\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n                         \"multiProcessorUseCases\": [],\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"AWS Credentials Provider service\": {\n-                                \"description\": \"The Controller Service that is used to obtain AWS credentials provider\",\n-                                \"displayName\": \"AWS Credentials Provider Service\",\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\": \"AWS Credentials Provider service\",\n+                                \"name\": \"Event Hub Consumer Group\",\n                                 \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-aws-service-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.processors.aws.credentials.provider.service.AWSCredentialsProviderService\",\n-                                    \"version\": \"2.0.0-M3\"\n-                                }\n+                                \"sensitive\": false\n                             },\n-                            \"Bucket\": {\n-                                \"defaultValue\": \"${s3.bucket}\",\n-                                \"description\": \"The S3 Bucket to interact with\",\n-                                \"displayName\": \"Bucket\",\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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Bucket\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Event Hub Message Enqueue Time\",\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Event Hub Name\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Cache Control\": {\n-                                \"description\": \"Sets the Cache-Control HTTP header indicating the caching directives of the associated object. Multiple directives are comma-separated.\",\n-                                \"displayName\": \"Cache Control\",\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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Cache Control\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Event Hub Namespace\",\n+                                \"required\": true,\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Partition Receiver Timeout (millseconds)\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Communications Timeout\": {\n-                                \"defaultValue\": \"30 secs\",\n-                                \"description\": \"The amount of time to wait in order to establish a connection to AWS or receive data from AWS before timing out.\",\n-                                \"displayName\": \"Communications Timeout\",\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\": \"Communications Timeout\",\n-                                \"required\": true,\n+                                \"name\": \"Partition Recivier Fetch Size\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Content Disposition\": {\n+                            \"Service Bus Endpoint\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"inline\",\n-                                        \"value\": \"inline\"\n+                                        \"description\": \"Servicebus endpoint for general use\",\n+                                        \"displayName\": \"Azure\",\n+                                        \"value\": \".servicebus.windows.net\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"attachment\",\n-                                        \"value\": \"attachment\"\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-                                \"description\": \"Sets the Content-Disposition HTTP header indicating if the content is intended to be displayed inline or should be downloaded.\\n Possible values are 'inline' or 'attachment'. If this property is not specified, object's content-disposition will be set to filename. When 'attachment' is selected, '; filename=' plus object key are automatically appended to form final value 'attachment; filename=\\\"filename.jpg\\\"'.\",\n-                                \"displayName\": \"Content Disposition\",\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\": \"Content Disposition\",\n-                                \"required\": false,\n+                                \"name\": \"Service Bus Endpoint\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Content Type\": {\n-                                \"description\": \"Sets the Content-Type HTTP header indicating the type of content stored in the associated object. The value of this header is a standard MIME type.\\nAWS S3 Java client will attempt to determine the correct content type if one hasn't been set yet. Users are responsible for ensuring a suitable content type is set when uploading streams. If no content type is provided and cannot be determined by the filename, the default content type \\\"application/octet-stream\\\" will be used.\",\n-                                \"displayName\": \"Content Type\",\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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Content Type\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Shared Access Policy Name\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Endpoint Override URL\": {\n-                                \"description\": \"Endpoint URL to use instead of the AWS default including scheme, host, port, and path. The AWS libraries select an endpoint URL based on the AWS region, but this property overrides the selected endpoint URL, allowing use with other S3-compatible endpoints.\",\n-                                \"displayName\": \"Endpoint Override URL\",\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Endpoint Override URL\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Shared Access Policy Primary Key\",\n                                 \"required\": false,\n-                                \"sensitive\": false\n+                                \"sensitive\": true\n                             },\n-                            \"Expiration Time Rule\": {\n-                                \"description\": \"\",\n-                                \"displayName\": \"Expiration Time Rule\",\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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Expiration Time Rule\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Transport Type\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"File Resource Service\": {\n+                            \"proxy-configuration-service\": {\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"FILE_RESOURCE_SERVICE\"\n+                                            \"AmqpWebSockets\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Resource Transfer Source\",\n-                                        \"propertyName\": \"Resource Transfer Source\"\n+                                        \"propertyDisplayName\": \"Transport Type\",\n+                                        \"propertyName\": \"Transport Type\"\n                                     }\n                                 ],\n-                                \"description\": \"File Resource Service providing access to the local resource to be transferred\",\n-                                \"displayName\": \"File Resource 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\": \"File Resource 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.fileresource.service.api.FileResourceService\",\n+                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n                                     \"version\": \"2.0.0-M3\"\n                                 }\n                             },\n-                            \"FullControl User List\": {\n-                                \"defaultValue\": \"${s3.permissions.full.users}\",\n-                                \"description\": \"A comma-separated list of Amazon User ID's or E-mail addresses that specifies who should have Full Control for an object\",\n-                                \"displayName\": \"FullControl User List\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"FullControl User List\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Multipart Part Size\": {\n-                                \"defaultValue\": \"5 GB\",\n-                                \"description\": \"Specifies the part size for use when the PutS3Multipart Upload API is used. Flow files will be broken into chunks of this size for the upload process, but the last part sent can be smaller since it is not padded. The valid range is 50MB to 5GB.\",\n-                                \"displayName\": \"Multipart Part Size\",\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\": \"Multipart Part Size\",\n+                                \"name\": \"use-managed-identity\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n+                            }\n+                        },\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.azure.eventhub.ConsumeAzureEventHub\"\n+                        ],\n+                        \"sideEffectFree\": false,\n+                        \"supportedRelationships\": [\n+                            {\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+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"azure\",\n+                            \"cloud\",\n+                            \"eventhub\",\n+                            \"events\",\n+                            \"microsoft\",\n+                            \"streaming\",\n+                            \"streams\"\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+                        \"useCases\": [],\n+                        \"version\": \"2.0.0-M3\",\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-                            \"Multipart Threshold\": {\n-                                \"defaultValue\": \"5 GB\",\n-                                \"description\": \"Specifies the file size threshold for switch from the PutS3Object API to the PutS3MultipartUpload API.  Flow files bigger than this limit will be sent using the stateful multipart process. The valid range is 50MB to 5GB.\",\n-                                \"displayName\": \"Multipart Threshold\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Multipart Threshold\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n+                            {\n+                                \"description\": \"The offset into the partition at which the message was stored\",\n+                                \"name\": \"eventhub.offset\"\n                             },\n-                            \"Multipart Upload AgeOff Interval\": {\n-                                \"defaultValue\": \"60 min\",\n-                                \"description\": \"Specifies the interval at which existing multipart uploads in AWS S3 will be evaluated for ageoff.  When processor is triggered it will initiate the ageoff evaluation if this interval has been exceeded.\",\n-                                \"displayName\": \"Multipart Upload AgeOff Interval\",\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+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-azure-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"f2215c6\"\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+                        \"multiProcessorUseCases\": [],\n+                        \"primaryNodeOnly\": false,\n+                        \"propertyDescriptors\": {\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\": \"Multipart Upload AgeOff Interval\",\n+                                \"name\": \"Event Hub Name\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Multipart Upload Max Age Threshold\": {\n-                                \"defaultValue\": \"7 days\",\n-                                \"description\": \"Specifies the maximum age for existing multipart uploads in AWS S3.  When the ageoff process occurs, any upload older than this threshold will be aborted.\",\n-                                \"displayName\": \"Multipart Upload Max Age Threshold\",\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\": \"Multipart Upload Max Age Threshold\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Object Key\": {\n-                                \"defaultValue\": \"${filename}\",\n-                                \"description\": \"The S3 Object Key to use. This is analogous to a filename for traditional file systems.\",\n-                                \"displayName\": \"Object Key\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Object Key\",\n+                                \"name\": \"Event Hub Namespace\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Owner\": {\n-                                \"defaultValue\": \"${s3.owner}\",\n-                                \"description\": \"The Amazon ID to use for the object's owner\",\n-                                \"displayName\": \"Owner\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Owner\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Read ACL User List\": {\n-                                \"defaultValue\": \"${s3.permissions.readacl.users}\",\n-                                \"description\": \"A comma-separated list of Amazon User ID's or E-mail addresses that specifies who should have permissions to read the Access Control List for an object\",\n-                                \"displayName\": \"Read ACL User List\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Read ACL User List\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Read Permission User List\": {\n-                                \"defaultValue\": \"${s3.permissions.read.users}\",\n-                                \"description\": \"A comma-separated list of Amazon User ID's or E-mail addresses that specifies who should have Read Access for an object\",\n-                                \"displayName\": \"Read Permission User List\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Read Permission User List\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Region\": {\n+                            \"Service Bus Endpoint\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"AWS Region Code : us-gov-west-1\",\n-                                        \"displayName\": \"AWS GovCloud (US)\",\n-                                        \"value\": \"us-gov-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-gov-east-1\",\n-                                        \"displayName\": \"AWS GovCloud (US-East)\",\n-                                        \"value\": \"us-gov-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-east-1\",\n-                                        \"displayName\": \"US East (N. Virginia)\",\n-                                        \"value\": \"us-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-east-2\",\n-                                        \"displayName\": \"US East (Ohio)\",\n-                                        \"value\": \"us-east-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-west-1\",\n-                                        \"displayName\": \"US West (N. California)\",\n-                                        \"value\": \"us-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-west-2\",\n-                                        \"displayName\": \"US West (Oregon)\",\n-                                        \"value\": \"us-west-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-west-1\",\n-                                        \"displayName\": \"EU (Ireland)\",\n-                                        \"value\": \"eu-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-west-2\",\n-                                        \"displayName\": \"EU (London)\",\n-                                        \"value\": \"eu-west-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-west-3\",\n-                                        \"displayName\": \"EU (Paris)\",\n-                                        \"value\": \"eu-west-3\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-central-1\",\n-                                        \"displayName\": \"EU (Frankfurt)\",\n-                                        \"value\": \"eu-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-central-2\",\n-                                        \"displayName\": \"EU (Zurich)\",\n-                                        \"value\": \"eu-central-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-north-1\",\n-                                        \"displayName\": \"EU (Stockholm)\",\n-                                        \"value\": \"eu-north-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-south-1\",\n-                                        \"displayName\": \"EU (Milan)\",\n-                                        \"value\": \"eu-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-south-2\",\n-                                        \"displayName\": \"EU (Spain)\",\n-                                        \"value\": \"eu-south-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-east-1\",\n-                                        \"displayName\": \"Asia Pacific (Hong Kong)\",\n-                                        \"value\": \"ap-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-south-1\",\n-                                        \"displayName\": \"Asia Pacific (Mumbai)\",\n-                                        \"value\": \"ap-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-south-2\",\n-                                        \"displayName\": \"Asia Pacific (Hyderabad)\",\n-                                        \"value\": \"ap-south-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-1\",\n-                                        \"displayName\": \"Asia Pacific (Singapore)\",\n-                                        \"value\": \"ap-southeast-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-2\",\n-                                        \"displayName\": \"Asia Pacific (Sydney)\",\n-                                        \"value\": \"ap-southeast-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-3\",\n-                                        \"displayName\": \"Asia Pacific (Jakarta)\",\n-                                        \"value\": \"ap-southeast-3\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-4\",\n-                                        \"displayName\": \"Asia Pacific (Melbourne)\",\n-                                        \"value\": \"ap-southeast-4\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-northeast-1\",\n-                                        \"displayName\": \"Asia Pacific (Tokyo)\",\n-                                        \"value\": \"ap-northeast-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-northeast-2\",\n-                                        \"displayName\": \"Asia Pacific (Seoul)\",\n-                                        \"value\": \"ap-northeast-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-northeast-3\",\n-                                        \"displayName\": \"Asia Pacific (Osaka)\",\n-                                        \"value\": \"ap-northeast-3\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : sa-east-1\",\n-                                        \"displayName\": \"South America (Sao Paulo)\",\n-                                        \"value\": \"sa-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : cn-north-1\",\n-                                        \"displayName\": \"China (Beijing)\",\n-                                        \"value\": \"cn-north-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : cn-northwest-1\",\n-                                        \"displayName\": \"China (Ningxia)\",\n-                                        \"value\": \"cn-northwest-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ca-central-1\",\n-                                        \"displayName\": \"Canada (Central)\",\n-                                        \"value\": \"ca-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ca-west-1\",\n-                                        \"displayName\": \"Canada West (Calgary)\",\n-                                        \"value\": \"ca-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : me-central-1\",\n-                                        \"displayName\": \"Middle East (UAE)\",\n-                                        \"value\": \"me-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : me-south-1\",\n-                                        \"displayName\": \"Middle East (Bahrain)\",\n-                                        \"value\": \"me-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : af-south-1\",\n-                                        \"displayName\": \"Africa (Cape Town)\",\n-                                        \"value\": \"af-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-iso-east-1\",\n-                                        \"displayName\": \"US ISO East\",\n-                                        \"value\": \"us-iso-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-isob-east-1\",\n-                                        \"displayName\": \"US ISOB East (Ohio)\",\n-                                        \"value\": \"us-isob-east-1\"\n+                                        \"description\": \"Servicebus endpoint for general use\",\n+                                        \"displayName\": \"Azure\",\n+                                        \"value\": \".servicebus.windows.net\"\n                                     },\n                                     {\n-                                        \"description\": \"AWS Region Code : us-iso-west-1\",\n-                                        \"displayName\": \"US ISO West\",\n-                                        \"value\": \"us-iso-west-1\"\n+                                        \"description\": \"Servicebus endpoint for China\",\n+                                        \"displayName\": \"Azure China\",\n+                                        \"value\": \".servicebus.chinacloudapi.cn\"\n                                     },\n                                     {\n-                                        \"description\": \"AWS Region Code : il-central-1\",\n-                                        \"displayName\": \"Israel (Tel Aviv)\",\n-                                        \"value\": \"il-central-1\"\n+                                        \"description\": \"Servicebus endpoint for Germany\",\n+                                        \"displayName\": \"Azure Germany\",\n+                                        \"value\": \".servicebus.cloudapi.de\"\n                                     },\n                                     {\n-                                        \"description\": \"Uses 's3.region' FlowFile attribute as region.\",\n-                                        \"displayName\": \"Use 's3.region' Attribute\",\n-                                        \"value\": \"attribute-defined-region\"\n+                                        \"description\": \"Servicebus endpoint for US Government\",\n+                                        \"displayName\": \"Azure US Government\",\n+                                        \"value\": \".servicebus.usgovcloudapi.net\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"us-west-2\",\n-                                \"description\": \"The AWS Region to connect to.\",\n-                                \"displayName\": \"Region\",\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\": \"Region\",\n+                                \"name\": \"Service Bus Endpoint\",\n                                 \"required\": true,\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-                                    {\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\": \"FLOWFILE_CONTENT\",\n-                                \"description\": \"The source of the content to be transferred\",\n-                                \"displayName\": \"Resource Transfer Source\",\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\": \"Resource Transfer Source\",\n-                                \"required\": true,\n+                                \"name\": \"Shared Access Policy Name\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\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+                            \"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\": \"SSL Context Service\",\n+                                \"name\": \"Shared Access Policy Primary Key\",\n                                 \"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\": \"2.0.0-M3\"\n-                                }\n+                                \"sensitive\": true\n                             },\n-                            \"Signer Override\": {\n+                            \"Transport Type\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Default Signature\",\n-                                        \"value\": \"Default Signature\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Signature Version 4\",\n-                                        \"value\": \"AWSS3V4SignerType\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Signature Version 2\",\n-                                        \"value\": \"S3SignerType\"\n+                                        \"description\": \"AMQP over TCP on ports 5671 and 5672\",\n+                                        \"displayName\": \"AMQP\",\n+                                        \"value\": \"Amqp\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Custom Signature\",\n-                                        \"value\": \"CustomSignerType\"\n+                                        \"description\": \"AMQP over HTTPS with WebSockets on port 443\",\n+                                        \"displayName\": \"AMQP_WEB_SOCKETS\",\n+                                        \"value\": \"AmqpWebSockets\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"Default Signature\",\n-                                \"description\": \"The AWS S3 library uses Signature Version 4 by default but this property allows you to specify the Version 2 signer to support older S3-compatible services or even to plug in your own custom signer implementation.\",\n-                                \"displayName\": \"Signer Override\",\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\": \"Signer Override\",\n-                                \"required\": false,\n+                                \"name\": \"Transport Type\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Storage Class\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"DeepArchive\",\n-                                        \"value\": \"DeepArchive\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Glacier\",\n-                                        \"value\": \"Glacier\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"GlacierInstantRetrieval\",\n-                                        \"value\": \"GlacierInstantRetrieval\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"IntelligentTiering\",\n-                                        \"value\": \"IntelligentTiering\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"OneZoneInfrequentAccess\",\n-                                        \"value\": \"OneZoneInfrequentAccess\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Outposts\",\n-                                        \"value\": \"Outposts\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"ReducedRedundancy\",\n-                                        \"value\": \"ReducedRedundancy\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Snow\",\n-                                        \"value\": \"Snow\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Standard\",\n-                                        \"value\": \"Standard\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"StandardInfrequentAccess\",\n-                                        \"value\": \"StandardInfrequentAccess\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"Standard\",\n-                                \"description\": \"\",\n-                                \"displayName\": \"Storage Class\",\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\": \"Storage Class\",\n+                                \"name\": \"max-batch-size\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Write ACL User List\": {\n-                                \"defaultValue\": \"${s3.permissions.writeacl.users}\",\n-                                \"description\": \"A comma-separated list of Amazon User ID's or E-mail addresses that specifies who should have permissions to change the Access Control List for an object\",\n-                                \"displayName\": \"Write ACL User List\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Write ACL User List\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Write Permission User List\": {\n-                                \"defaultValue\": \"${s3.permissions.write.users}\",\n-                                \"description\": \"A comma-separated list of Amazon User ID's or E-mail addresses that specifies who should have Write Access for an object\",\n-                                \"displayName\": \"Write Permission User List\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Write Permission User List\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"canned-acl\": {\n-                                \"defaultValue\": \"${s3.permissions.cannedacl}\",\n-                                \"description\": \"Amazon Canned ACL for an object, one of: BucketOwnerFullControl, BucketOwnerRead, LogDeliveryWrite, AuthenticatedRead, PublicReadWrite, PublicRead, Private; will be ignored if any other ACL/permission/owner property is specified\",\n-                                \"displayName\": \"Canned ACL\",\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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"canned-acl\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"partitioning-key-attribute-name\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"custom-signer-class-name\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"CustomSignerType\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Signer Override\",\n-                                        \"propertyName\": \"Signer Override\"\n-                                    }\n-                                ],\n-                                \"description\": \"Fully qualified class name of the custom signer class. The signer must implement com.amazonaws.auth.Signer interface.\",\n-                                \"displayName\": \"Custom Signer Class Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"custom-signer-class-name\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"custom-signer-module-location\": {\n+                            \"proxy-configuration-service\": {\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"CustomSignerType\"\n+                                            \"AmqpWebSockets\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Signer Override\",\n-                                        \"propertyName\": \"Signer Override\"\n+                                        \"propertyDisplayName\": \"Transport Type\",\n+                                        \"propertyName\": \"Transport Type\"\n                                     }\n                                 ],\n-                                \"description\": \"Comma-separated list of paths to files and/or directories which contain the custom signer's JAR file and its dependencies (if any).\",\n-                                \"displayName\": \"Custom Signer Module Location\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"custom-signer-module-location\",\n-                                \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"MULTIPLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\",\n-                                        \"DIRECTORY\"\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"encryption-service\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-aws-service-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.processors.aws.s3.AmazonS3EncryptionService\",\n-                                    \"version\": \"2.0.0-M3\"\n-                                }\n-                            },\n-                            \"proxy-configuration-service\": {\n-                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests.\",\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\": \"2.0.0-M3\"\n                                 }\n                             },\n-                            \"s3-object-remove-tags-prefix\": {\n+                            \"use-managed-identity\": {\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\": \"false\",\n-                                \"description\": \"If set to 'True', the value provided for 'Object Tags Prefix' will be removed from the attribute(s) and then considered as the Tag name. For ex: If the incoming FlowFile carries the attributes tagS3country, tagS3PII and the prefix is set to 'tagS3' then the corresponding tag values would be 'country' and 'PII'\",\n-                                \"displayName\": \"Remove Tag Prefix\",\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\": \"s3-object-remove-tags-prefix\",\n-                                \"required\": false,\n+                                \"name\": \"use-managed-identity\",\n+                                \"required\": true,\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-                            \"s3-object-tags-prefix\": {\n-                                \"description\": \"Specifies the prefix which would be scanned against the incoming FlowFile's attributes and the matching attribute's name and value would be considered as the outgoing S3 object's Tag name and Tag value respectively. For Ex: If the incoming FlowFile carries the attributes tagS3country, tagS3PII, the tag prefix to be specified would be 'tagS3'\",\n-                                \"displayName\": \"Object Tags Prefix\",\n+                            {\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\": true,\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": 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+                        ],\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+                        \"useCases\": [],\n+                        \"version\": \"2.0.0-M3\"\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-azure-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"f2215c6\"\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+                        \"multiProcessorUseCases\": [],\n+                        \"primaryNodeOnly\": false,\n+                        \"propertyDescriptors\": {\n+                            \"Source Blob Name\": {\n+                                \"description\": \"The full name of the source blob\",\n+                                \"displayName\": \"Source Blob Name\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"s3-object-tags-prefix\",\n-                                \"required\": false,\n+                                \"name\": \"Source Blob Name\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"s3-temporary-directory-multipart\": {\n-                                \"defaultValue\": \"${java.io.tmpdir}\",\n-                                \"description\": \"Directory in which, for multipart uploads, the processor will locally save the state tracking the upload ID and parts uploaded which must both be provided to complete the upload.\",\n-                                \"displayName\": \"Temporary Directory Multipart State\",\n+                            \"Source Container Name\": {\n+                                \"description\": \"Name of the Azure storage container that will be copied\",\n+                                \"displayName\": \"Source Container Name\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"s3-temporary-directory-multipart\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Source Container Name\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"server-side-encryption\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"None\",\n-                                        \"value\": \"None\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"AES256\",\n-                                        \"value\": \"AES256\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"None\",\n-                                \"description\": \"Specifies the algorithm used for server side encryption.\",\n-                                \"displayName\": \"Server Side Encryption\",\n+                            \"Source Storage Credentials\": {\n+                                \"description\": \"Credentials Service used to obtain Azure Blob Storage Credentials to read Source Blob information\",\n+                                \"displayName\": \"Source Storage Credentials\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"server-side-encryption\",\n+                                \"name\": \"Source Storage Credentials\",\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\": \"2.0.0-M3\"\n+                                }\n+                            },\n+                            \"blob-name\": {\n+                                \"description\": \"The full name of the destination blob defaults to the Source Blob Name when not specified\",\n+                                \"displayName\": \"Destination Blob Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"blob-name\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"use-chunked-encoding\": {\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\": \"true\",\n-                                \"description\": \"Enables / disables chunked encoding for upload requests. Set it to false only if your endpoint does not support chunked uploading.\",\n-                                \"displayName\": \"Use Chunked Encoding\",\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\": \"use-chunked-encoding\",\n+                                \"name\": \"conflict-resolution-strategy\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"container-name\": {\n+                                \"description\": \"Name of the Azure storage container destination defaults to the Source Container Name when not specified\",\n+                                \"displayName\": \"Destination Container Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"container-name\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"use-path-style-access\": {\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\": \"false\",\n-                                \"description\": \"Path-style access can be enforced by setting this property to true. Set it to true if your endpoint does not support virtual-hosted-style requests, only path-style requests.\",\n-                                \"displayName\": \"Use Path Style Access\",\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\": \"use-path-style-access\",\n-                                \"required\": false,\n+                                \"name\": \"create-container\",\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\": \"2.0.0-M3\"\n+                                }\n+                            },\n+                            \"storage-credentials-service\": {\n+                                \"description\": \"Controller Service used to obtain Azure Blob Storage Credentials.\",\n+                                \"displayName\": \"Destination 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\": \"2.0.0-M3\"\n+                                }\n                             }\n                         },\n-                        \"readsAttributes\": [\n-                            {\n-                                \"description\": \"Uses the FlowFile's filename as the filename for the S3 object\",\n-                                \"name\": \"filename\"\n-                            }\n-                        ],\n                         \"seeAlso\": [\n-                            \"org.apache.nifi.processors.aws.s3.DeleteS3Object\",\n-                            \"org.apache.nifi.processors.aws.s3.FetchS3Object\",\n-                            \"org.apache.nifi.processors.aws.s3.ListS3\"\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.azure.storage.PutAzureBlobStorage_v12\"\n                         ],\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"FlowFiles are routed to this Relationship after they have been successfully processed.\",\n+                                \"description\": \"All successfully processed FlowFiles are routed to this relationship\",\n                                 \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"If the Processor is unable to process a given FlowFile, it 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                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"AWS\",\n-                            \"Amazon\",\n-                            \"Archive\",\n-                            \"Put\",\n-                            \"S3\"\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.aws.s3.PutS3Object\",\n-                        \"typeDescription\": \"Writes the contents of a FlowFile as an S3 Object to an Amazon S3 Bucket.\",\n+                        \"type\": \"org.apache.nifi.processors.azure.storage.CopyAzureBlobStorage_v12\",\n+                        \"typeDescription\": \"Copies a blob in Azure Blob Storage from one account/container to another. The processor uses Azure Blob Storage client library v12.\",\n                         \"useCases\": [],\n                         \"version\": \"2.0.0-M3\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"The URL that can be used to access the S3 object\",\n-                                \"name\": \"s3.url\"\n-                            },\n-                            {\n-                                \"description\": \"The S3 bucket where the Object was put in S3\",\n-                                \"name\": \"s3.bucket\"\n-                            },\n-                            {\n-                                \"description\": \"The S3 key within where the Object was put in S3\",\n-                                \"name\": \"s3.key\"\n-                            },\n-                            {\n-                                \"description\": \"The S3 content type of the S3 Object that put in S3\",\n-                                \"name\": \"s3.contenttype\"\n-                            },\n-                            {\n-                                \"description\": \"The version of the S3 Object that was put to S3\",\n-                                \"name\": \"s3.version\"\n-                            },\n-                            {\n-                                \"description\": \"The class name of the exception thrown during processor execution\",\n-                                \"name\": \"s3.exception\"\n-                            },\n-                            {\n-                                \"description\": \"The S3 supplied detail from the failed operation\",\n-                                \"name\": \"s3.additionalDetails\"\n-                            },\n-                            {\n-                                \"description\": \"The HTTP error code (if available) from the failed operation\",\n-                                \"name\": \"s3.statusCode\"\n+                                \"description\": \"The name of the Azure Blob Storage container\",\n+                                \"name\": \"azure.container\"\n                             },\n                             {\n-                                \"description\": \"The S3 moniker of the failed operation\",\n-                                \"name\": \"s3.errorCode\"\n+                                \"description\": \"The name of the blob on Azure Blob Storage\",\n+                                \"name\": \"azure.blobname\"\n                             },\n                             {\n-                                \"description\": \"The S3 exception message from the failed operation\",\n-                                \"name\": \"s3.errorMessage\"\n+                                \"description\": \"Primary location of the blob\",\n+                                \"name\": \"azure.primaryUri\"\n                             },\n                             {\n-                                \"description\": \"The ETag of the S3 Object\",\n-                                \"name\": \"s3.etag\"\n+                                \"description\": \"ETag of the blob\",\n+                                \"name\": \"azure.etag\"\n                             },\n                             {\n-                                \"description\": \"The content disposition of the S3 Object that put in S3\",\n-                                \"name\": \"s3.contentdisposition\"\n+                                \"description\": \"Type of the blob (either BlockBlob, PageBlob or AppendBlob)\",\n+                                \"name\": \"azure.blobtype\"\n                             },\n                             {\n-                                \"description\": \"The cache-control header of the S3 Object\",\n-                                \"name\": \"s3.cachecontrol\"\n+                                \"description\": \"MIME Type of the content\",\n+                                \"name\": \"mime.type\"\n                             },\n                             {\n-                                \"description\": \"The uploadId used to upload the Object to S3\",\n-                                \"name\": \"s3.uploadId\"\n+                                \"description\": \"Language code for the content\",\n+                                \"name\": \"lang\"\n                             },\n                             {\n-                                \"description\": \"A human-readable form of the expiration date of the S3 object, if one is set\",\n-                                \"name\": \"s3.expiration\"\n+                                \"description\": \"Timestamp of the blob\",\n+                                \"name\": \"azure.timestamp\"\n                             },\n                             {\n-                                \"description\": \"The server side encryption algorithm of the object\",\n-                                \"name\": \"s3.sseAlgorithm\"\n+                                \"description\": \"Length of the blob\",\n+                                \"name\": \"azure.length\"\n                             },\n                             {\n-                                \"description\": \"A human-readable form of the User Metadata of the S3 object, if any was set\",\n-                                \"name\": \"s3.usermetadata\"\n+                                \"description\": \"Error code reported during blob operation\",\n+                                \"name\": \"azure.error.code\"\n                             },\n                             {\n-                                \"description\": \"The name of the encryption strategy, if any was set\",\n-                                \"name\": \"s3.encryptionStrategy\"\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\": false,\n-                        \"artifact\": \"nifi-aws-nar\",\n+                        \"artifact\": \"nifi-azure-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -90131,503 +92864,299 @@\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"multiProcessorUseCases\": [],\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"AWS Credentials Provider service\": {\n-                                \"description\": \"The Controller Service that is used to obtain AWS credentials provider\",\n-                                \"displayName\": \"AWS Credentials Provider Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"AWS Credentials Provider service\",\n-                                \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-aws-service-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.processors.aws.credentials.provider.service.AWSCredentialsProviderService\",\n-                                    \"version\": \"2.0.0-M3\"\n-                                }\n-                            },\n-                            \"Bucket\": {\n-                                \"defaultValue\": \"${s3.bucket}\",\n-                                \"description\": \"The S3 Bucket to interact with\",\n-                                \"displayName\": \"Bucket\",\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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Bucket\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Communications Timeout\": {\n-                                \"defaultValue\": \"30 secs\",\n-                                \"description\": \"The amount of time to wait in order to establish a connection to AWS or receive data from AWS before timing out.\",\n-                                \"displayName\": \"Communications Timeout\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Communications Timeout\",\n+                                \"name\": \"blob-name\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Endpoint Override URL\": {\n-                                \"description\": \"Endpoint URL to use instead of the AWS default including scheme, host, port, and path. The AWS libraries select an endpoint URL based on the AWS region, but this property overrides the selected endpoint URL, allowing use with other S3-compatible endpoints.\",\n-                                \"displayName\": \"Endpoint Override URL\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Endpoint Override URL\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Object Key\": {\n-                                \"defaultValue\": \"${filename}\",\n-                                \"description\": \"The S3 Object Key to use. This is analogous to a filename for traditional file systems.\",\n-                                \"displayName\": \"Object Key\",\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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Object Key\",\n+                                \"name\": \"container-name\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Region\": {\n+                            \"delete-snapshots-option\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"AWS Region Code : us-gov-west-1\",\n-                                        \"displayName\": \"AWS GovCloud (US)\",\n-                                        \"value\": \"us-gov-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-gov-east-1\",\n-                                        \"displayName\": \"AWS GovCloud (US-East)\",\n-                                        \"value\": \"us-gov-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-east-1\",\n-                                        \"displayName\": \"US East (N. Virginia)\",\n-                                        \"value\": \"us-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-east-2\",\n-                                        \"displayName\": \"US East (Ohio)\",\n-                                        \"value\": \"us-east-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-west-1\",\n-                                        \"displayName\": \"US West (N. California)\",\n-                                        \"value\": \"us-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-west-2\",\n-                                        \"displayName\": \"US West (Oregon)\",\n-                                        \"value\": \"us-west-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-west-1\",\n-                                        \"displayName\": \"EU (Ireland)\",\n-                                        \"value\": \"eu-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-west-2\",\n-                                        \"displayName\": \"EU (London)\",\n-                                        \"value\": \"eu-west-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-west-3\",\n-                                        \"displayName\": \"EU (Paris)\",\n-                                        \"value\": \"eu-west-3\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-central-1\",\n-                                        \"displayName\": \"EU (Frankfurt)\",\n-                                        \"value\": \"eu-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-central-2\",\n-                                        \"displayName\": \"EU (Zurich)\",\n-                                        \"value\": \"eu-central-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-north-1\",\n-                                        \"displayName\": \"EU (Stockholm)\",\n-                                        \"value\": \"eu-north-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-south-1\",\n-                                        \"displayName\": \"EU (Milan)\",\n-                                        \"value\": \"eu-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-south-2\",\n-                                        \"displayName\": \"EU (Spain)\",\n-                                        \"value\": \"eu-south-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-east-1\",\n-                                        \"displayName\": \"Asia Pacific (Hong Kong)\",\n-                                        \"value\": \"ap-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-south-1\",\n-                                        \"displayName\": \"Asia Pacific (Mumbai)\",\n-                                        \"value\": \"ap-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-south-2\",\n-                                        \"displayName\": \"Asia Pacific (Hyderabad)\",\n-                                        \"value\": \"ap-south-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-1\",\n-                                        \"displayName\": \"Asia Pacific (Singapore)\",\n-                                        \"value\": \"ap-southeast-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-2\",\n-                                        \"displayName\": \"Asia Pacific (Sydney)\",\n-                                        \"value\": \"ap-southeast-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-3\",\n-                                        \"displayName\": \"Asia Pacific (Jakarta)\",\n-                                        \"value\": \"ap-southeast-3\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-4\",\n-                                        \"displayName\": \"Asia Pacific (Melbourne)\",\n-                                        \"value\": \"ap-southeast-4\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-northeast-1\",\n-                                        \"displayName\": \"Asia Pacific (Tokyo)\",\n-                                        \"value\": \"ap-northeast-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-northeast-2\",\n-                                        \"displayName\": \"Asia Pacific (Seoul)\",\n-                                        \"value\": \"ap-northeast-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-northeast-3\",\n-                                        \"displayName\": \"Asia Pacific (Osaka)\",\n-                                        \"value\": \"ap-northeast-3\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : sa-east-1\",\n-                                        \"displayName\": \"South America (Sao Paulo)\",\n-                                        \"value\": \"sa-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : cn-north-1\",\n-                                        \"displayName\": \"China (Beijing)\",\n-                                        \"value\": \"cn-north-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : cn-northwest-1\",\n-                                        \"displayName\": \"China (Ningxia)\",\n-                                        \"value\": \"cn-northwest-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ca-central-1\",\n-                                        \"displayName\": \"Canada (Central)\",\n-                                        \"value\": \"ca-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ca-west-1\",\n-                                        \"displayName\": \"Canada West (Calgary)\",\n-                                        \"value\": \"ca-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : me-central-1\",\n-                                        \"displayName\": \"Middle East (UAE)\",\n-                                        \"value\": \"me-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : me-south-1\",\n-                                        \"displayName\": \"Middle East (Bahrain)\",\n-                                        \"value\": \"me-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : af-south-1\",\n-                                        \"displayName\": \"Africa (Cape Town)\",\n-                                        \"value\": \"af-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-iso-east-1\",\n-                                        \"displayName\": \"US ISO East\",\n-                                        \"value\": \"us-iso-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-isob-east-1\",\n-                                        \"displayName\": \"US ISOB East (Ohio)\",\n-                                        \"value\": \"us-isob-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-iso-west-1\",\n-                                        \"displayName\": \"US ISO West\",\n-                                        \"value\": \"us-iso-west-1\"\n+                                        \"description\": \"Delete the blob only.\",\n+                                        \"displayName\": \"None\",\n+                                        \"value\": \"NONE\"\n                                     },\n                                     {\n-                                        \"description\": \"AWS Region Code : il-central-1\",\n-                                        \"displayName\": \"Israel (Tel Aviv)\",\n-                                        \"value\": \"il-central-1\"\n+                                        \"description\": \"Delete the blob and its snapshots.\",\n+                                        \"displayName\": \"Include Snapshots\",\n+                                        \"value\": \"INCLUDE\"\n                                     },\n                                     {\n-                                        \"description\": \"Uses 's3.region' FlowFile attribute as region.\",\n-                                        \"displayName\": \"Use 's3.region' Attribute\",\n-                                        \"value\": \"attribute-defined-region\"\n+                                        \"description\": \"Delete only the blob's snapshots.\",\n+                                        \"displayName\": \"Delete Snapshots Only\",\n+                                        \"value\": \"ONLY\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"us-west-2\",\n-                                \"description\": \"The AWS Region to connect to.\",\n-                                \"displayName\": \"Region\",\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\": \"Region\",\n+                                \"name\": \"delete-snapshots-option\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\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+                            \"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.SSLContextService\",\n+                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n                                     \"version\": \"2.0.0-M3\"\n                                 }\n                             },\n-                            \"Signer Override\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Default Signature\",\n-                                        \"value\": \"Default Signature\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Signature Version 4\",\n-                                        \"value\": \"AWSS3V4SignerType\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Signature Version 2\",\n-                                        \"value\": \"S3SignerType\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Custom Signature\",\n-                                        \"value\": \"CustomSignerType\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"Default Signature\",\n-                                \"description\": \"The AWS S3 library uses Signature Version 4 by default but this property allows you to specify the Version 2 signer to support older S3-compatible services or even to plug in your own custom signer implementation.\",\n-                                \"displayName\": \"Signer Override\",\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\": \"Signer Override\",\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\": \"2.0.0-M3\"\n+                                }\n+                            }\n+                        },\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.azure.storage.CopyAzureBlobStorage_v12\",\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                             },\n-                            \"append-tag\": {\n-                                \"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 tag will be appended to the existing set of tags on the S3 object. Any existing tags with the same key as the new tag will be updated with the specified value. If set to false, the existing tags will be removed and the new tag will be set on the S3 object.\",\n-                                \"displayName\": \"Append Tag\",\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+                        \"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+                        \"useCases\": [],\n+                        \"version\": \"2.0.0-M3\"\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-azure-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"f2215c6\"\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+                        \"multiProcessorUseCases\": [],\n+                        \"primaryNodeOnly\": false,\n+                        \"propertyDescriptors\": {\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\": \"append-tag\",\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\": \"2.0.0-M3\"\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\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"directory-name\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"custom-signer-class-name\": {\n+                            \"file-name\": {\n+                                \"defaultValue\": \"${azure.filename}\",\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"CustomSignerType\"\n+                                            \"file\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Signer Override\",\n-                                        \"propertyName\": \"Signer Override\"\n+                                        \"propertyDisplayName\": \"Filesystem Object Type\",\n+                                        \"propertyName\": \"filesystem-object-type\"\n                                     }\n                                 ],\n-                                \"description\": \"Fully qualified class name of the custom signer class. The signer must implement com.amazonaws.auth.Signer interface.\",\n-                                \"displayName\": \"Custom Signer Class Name\",\n+                                \"description\": \"The filename\",\n+                                \"displayName\": \"File Name\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"custom-signer-class-name\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"file-name\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"custom-signer-module-location\": {\n-                                \"dependencies\": [\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\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"filesystem-name\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"filesystem-object-type\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"CustomSignerType\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Signer Override\",\n-                                        \"propertyName\": \"Signer Override\"\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-                                \"description\": \"Comma-separated list of paths to files and/or directories which contain the custom signer's JAR file and its dependencies (if any).\",\n-                                \"displayName\": \"Custom Signer Module Location\",\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"custom-signer-module-location\",\n-                                \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"MULTIPLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\",\n-                                        \"DIRECTORY\"\n-                                    ]\n-                                },\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.\",\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\": \"2.0.0-M3\"\n                                 }\n-                            },\n-                            \"tag-key\": {\n-                                \"description\": \"The key of the tag that will be set on the S3 Object\",\n-                                \"displayName\": \"Tag Key\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"tag-key\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"tag-value\": {\n-                                \"description\": \"The value of the tag that will be set on the S3 Object\",\n-                                \"displayName\": \"Tag Value\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"tag-value\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"version\": {\n-                                \"description\": \"The Version of the Object to tag\",\n-                                \"displayName\": \"Version ID\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"version\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n                             }\n                         },\n                         \"seeAlso\": [\n-                            \"org.apache.nifi.processors.aws.s3.FetchS3Object\",\n-                            \"org.apache.nifi.processors.aws.s3.ListS3\",\n-                            \"org.apache.nifi.processors.aws.s3.PutS3Object\"\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\": \"FlowFiles are routed to this Relationship after they have been successfully processed.\",\n+                                \"description\": \"Files that have been successfully written to Azure storage are transferred to this relationship\",\n                                 \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"If the Processor is unable to process a given FlowFile, it 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                         ],\n-                        \"supportsBatching\": true,\n+                        \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"AWS\",\n-                            \"Amazon\",\n-                            \"Archive\",\n-                            \"S3\",\n-                            \"Tag\"\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.aws.s3.TagS3Object\",\n-                        \"typeDescription\": \"Adds or updates a tag on an Amazon S3 Object.\",\n+                        \"type\": \"org.apache.nifi.processors.azure.storage.DeleteAzureDataLakeStorage\",\n+                        \"typeDescription\": \"Deletes the provided file from Azure Data Lake Storage\",\n                         \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"The tags associated with the S3 object will be written as part of the FlowFile attributes\",\n-                                \"name\": \"s3.tag.___\"\n-                            },\n-                            {\n-                                \"description\": \"The class name of the exception thrown during processor execution\",\n-                                \"name\": \"s3.exception\"\n-                            },\n-                            {\n-                                \"description\": \"The S3 supplied detail from the failed operation\",\n-                                \"name\": \"s3.additionalDetails\"\n-                            },\n-                            {\n-                                \"description\": \"The HTTP error code (if available) from the failed operation\",\n-                                \"name\": \"s3.statusCode\"\n-                            },\n-                            {\n-                                \"description\": \"The S3 moniker of the failed operation\",\n-                                \"name\": \"s3.errorCode\"\n-                            },\n-                            {\n-                                \"description\": \"The S3 exception message from the failed operation\",\n-                                \"name\": \"s3.errorMessage\"\n-                            }\n-                        ]\n+                        \"version\": \"2.0.0-M3\"\n                     },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-aws-nar\",\n+                        \"artifact\": \"nifi-azure-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -90635,429 +93164,260 @@\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+                        \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"multiProcessorUseCases\": [\n                             {\n-                                \"description\": \"User specified dynamic Properties are added as attributes to the notification\",\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"name\": \"A name of an attribute to be added to the notification\",\n-                                \"value\": \"The attribute value\"\n+                                \"configurations\": [\n+                                    {\n+                                        \"configuration\": \"The \\\"Container Name\\\" property should be set to the name of the Blob Storage Container that files reside in.     If the flow being built is to be reused elsewhere, it's a good idea to parameterize this property by setting it to something like `#{AZURE_CONTAINER}`.\\n\\nThe \\\"Storage Credentials\\\" property should specify an instance of the AzureStorageCredentialsService_v12 in order to provide credentials for accessing the storage container.\\n\\nThe 'success' Relationship of this Processor is then connected to FetchAzureBlobStorage_v12.\\n\",\n+                                        \"processorClassName\": \"org.apache.nifi.processors.azure.storage.ListAzureBlobStorage_v12\"\n+                                    },\n+                                    {\n+                                        \"configuration\": \"\\\"Container Name\\\" = \\\"${azure.container}\\\"\\n\\\"Blob Name\\\" = \\\"${azure.blobname}\\\"\\n\\nThe \\\"Storage Credentials\\\" property should specify an instance of the AzureStorageCredentialsService_v12 in order to provide credentials for accessing the storage container.\\n\",\n+                                        \"processorClassName\": \"org.apache.nifi.processors.azure.storage.FetchAzureBlobStorage_v12\"\n+                                    }\n+                                ],\n+                                \"description\": \"Retrieve all files in an Azure Blob Storage container\",\n+                                \"keywords\": [\n+                                    \"azure\",\n+                                    \"blob\",\n+                                    \"storage\",\n+                                    \"state\",\n+                                    \"retrieve\",\n+                                    \"fetch\",\n+                                    \"all\",\n+                                    \"stream\"\n+                                ],\n+                                \"notes\": \"\"\n                             }\n                         ],\n-                        \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n-                        \"multiProcessorUseCases\": [],\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"ARN Type\": {\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\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Client-Side Encryption Key ID\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Client-Side Encryption Key Type\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"The ARN is the name of a topic\",\n-                                        \"displayName\": \"Topic ARN\",\n-                                        \"value\": \"Topic ARN\"\n+                                        \"description\": \"Client-Side Encryption disabled\",\n+                                        \"displayName\": \"NONE\",\n+                                        \"value\": \"NONE\"\n                                     },\n                                     {\n-                                        \"description\": \"The ARN is the name of a particular Target, used to notify a specific subscriber\",\n-                                        \"displayName\": \"Target ARN\",\n-                                        \"value\": \"Target ARN\"\n+                                        \"description\": \"Client-Side Encryption enabled using local key\",\n+                                        \"displayName\": \"LOCAL\",\n+                                        \"value\": \"LOCAL\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"Topic ARN\",\n-                                \"description\": \"The type of Amazon Resource Name that is being used.\",\n-                                \"displayName\": \"ARN Type\",\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\": \"ARN Type\",\n+                                \"name\": \"Client-Side Encryption Key Type\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"AWS Credentials Provider service\": {\n-                                \"description\": \"The Controller Service that is used to obtain AWS credentials provider\",\n-                                \"displayName\": \"AWS Credentials Provider Service\",\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\": \"AWS Credentials Provider service\",\n+                                \"name\": \"Client-Side Encryption Local Key\",\n                                 \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-aws-service-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.processors.aws.credentials.provider.service.AWSCredentialsProviderService\",\n-                                    \"version\": \"2.0.0-M3\"\n-                                }\n+                                \"sensitive\": true\n                             },\n-                            \"Amazon Resource Name (ARN)\": {\n-                                \"description\": \"The name of the resource to which notifications should be published\",\n-                                \"displayName\": \"Amazon Resource Name (ARN)\",\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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Amazon Resource Name (ARN)\",\n+                                \"name\": \"blob-name\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Character Set\": {\n-                                \"defaultValue\": \"UTF-8\",\n-                                \"description\": \"The character set in which the FlowFile's content is encoded\",\n-                                \"displayName\": \"Character Set\",\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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Character Set\",\n+                                \"name\": \"container-name\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Communications Timeout\": {\n-                                \"defaultValue\": \"30 secs\",\n-                                \"description\": \"\",\n-                                \"displayName\": \"Communications Timeout\",\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\": \"Communications Timeout\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Deduplication Message ID\": {\n-                                \"description\": \"The token used for deduplication of sent messages\",\n-                                \"displayName\": \"Deduplication Message ID\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Deduplication Message ID\",\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\": \"2.0.0-M3\"\n+                                }\n                             },\n-                            \"E-mail Subject\": {\n-                                \"description\": \"The optional subject to use for any subscribers that are subscribed via E-mail\",\n-                                \"displayName\": \"E-mail Subject\",\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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"E-mail Subject\",\n+                                \"name\": \"range-length\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Message Group ID\": {\n-                                \"description\": \"If using FIFO, the message group to which the flowFile belongs\",\n-                                \"displayName\": \"Message Group ID\",\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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Message Group ID\",\n+                                \"name\": \"range-start\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Region\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-gov-east-1\",\n-                                        \"displayName\": \"AWS GovCloud (US-East)\",\n-                                        \"value\": \"us-gov-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-gov-west-1\",\n-                                        \"displayName\": \"AWS GovCloud (US-West)\",\n-                                        \"value\": \"us-gov-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : af-south-1\",\n-                                        \"displayName\": \"Africa (Cape Town)\",\n-                                        \"value\": \"af-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-east-1\",\n-                                        \"displayName\": \"Asia Pacific (Hong Kong)\",\n-                                        \"value\": \"ap-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-south-2\",\n-                                        \"displayName\": \"Asia Pacific (Hyderabad)\",\n-                                        \"value\": \"ap-south-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-3\",\n-                                        \"displayName\": \"Asia Pacific (Jakarta)\",\n-                                        \"value\": \"ap-southeast-3\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-4\",\n-                                        \"displayName\": \"Asia Pacific (Melbourne)\",\n-                                        \"value\": \"ap-southeast-4\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-south-1\",\n-                                        \"displayName\": \"Asia Pacific (Mumbai)\",\n-                                        \"value\": \"ap-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-northeast-3\",\n-                                        \"displayName\": \"Asia Pacific (Osaka)\",\n-                                        \"value\": \"ap-northeast-3\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-northeast-2\",\n-                                        \"displayName\": \"Asia Pacific (Seoul)\",\n-                                        \"value\": \"ap-northeast-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-1\",\n-                                        \"displayName\": \"Asia Pacific (Singapore)\",\n-                                        \"value\": \"ap-southeast-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-2\",\n-                                        \"displayName\": \"Asia Pacific (Sydney)\",\n-                                        \"value\": \"ap-southeast-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-northeast-1\",\n-                                        \"displayName\": \"Asia Pacific (Tokyo)\",\n-                                        \"value\": \"ap-northeast-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ca-central-1\",\n-                                        \"displayName\": \"Canada (Central)\",\n-                                        \"value\": \"ca-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ca-west-1\",\n-                                        \"displayName\": \"Canada West (Calgary)\",\n-                                        \"value\": \"ca-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : cn-north-1\",\n-                                        \"displayName\": \"China (Beijing)\",\n-                                        \"value\": \"cn-north-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : cn-northwest-1\",\n-                                        \"displayName\": \"China (Ningxia)\",\n-                                        \"value\": \"cn-northwest-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-central-1\",\n-                                        \"displayName\": \"Europe (Frankfurt)\",\n-                                        \"value\": \"eu-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-west-1\",\n-                                        \"displayName\": \"Europe (Ireland)\",\n-                                        \"value\": \"eu-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-west-2\",\n-                                        \"displayName\": \"Europe (London)\",\n-                                        \"value\": \"eu-west-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-south-1\",\n-                                        \"displayName\": \"Europe (Milan)\",\n-                                        \"value\": \"eu-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-west-3\",\n-                                        \"displayName\": \"Europe (Paris)\",\n-                                        \"value\": \"eu-west-3\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-south-2\",\n-                                        \"displayName\": \"Europe (Spain)\",\n-                                        \"value\": \"eu-south-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-north-1\",\n-                                        \"displayName\": \"Europe (Stockholm)\",\n-                                        \"value\": \"eu-north-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-central-2\",\n-                                        \"displayName\": \"Europe (Zurich)\",\n-                                        \"value\": \"eu-central-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : il-central-1\",\n-                                        \"displayName\": \"Israel (Tel Aviv)\",\n-                                        \"value\": \"il-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : me-south-1\",\n-                                        \"displayName\": \"Middle East (Bahrain)\",\n-                                        \"value\": \"me-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : me-central-1\",\n-                                        \"displayName\": \"Middle East (UAE)\",\n-                                        \"value\": \"me-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : sa-east-1\",\n-                                        \"displayName\": \"South America (Sao Paulo)\",\n-                                        \"value\": \"sa-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-east-1\",\n-                                        \"displayName\": \"US East (N. Virginia)\",\n-                                        \"value\": \"us-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-east-2\",\n-                                        \"displayName\": \"US East (Ohio)\",\n-                                        \"value\": \"us-east-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-iso-east-1\",\n-                                        \"displayName\": \"US ISO East\",\n-                                        \"value\": \"us-iso-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-iso-west-1\",\n-                                        \"displayName\": \"US ISO WEST\",\n-                                        \"value\": \"us-iso-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-isob-east-1\",\n-                                        \"displayName\": \"US ISOB East (Ohio)\",\n-                                        \"value\": \"us-isob-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-west-1\",\n-                                        \"displayName\": \"US West (N. California)\",\n-                                        \"value\": \"us-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-west-2\",\n-                                        \"displayName\": \"US West (Oregon)\",\n-                                        \"value\": \"us-west-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : aws-cn-global\",\n-                                        \"displayName\": \"aws-cn-global\",\n-                                        \"value\": \"aws-cn-global\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : aws-global\",\n-                                        \"displayName\": \"aws-global\",\n-                                        \"value\": \"aws-global\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : aws-iso-b-global\",\n-                                        \"displayName\": \"aws-iso-b-global\",\n-                                        \"value\": \"aws-iso-b-global\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : aws-iso-global\",\n-                                        \"displayName\": \"aws-iso-global\",\n-                                        \"value\": \"aws-iso-global\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : aws-us-gov-global\",\n-                                        \"displayName\": \"aws-us-gov-global\",\n-                                        \"value\": \"aws-us-gov-global\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"us-west-2\",\n-                                \"description\": \"\",\n-                                \"displayName\": \"Region\",\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\": \"Region\",\n+                                \"name\": \"storage-credentials-service\",\n                                 \"required\": true,\n-                                \"sensitive\": false\n-                            },\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\": \"SSL Context 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_v12\",\n                                     \"version\": \"2.0.0-M3\"\n                                 }\n-                            },\n-                            \"Use JSON Structure\": {\n-                                \"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 FlowFile must be JSON with a top-level element named 'default'. Additional elements can be used to send different messages to different protocols. See the Amazon SNS Documentation for more information.\",\n-                                \"displayName\": \"Use JSON Structure\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Use JSON Structure\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n                             }\n                         },\n                         \"seeAlso\": [\n-                            \"org.apache.nifi.processors.aws.sqs.GetSQS\",\n-                            \"org.apache.nifi.processors.aws.sqs.PutSQS\"\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\": \"FlowFiles are routed to success relationship\",\n+                                \"description\": \"All successfully processed FlowFiles are routed to this relationship\",\n                                 \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"FlowFiles are routed to failure 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                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"amazon\",\n-                            \"aws\",\n-                            \"publish\",\n-                            \"pubsub\",\n-                            \"put\",\n-                            \"sns\",\n-                            \"topic\"\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.aws.sns.PutSNS\",\n-                        \"typeDescription\": \"Sends the content of a FlowFile as a notification to the Amazon Simple Notification Service\",\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                         \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\"\n+                        \"version\": \"2.0.0-M3\",\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\": \"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                     },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-aws-nar\",\n+                        \"artifact\": \"nifi-azure-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -91067,2106 +93427,863 @@\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-                        \"multiProcessorUseCases\": [],\n+                        \"multiProcessorUseCases\": [\n+                            {\n+                                \"configurations\": [\n+                                    {\n+                                        \"configuration\": \"The \\\"Filesystem Name\\\" property should be set to the name of the Azure Filesystem (also known as a Container) that files reside in.     If the flow being built is to be reused elsewhere, it's a good idea to parameterize this property by setting it to something like `#{AZURE_FILESYSTEM}`.\\nConfigure the \\\"Directory Name\\\" property to specify the name of the directory in the file system.     If the flow being built is to be reused elsewhere, it's a good idea to parameterize this property by setting it to something like `#{AZURE_DIRECTORY}`.\\n\\nThe \\\"ADLS Credentials\\\" property should specify an instance of the ADLSCredentialsService in order to provide credentials for accessing the filesystem.\\n\\nThe 'success' Relationship of this Processor is then connected to FetchAzureDataLakeStorage.\\n\",\n+                                        \"processorClassName\": \"org.apache.nifi.processors.azure.storage.ListAzureDataLakeStorage\"\n+                                    },\n+                                    {\n+                                        \"configuration\": \"\\\"Filesystem Name\\\" = \\\"${azure.filesystem}\\\"\\n\\\"Directory Name\\\" = \\\"${azure.directory}\\\"\\n\\\"File Name\\\" = \\\"${azure.filename}\\\"\\n\\nThe \\\"ADLS Credentials\\\" property should specify an instance of the ADLSCredentialsService in order to provide credentials for accessing the filesystem.\\n\",\n+                                        \"processorClassName\": \"org.apache.nifi.processors.azure.storage.FetchAzureDataLakeStorage\"\n+                                    }\n+                                ],\n+                                \"description\": \"Retrieve all files in an Azure DataLake Storage directory\",\n+                                \"keywords\": [\n+                                    \"azure\",\n+                                    \"datalake\",\n+                                    \"adls\",\n+                                    \"state\",\n+                                    \"retrieve\",\n+                                    \"fetch\",\n+                                    \"all\",\n+                                    \"stream\"\n+                                ],\n+                                \"notes\": \"\"\n+                            }\n+                        ],\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"AWS Credentials Provider service\": {\n-                                \"description\": \"The Controller Service that is used to obtain AWS credentials provider\",\n-                                \"displayName\": \"AWS Credentials Provider 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\": \"AWS Credentials Provider service\",\n+                                \"name\": \"adls-credentials-service\",\n                                 \"required\": true,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-aws-service-api-nar\",\n+                                    \"artifact\": \"nifi-azure-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.processors.aws.credentials.provider.service.AWSCredentialsProviderService\",\n+                                    \"type\": \"org.apache.nifi.services.azure.storage.ADLSCredentialsService\",\n                                     \"version\": \"2.0.0-M3\"\n                                 }\n                             },\n-                            \"Communications Timeout\": {\n-                                \"defaultValue\": \"30 secs\",\n-                                \"description\": \"\",\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-                            \"Endpoint Override URL\": {\n-                                \"description\": \"Endpoint URL to use instead of the AWS default including scheme, host, port, and path. The AWS libraries select an endpoint URL based on the AWS region, but this property overrides the selected endpoint URL, allowing use with other S3-compatible endpoints.\",\n-                                \"displayName\": \"Endpoint Override URL\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Endpoint Override URL\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Queue URL\": {\n-                                \"description\": \"The URL of the queue delete from\",\n-                                \"displayName\": \"Queue URL\",\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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Queue URL\",\n+                                \"name\": \"directory-name\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Receipt Handle\": {\n-                                \"defaultValue\": \"${sqs.receipt.handle}\",\n-                                \"description\": \"The identifier that specifies the receipt of the message\",\n-                                \"displayName\": \"Receipt Handle\",\n+                            \"file-name\": {\n+                                \"defaultValue\": \"${azure.filename}\",\n+                                \"description\": \"The filename\",\n+                                \"displayName\": \"File Name\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Receipt Handle\",\n+                                \"name\": \"file-name\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Region\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-gov-east-1\",\n-                                        \"displayName\": \"AWS GovCloud (US-East)\",\n-                                        \"value\": \"us-gov-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-gov-west-1\",\n-                                        \"displayName\": \"AWS GovCloud (US-West)\",\n-                                        \"value\": \"us-gov-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : af-south-1\",\n-                                        \"displayName\": \"Africa (Cape Town)\",\n-                                        \"value\": \"af-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-east-1\",\n-                                        \"displayName\": \"Asia Pacific (Hong Kong)\",\n-                                        \"value\": \"ap-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-south-2\",\n-                                        \"displayName\": \"Asia Pacific (Hyderabad)\",\n-                                        \"value\": \"ap-south-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-3\",\n-                                        \"displayName\": \"Asia Pacific (Jakarta)\",\n-                                        \"value\": \"ap-southeast-3\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-4\",\n-                                        \"displayName\": \"Asia Pacific (Melbourne)\",\n-                                        \"value\": \"ap-southeast-4\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-south-1\",\n-                                        \"displayName\": \"Asia Pacific (Mumbai)\",\n-                                        \"value\": \"ap-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-northeast-3\",\n-                                        \"displayName\": \"Asia Pacific (Osaka)\",\n-                                        \"value\": \"ap-northeast-3\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-northeast-2\",\n-                                        \"displayName\": \"Asia Pacific (Seoul)\",\n-                                        \"value\": \"ap-northeast-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-1\",\n-                                        \"displayName\": \"Asia Pacific (Singapore)\",\n-                                        \"value\": \"ap-southeast-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-2\",\n-                                        \"displayName\": \"Asia Pacific (Sydney)\",\n-                                        \"value\": \"ap-southeast-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-northeast-1\",\n-                                        \"displayName\": \"Asia Pacific (Tokyo)\",\n-                                        \"value\": \"ap-northeast-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ca-central-1\",\n-                                        \"displayName\": \"Canada (Central)\",\n-                                        \"value\": \"ca-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ca-west-1\",\n-                                        \"displayName\": \"Canada West (Calgary)\",\n-                                        \"value\": \"ca-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : cn-north-1\",\n-                                        \"displayName\": \"China (Beijing)\",\n-                                        \"value\": \"cn-north-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : cn-northwest-1\",\n-                                        \"displayName\": \"China (Ningxia)\",\n-                                        \"value\": \"cn-northwest-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-central-1\",\n-                                        \"displayName\": \"Europe (Frankfurt)\",\n-                                        \"value\": \"eu-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-west-1\",\n-                                        \"displayName\": \"Europe (Ireland)\",\n-                                        \"value\": \"eu-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-west-2\",\n-                                        \"displayName\": \"Europe (London)\",\n-                                        \"value\": \"eu-west-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-south-1\",\n-                                        \"displayName\": \"Europe (Milan)\",\n-                                        \"value\": \"eu-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-west-3\",\n-                                        \"displayName\": \"Europe (Paris)\",\n-                                        \"value\": \"eu-west-3\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-south-2\",\n-                                        \"displayName\": \"Europe (Spain)\",\n-                                        \"value\": \"eu-south-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-north-1\",\n-                                        \"displayName\": \"Europe (Stockholm)\",\n-                                        \"value\": \"eu-north-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-central-2\",\n-                                        \"displayName\": \"Europe (Zurich)\",\n-                                        \"value\": \"eu-central-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : il-central-1\",\n-                                        \"displayName\": \"Israel (Tel Aviv)\",\n-                                        \"value\": \"il-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : me-south-1\",\n-                                        \"displayName\": \"Middle East (Bahrain)\",\n-                                        \"value\": \"me-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : me-central-1\",\n-                                        \"displayName\": \"Middle East (UAE)\",\n-                                        \"value\": \"me-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : sa-east-1\",\n-                                        \"displayName\": \"South America (Sao Paulo)\",\n-                                        \"value\": \"sa-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-east-1\",\n-                                        \"displayName\": \"US East (N. Virginia)\",\n-                                        \"value\": \"us-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-east-2\",\n-                                        \"displayName\": \"US East (Ohio)\",\n-                                        \"value\": \"us-east-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-iso-east-1\",\n-                                        \"displayName\": \"US ISO East\",\n-                                        \"value\": \"us-iso-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-iso-west-1\",\n-                                        \"displayName\": \"US ISO WEST\",\n-                                        \"value\": \"us-iso-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-isob-east-1\",\n-                                        \"displayName\": \"US ISOB East (Ohio)\",\n-                                        \"value\": \"us-isob-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-west-1\",\n-                                        \"displayName\": \"US West (N. California)\",\n-                                        \"value\": \"us-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-west-2\",\n-                                        \"displayName\": \"US West (Oregon)\",\n-                                        \"value\": \"us-west-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : aws-cn-global\",\n-                                        \"displayName\": \"aws-cn-global\",\n-                                        \"value\": \"aws-cn-global\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : aws-global\",\n-                                        \"displayName\": \"aws-global\",\n-                                        \"value\": \"aws-global\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : aws-iso-b-global\",\n-                                        \"displayName\": \"aws-iso-b-global\",\n-                                        \"value\": \"aws-iso-b-global\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : aws-iso-global\",\n-                                        \"displayName\": \"aws-iso-global\",\n-                                        \"value\": \"aws-iso-global\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : aws-us-gov-global\",\n-                                        \"displayName\": \"aws-us-gov-global\",\n-                                        \"value\": \"aws-us-gov-global\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"us-west-2\",\n-                                \"description\": \"\",\n-                                \"displayName\": \"Region\",\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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Region\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"filesystem-name\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\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+                            \"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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"SSL Context Service\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"number-of-retries\",\n                                 \"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\": \"2.0.0-M3\"\n-                                }\n+                                \"sensitive\": false\n                             },\n                             \"proxy-configuration-service\": {\n-                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests.\",\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\": \"2.0.0-M3\"\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\": \"Environment variables 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\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"range-start\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n                             }\n                         },\n                         \"seeAlso\": [\n-                            \"org.apache.nifi.processors.aws.sqs.GetSQS\",\n-                            \"org.apache.nifi.processors.aws.sqs.PutSQS\"\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\": \"FlowFiles are routed to success relationship\",\n+                                \"description\": \"Files that have been successfully written to Azure storage are transferred to this relationship\",\n                                 \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"FlowFiles are routed to failure 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                         ],\n-                        \"supportsBatching\": true,\n+                        \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"AWS\",\n-                            \"Amazon\",\n-                            \"Delete\",\n-                            \"Queue\",\n-                            \"SQS\"\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.aws.sqs.DeleteSQS\",\n-                        \"typeDescription\": \"Deletes a message from an Amazon Simple Queuing Service Queue\",\n+                        \"type\": \"org.apache.nifi.processors.azure.storage.FetchAzureDataLakeStorage\",\n+                        \"typeDescription\": \"Fetch the specified file from Azure Data Lake Storage\",\n                         \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\"\n+                        \"version\": \"2.0.0-M3\",\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+                            {\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-aws-nar\",\n+                        \"artifact\": \"nifi-azure-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\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_FORBIDDEN\",\n                         \"multiProcessorUseCases\": [],\n-                        \"primaryNodeOnly\": false,\n+                        \"primaryNodeOnly\": true,\n                         \"propertyDescriptors\": {\n-                            \"AWS Credentials Provider service\": {\n-                                \"description\": \"The Controller Service that is used to obtain AWS credentials provider\",\n-                                \"displayName\": \"AWS Credentials Provider Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"AWS Credentials Provider service\",\n-                                \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-aws-service-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.processors.aws.credentials.provider.service.AWSCredentialsProviderService\",\n-                                    \"version\": \"2.0.0-M3\"\n-                                }\n-                            },\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\": \"Specifies whether the messages should be automatically deleted by the processors once they have been received.\",\n-                                \"displayName\": \"Auto Delete Messages\",\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\": \"Auto Delete Messages\",\n-                                \"required\": true,\n+                                \"name\": \"Maximum File Age\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Batch Size\": {\n-                                \"defaultValue\": \"10\",\n-                                \"description\": \"The maximum number of messages to send in a single network request\",\n-                                \"displayName\": \"Batch Size\",\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\": \"Batch Size\",\n-                                \"required\": true,\n+                                \"name\": \"Maximum File Size\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Character Set\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Big5\",\n-                                        \"value\": \"Big5\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Big5-HKSCS\",\n-                                        \"value\": \"Big5-HKSCS\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"CESU-8\",\n-                                        \"value\": \"CESU-8\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"EUC-JP\",\n-                                        \"value\": \"EUC-JP\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"EUC-KR\",\n-                                        \"value\": \"EUC-KR\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"GB18030\",\n-                                        \"value\": \"GB18030\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"GB2312\",\n-                                        \"value\": \"GB2312\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"GBK\",\n-                                        \"value\": \"GBK\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"IBM-Thai\",\n-                                        \"value\": \"IBM-Thai\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"IBM00858\",\n-                                        \"value\": \"IBM00858\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"IBM01140\",\n-                                        \"value\": \"IBM01140\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"IBM01141\",\n-                                        \"value\": \"IBM01141\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"IBM01142\",\n-                                        \"value\": \"IBM01142\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"IBM01143\",\n-                                        \"value\": \"IBM01143\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"IBM01144\",\n-                                        \"value\": \"IBM01144\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"IBM01145\",\n-                                        \"value\": \"IBM01145\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"IBM01146\",\n-                                        \"value\": \"IBM01146\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"IBM01147\",\n-                                        \"value\": \"IBM01147\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"IBM01148\",\n-                                        \"value\": \"IBM01148\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"IBM01149\",\n-                                        \"value\": \"IBM01149\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"IBM037\",\n-                                        \"value\": \"IBM037\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"IBM1026\",\n-                                        \"value\": \"IBM1026\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"IBM1047\",\n-                                        \"value\": \"IBM1047\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"IBM273\",\n-                                        \"value\": \"IBM273\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"IBM277\",\n-                                        \"value\": \"IBM277\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"IBM278\",\n-                                        \"value\": \"IBM278\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"IBM280\",\n-                                        \"value\": \"IBM280\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"IBM284\",\n-                                        \"value\": \"IBM284\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"IBM285\",\n-                                        \"value\": \"IBM285\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"IBM290\",\n-                                        \"value\": \"IBM290\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"IBM297\",\n-                                        \"value\": \"IBM297\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"IBM420\",\n-                                        \"value\": \"IBM420\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"IBM424\",\n-                                        \"value\": \"IBM424\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"IBM437\",\n-                                        \"value\": \"IBM437\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"IBM500\",\n-                                        \"value\": \"IBM500\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"IBM775\",\n-                                        \"value\": \"IBM775\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"IBM850\",\n-                                        \"value\": \"IBM850\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"IBM852\",\n-                                        \"value\": \"IBM852\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"IBM855\",\n-                                        \"value\": \"IBM855\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"IBM857\",\n-                                        \"value\": \"IBM857\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"IBM860\",\n-                                        \"value\": \"IBM860\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"IBM861\",\n-                                        \"value\": \"IBM861\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"IBM862\",\n-                                        \"value\": \"IBM862\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"IBM863\",\n-                                        \"value\": \"IBM863\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"IBM864\",\n-                                        \"value\": \"IBM864\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"IBM865\",\n-                                        \"value\": \"IBM865\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"IBM866\",\n-                                        \"value\": \"IBM866\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"IBM868\",\n-                                        \"value\": \"IBM868\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"IBM869\",\n-                                        \"value\": \"IBM869\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"IBM870\",\n-                                        \"value\": \"IBM870\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"IBM871\",\n-                                        \"value\": \"IBM871\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"IBM918\",\n-                                        \"value\": \"IBM918\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"ISO-2022-CN\",\n-                                        \"value\": \"ISO-2022-CN\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"ISO-2022-JP\",\n-                                        \"value\": \"ISO-2022-JP\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"ISO-2022-JP-2\",\n-                                        \"value\": \"ISO-2022-JP-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"ISO-2022-KR\",\n-                                        \"value\": \"ISO-2022-KR\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"ISO-8859-1\",\n-                                        \"value\": \"ISO-8859-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"ISO-8859-13\",\n-                                        \"value\": \"ISO-8859-13\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"ISO-8859-15\",\n-                                        \"value\": \"ISO-8859-15\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"ISO-8859-16\",\n-                                        \"value\": \"ISO-8859-16\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"ISO-8859-2\",\n-                                        \"value\": \"ISO-8859-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"ISO-8859-3\",\n-                                        \"value\": \"ISO-8859-3\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"ISO-8859-4\",\n-                                        \"value\": \"ISO-8859-4\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"ISO-8859-5\",\n-                                        \"value\": \"ISO-8859-5\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"ISO-8859-6\",\n-                                        \"value\": \"ISO-8859-6\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"ISO-8859-7\",\n-                                        \"value\": \"ISO-8859-7\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"ISO-8859-8\",\n-                                        \"value\": \"ISO-8859-8\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"ISO-8859-9\",\n-                                        \"value\": \"ISO-8859-9\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"JIS_X0201\",\n-                                        \"value\": \"JIS_X0201\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"JIS_X0212-1990\",\n-                                        \"value\": \"JIS_X0212-1990\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"KOI8-R\",\n-                                        \"value\": \"KOI8-R\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"KOI8-U\",\n-                                        \"value\": \"KOI8-U\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Shift_JIS\",\n-                                        \"value\": \"Shift_JIS\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"TIS-620\",\n-                                        \"value\": \"TIS-620\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"US-ASCII\",\n-                                        \"value\": \"US-ASCII\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"UTF-16\",\n-                                        \"value\": \"UTF-16\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"UTF-16BE\",\n-                                        \"value\": \"UTF-16BE\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"UTF-16LE\",\n-                                        \"value\": \"UTF-16LE\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"UTF-32\",\n-                                        \"value\": \"UTF-32\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"UTF-32BE\",\n-                                        \"value\": \"UTF-32BE\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"UTF-32LE\",\n-                                        \"value\": \"UTF-32LE\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"UTF-8\",\n-                                        \"value\": \"UTF-8\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"windows-1250\",\n-                                        \"value\": \"windows-1250\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"windows-1251\",\n-                                        \"value\": \"windows-1251\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"windows-1252\",\n-                                        \"value\": \"windows-1252\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"windows-1253\",\n-                                        \"value\": \"windows-1253\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"windows-1254\",\n-                                        \"value\": \"windows-1254\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"windows-1255\",\n-                                        \"value\": \"windows-1255\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"windows-1256\",\n-                                        \"value\": \"windows-1256\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"windows-1257\",\n-                                        \"value\": \"windows-1257\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"windows-1258\",\n-                                        \"value\": \"windows-1258\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"windows-31j\",\n-                                        \"value\": \"windows-31j\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"x-Big5-HKSCS-2001\",\n-                                        \"value\": \"x-Big5-HKSCS-2001\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"x-Big5-Solaris\",\n-                                        \"value\": \"x-Big5-Solaris\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"x-euc-jp-linux\",\n-                                        \"value\": \"x-euc-jp-linux\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"x-EUC-TW\",\n-                                        \"value\": \"x-EUC-TW\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"x-eucJP-Open\",\n-                                        \"value\": \"x-eucJP-Open\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"x-IBM1006\",\n-                                        \"value\": \"x-IBM1006\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"x-IBM1025\",\n-                                        \"value\": \"x-IBM1025\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"x-IBM1046\",\n-                                        \"value\": \"x-IBM1046\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"x-IBM1097\",\n-                                        \"value\": \"x-IBM1097\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"x-IBM1098\",\n-                                        \"value\": \"x-IBM1098\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"x-IBM1112\",\n-                                        \"value\": \"x-IBM1112\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"x-IBM1122\",\n-                                        \"value\": \"x-IBM1122\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"x-IBM1123\",\n-                                        \"value\": \"x-IBM1123\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"x-IBM1124\",\n-                                        \"value\": \"x-IBM1124\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"x-IBM1129\",\n-                                        \"value\": \"x-IBM1129\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"x-IBM1166\",\n-                                        \"value\": \"x-IBM1166\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"x-IBM1364\",\n-                                        \"value\": \"x-IBM1364\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"x-IBM1381\",\n-                                        \"value\": \"x-IBM1381\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"x-IBM1383\",\n-                                        \"value\": \"x-IBM1383\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"x-IBM29626C\",\n-                                        \"value\": \"x-IBM29626C\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"x-IBM300\",\n-                                        \"value\": \"x-IBM300\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"x-IBM33722\",\n-                                        \"value\": \"x-IBM33722\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"x-IBM737\",\n-                                        \"value\": \"x-IBM737\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"x-IBM833\",\n-                                        \"value\": \"x-IBM833\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"x-IBM834\",\n-                                        \"value\": \"x-IBM834\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"x-IBM856\",\n-                                        \"value\": \"x-IBM856\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"x-IBM874\",\n-                                        \"value\": \"x-IBM874\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"x-IBM875\",\n-                                        \"value\": \"x-IBM875\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"x-IBM921\",\n-                                        \"value\": \"x-IBM921\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"x-IBM922\",\n-                                        \"value\": \"x-IBM922\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"x-IBM930\",\n-                                        \"value\": \"x-IBM930\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"x-IBM933\",\n-                                        \"value\": \"x-IBM933\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"x-IBM935\",\n-                                        \"value\": \"x-IBM935\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"x-IBM937\",\n-                                        \"value\": \"x-IBM937\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"x-IBM939\",\n-                                        \"value\": \"x-IBM939\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"x-IBM942\",\n-                                        \"value\": \"x-IBM942\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"x-IBM942C\",\n-                                        \"value\": \"x-IBM942C\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"x-IBM943\",\n-                                        \"value\": \"x-IBM943\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"x-IBM943C\",\n-                                        \"value\": \"x-IBM943C\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"x-IBM948\",\n-                                        \"value\": \"x-IBM948\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"x-IBM949\",\n-                                        \"value\": \"x-IBM949\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"x-IBM949C\",\n-                                        \"value\": \"x-IBM949C\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"x-IBM950\",\n-                                        \"value\": \"x-IBM950\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"x-IBM964\",\n-                                        \"value\": \"x-IBM964\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"x-IBM970\",\n-                                        \"value\": \"x-IBM970\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"x-ISCII91\",\n-                                        \"value\": \"x-ISCII91\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"x-ISO-2022-CN-CNS\",\n-                                        \"value\": \"x-ISO-2022-CN-CNS\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"x-ISO-2022-CN-GB\",\n-                                        \"value\": \"x-ISO-2022-CN-GB\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"x-iso-8859-11\",\n-                                        \"value\": \"x-iso-8859-11\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"x-JIS0208\",\n-                                        \"value\": \"x-JIS0208\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"x-JISAutoDetect\",\n-                                        \"value\": \"x-JISAutoDetect\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"x-Johab\",\n-                                        \"value\": \"x-Johab\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"x-MacArabic\",\n-                                        \"value\": \"x-MacArabic\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"x-MacCentralEurope\",\n-                                        \"value\": \"x-MacCentralEurope\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"x-MacCroatian\",\n-                                        \"value\": \"x-MacCroatian\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"x-MacCyrillic\",\n-                                        \"value\": \"x-MacCyrillic\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"x-MacDingbat\",\n-                                        \"value\": \"x-MacDingbat\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"x-MacGreek\",\n-                                        \"value\": \"x-MacGreek\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"x-MacHebrew\",\n-                                        \"value\": \"x-MacHebrew\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"x-MacIceland\",\n-                                        \"value\": \"x-MacIceland\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"x-MacRoman\",\n-                                        \"value\": \"x-MacRoman\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"x-MacRomania\",\n-                                        \"value\": \"x-MacRomania\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"x-MacSymbol\",\n-                                        \"value\": \"x-MacSymbol\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"x-MacThai\",\n-                                        \"value\": \"x-MacThai\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"x-MacTurkish\",\n-                                        \"value\": \"x-MacTurkish\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"x-MacUkraine\",\n-                                        \"value\": \"x-MacUkraine\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"x-MS932_0213\",\n-                                        \"value\": \"x-MS932_0213\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"x-MS950-HKSCS\",\n-                                        \"value\": \"x-MS950-HKSCS\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"x-MS950-HKSCS-XP\",\n-                                        \"value\": \"x-MS950-HKSCS-XP\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"x-mswin-936\",\n-                                        \"value\": \"x-mswin-936\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"x-PCK\",\n-                                        \"value\": \"x-PCK\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"x-SJIS_0213\",\n-                                        \"value\": \"x-SJIS_0213\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"x-UTF-16LE-BOM\",\n-                                        \"value\": \"x-UTF-16LE-BOM\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"X-UTF-32BE-BOM\",\n-                                        \"value\": \"X-UTF-32BE-BOM\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"X-UTF-32LE-BOM\",\n-                                        \"value\": \"X-UTF-32LE-BOM\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"x-windows-50220\",\n-                                        \"value\": \"x-windows-50220\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"x-windows-50221\",\n-                                        \"value\": \"x-windows-50221\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"x-windows-874\",\n-                                        \"value\": \"x-windows-874\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"x-windows-949\",\n-                                        \"value\": \"x-windows-949\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"x-windows-950\",\n-                                        \"value\": \"x-windows-950\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"x-windows-iso2022jp\",\n-                                        \"value\": \"x-windows-iso2022jp\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"UTF-8\",\n-                                \"description\": \"The Character Set that should be used to encode the textual content of the SQS message\",\n-                                \"displayName\": \"Character Set\",\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\": \"Character Set\",\n+                                \"name\": \"Minimum File Age\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Communications Timeout\": {\n-                                \"defaultValue\": \"30 secs\",\n-                                \"description\": \"\",\n-                                \"displayName\": \"Communications 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\": \"Communications Timeout\",\n+                                \"name\": \"Minimum File Size\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Endpoint Override URL\": {\n-                                \"description\": \"Endpoint URL to use instead of the AWS default including scheme, host, port, and path. The AWS libraries select an endpoint URL based on the AWS region, but this property overrides the selected endpoint URL, allowing use with other S3-compatible endpoints.\",\n-                                \"displayName\": \"Endpoint Override URL\",\n+                            \"blob-name-prefix\": {\n+                                \"description\": \"Search prefix for listing\",\n+                                \"displayName\": \"Blob Name Prefix\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Endpoint Override URL\",\n+                                \"name\": \"blob-name-prefix\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Queue URL\": {\n-                                \"description\": \"The URL of the queue to get messages from\",\n-                                \"displayName\": \"Queue URL\",\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\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Queue URL\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Receive Message Wait Time\": {\n-                                \"defaultValue\": \"0 sec\",\n-                                \"description\": \"The maximum amount of time to wait on a long polling receive call. Setting this to a value of 1 second or greater will reduce the number of SQS requests and decrease fetch latency at the cost of a constantly active thread.\",\n-                                \"displayName\": \"Receive Message Wait Time\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Receive Message Wait Time\",\n+                                \"name\": \"container-name\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Region\": {\n+                            \"et-initial-listing-target\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"AWS Region Code : us-gov-east-1\",\n-                                        \"displayName\": \"AWS GovCloud (US-East)\",\n-                                        \"value\": \"us-gov-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-gov-west-1\",\n-                                        \"displayName\": \"AWS GovCloud (US-West)\",\n-                                        \"value\": \"us-gov-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : af-south-1\",\n-                                        \"displayName\": \"Africa (Cape Town)\",\n-                                        \"value\": \"af-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-east-1\",\n-                                        \"displayName\": \"Asia Pacific (Hong Kong)\",\n-                                        \"value\": \"ap-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-south-2\",\n-                                        \"displayName\": \"Asia Pacific (Hyderabad)\",\n-                                        \"value\": \"ap-south-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-3\",\n-                                        \"displayName\": \"Asia Pacific (Jakarta)\",\n-                                        \"value\": \"ap-southeast-3\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-4\",\n-                                        \"displayName\": \"Asia Pacific (Melbourne)\",\n-                                        \"value\": \"ap-southeast-4\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-south-1\",\n-                                        \"displayName\": \"Asia Pacific (Mumbai)\",\n-                                        \"value\": \"ap-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-northeast-3\",\n-                                        \"displayName\": \"Asia Pacific (Osaka)\",\n-                                        \"value\": \"ap-northeast-3\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-northeast-2\",\n-                                        \"displayName\": \"Asia Pacific (Seoul)\",\n-                                        \"value\": \"ap-northeast-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-1\",\n-                                        \"displayName\": \"Asia Pacific (Singapore)\",\n-                                        \"value\": \"ap-southeast-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-2\",\n-                                        \"displayName\": \"Asia Pacific (Sydney)\",\n-                                        \"value\": \"ap-southeast-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-northeast-1\",\n-                                        \"displayName\": \"Asia Pacific (Tokyo)\",\n-                                        \"value\": \"ap-northeast-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ca-central-1\",\n-                                        \"displayName\": \"Canada (Central)\",\n-                                        \"value\": \"ca-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ca-west-1\",\n-                                        \"displayName\": \"Canada West (Calgary)\",\n-                                        \"value\": \"ca-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : cn-north-1\",\n-                                        \"displayName\": \"China (Beijing)\",\n-                                        \"value\": \"cn-north-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : cn-northwest-1\",\n-                                        \"displayName\": \"China (Ningxia)\",\n-                                        \"value\": \"cn-northwest-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-central-1\",\n-                                        \"displayName\": \"Europe (Frankfurt)\",\n-                                        \"value\": \"eu-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-west-1\",\n-                                        \"displayName\": \"Europe (Ireland)\",\n-                                        \"value\": \"eu-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-west-2\",\n-                                        \"displayName\": \"Europe (London)\",\n-                                        \"value\": \"eu-west-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-south-1\",\n-                                        \"displayName\": \"Europe (Milan)\",\n-                                        \"value\": \"eu-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-west-3\",\n-                                        \"displayName\": \"Europe (Paris)\",\n-                                        \"value\": \"eu-west-3\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-south-2\",\n-                                        \"displayName\": \"Europe (Spain)\",\n-                                        \"value\": \"eu-south-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-north-1\",\n-                                        \"displayName\": \"Europe (Stockholm)\",\n-                                        \"value\": \"eu-north-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-central-2\",\n-                                        \"displayName\": \"Europe (Zurich)\",\n-                                        \"value\": \"eu-central-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : il-central-1\",\n-                                        \"displayName\": \"Israel (Tel Aviv)\",\n-                                        \"value\": \"il-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : me-south-1\",\n-                                        \"displayName\": \"Middle East (Bahrain)\",\n-                                        \"value\": \"me-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : me-central-1\",\n-                                        \"displayName\": \"Middle East (UAE)\",\n-                                        \"value\": \"me-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : sa-east-1\",\n-                                        \"displayName\": \"South America (Sao Paulo)\",\n-                                        \"value\": \"sa-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-east-1\",\n-                                        \"displayName\": \"US East (N. Virginia)\",\n-                                        \"value\": \"us-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-east-2\",\n-                                        \"displayName\": \"US East (Ohio)\",\n-                                        \"value\": \"us-east-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-iso-east-1\",\n-                                        \"displayName\": \"US ISO East\",\n-                                        \"value\": \"us-iso-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-iso-west-1\",\n-                                        \"displayName\": \"US ISO WEST\",\n-                                        \"value\": \"us-iso-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-isob-east-1\",\n-                                        \"displayName\": \"US ISOB East (Ohio)\",\n-                                        \"value\": \"us-isob-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-west-1\",\n-                                        \"displayName\": \"US West (N. California)\",\n-                                        \"value\": \"us-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-west-2\",\n-                                        \"displayName\": \"US West (Oregon)\",\n-                                        \"value\": \"us-west-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : aws-cn-global\",\n-                                        \"displayName\": \"aws-cn-global\",\n-                                        \"value\": \"aws-cn-global\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : aws-global\",\n-                                        \"displayName\": \"aws-global\",\n-                                        \"value\": \"aws-global\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : aws-iso-b-global\",\n-                                        \"displayName\": \"aws-iso-b-global\",\n-                                        \"value\": \"aws-iso-b-global\"\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\": \"AWS Region Code : aws-iso-global\",\n-                                        \"displayName\": \"aws-iso-global\",\n-                                        \"value\": \"aws-iso-global\"\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-                                        \"description\": \"AWS Region Code : aws-us-gov-global\",\n-                                        \"displayName\": \"aws-us-gov-global\",\n-                                        \"value\": \"aws-us-gov-global\"\n+                                        \"dependentValues\": [\n+                                            \"entities\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Listing Strategy\",\n+                                        \"propertyName\": \"listing-strategy\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"us-west-2\",\n-                                \"description\": \"\",\n-                                \"displayName\": \"Region\",\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\": \"Region\",\n-                                \"required\": true,\n+                                \"name\": \"et-initial-listing-target\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\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+                            \"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\": \"2.0.0-M3\"\n                                 }\n                             },\n-                            \"Visibility Timeout\": {\n-                                \"defaultValue\": \"15 mins\",\n-                                \"description\": \"The amount of time after a message is received but not deleted that the message is hidden from other consumers\",\n-                                \"displayName\": \"Visibility Timeout\",\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"et-time-window\",\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 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\": \"Visibility Timeout\",\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.\",\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+                                \"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\": \"2.0.0-M3\"\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.proxy.ProxyConfigurationService\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n+                                    \"version\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\n                                 }\n                             }\n                         },\n                         \"seeAlso\": [\n-                            \"org.apache.nifi.processors.aws.sqs.DeleteSQS\",\n-                            \"org.apache.nifi.processors.aws.sqs.PutSQS\"\n+                            \"org.apache.nifi.processors.azure.storage.CopyAzureBlobStorage_v12\",\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\": \"FlowFiles are routed to success 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\": true,\n+                        \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"AWS\",\n-                            \"Amazon\",\n-                            \"Fetch\",\n-                            \"Get\",\n-                            \"Poll\",\n-                            \"Queue\",\n-                            \"SQS\"\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.aws.sqs.GetSQS\",\n-                        \"typeDescription\": \"Fetches messages from an Amazon Simple Queuing Service Queue\",\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                         \"useCases\": [],\n                         \"version\": \"2.0.0-M3\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"The MD5 sum of the message\",\n-                                \"name\": \"hash.value\"\n+                                \"description\": \"The name of the Azure Blob Storage container\",\n+                                \"name\": \"azure.container\"\n                             },\n                             {\n-                                \"description\": \"MD5\",\n-                                \"name\": \"hash.algorithm\"\n+                                \"description\": \"The name of the blob on Azure Blob Storage\",\n+                                \"name\": \"azure.blobname\"\n                             },\n                             {\n-                                \"description\": \"The unique identifier of the SQS message\",\n-                                \"name\": \"sqs.message.id\"\n+                                \"description\": \"Primary location of the blob\",\n+                                \"name\": \"azure.primaryUri\"\n                             },\n                             {\n-                                \"description\": \"The SQS Receipt Handle that is to be used to delete the message from the queue\",\n-                                \"name\": \"sqs.receipt.handle\"\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\": \"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                     },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-aws-nar\",\n+                        \"artifact\": \"nifi-azure-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\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\": \"Allows the user to add key/value pairs as Message Attributes by adding a property whose name will become the name of the Message Attribute and value will become the value of the Message Attribute\",\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"name\": \"The name of a Message Attribute to add to the message\",\n-                                \"value\": \"The value of the Message Attribute\"\n-                            }\n-                        ],\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n                         \"multiProcessorUseCases\": [],\n-                        \"primaryNodeOnly\": false,\n+                        \"primaryNodeOnly\": true,\n                         \"propertyDescriptors\": {\n-                            \"AWS Credentials Provider service\": {\n-                                \"description\": \"The Controller Service that is used to obtain AWS credentials provider\",\n-                                \"displayName\": \"AWS Credentials Provider Service\",\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\": \"AWS Credentials Provider service\",\n-                                \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-aws-service-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.processors.aws.credentials.provider.service.AWSCredentialsProviderService\",\n-                                    \"version\": \"2.0.0-M3\"\n-                                }\n+                                \"name\": \"Maximum File Age\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n                             },\n-                            \"Communications Timeout\": {\n-                                \"defaultValue\": \"30 secs\",\n-                                \"description\": \"\",\n-                                \"displayName\": \"Communications Timeout\",\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\": \"Communications Timeout\",\n-                                \"required\": true,\n+                                \"name\": \"Maximum File Size\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Delay\": {\n-                                \"defaultValue\": \"0 secs\",\n-                                \"description\": \"The amount of time to delay the message before it becomes available to consumers\",\n-                                \"displayName\": \"Delay\",\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\": \"Delay\",\n+                                \"name\": \"Minimum File Age\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Endpoint Override URL\": {\n-                                \"description\": \"Endpoint URL to use instead of the AWS default including scheme, host, port, and path. The AWS libraries select an endpoint URL based on the AWS region, but this property overrides the selected endpoint URL, allowing use with other S3-compatible endpoints.\",\n-                                \"displayName\": \"Endpoint Override URL\",\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Endpoint Override URL\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Minimum File Size\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Queue URL\": {\n-                                \"description\": \"The URL of the queue to act upon\",\n-                                \"displayName\": \"Queue URL\",\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\": \"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\": \"2.0.0-M3\"\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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Queue URL\",\n+                                \"name\": \"directory-name\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Region\": {\n+                            \"et-initial-listing-target\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"AWS Region Code : us-gov-east-1\",\n-                                        \"displayName\": \"AWS GovCloud (US-East)\",\n-                                        \"value\": \"us-gov-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-gov-west-1\",\n-                                        \"displayName\": \"AWS GovCloud (US-West)\",\n-                                        \"value\": \"us-gov-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : af-south-1\",\n-                                        \"displayName\": \"Africa (Cape Town)\",\n-                                        \"value\": \"af-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-east-1\",\n-                                        \"displayName\": \"Asia Pacific (Hong Kong)\",\n-                                        \"value\": \"ap-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-south-2\",\n-                                        \"displayName\": \"Asia Pacific (Hyderabad)\",\n-                                        \"value\": \"ap-south-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-3\",\n-                                        \"displayName\": \"Asia Pacific (Jakarta)\",\n-                                        \"value\": \"ap-southeast-3\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-4\",\n-                                        \"displayName\": \"Asia Pacific (Melbourne)\",\n-                                        \"value\": \"ap-southeast-4\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-south-1\",\n-                                        \"displayName\": \"Asia Pacific (Mumbai)\",\n-                                        \"value\": \"ap-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-northeast-3\",\n-                                        \"displayName\": \"Asia Pacific (Osaka)\",\n-                                        \"value\": \"ap-northeast-3\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-northeast-2\",\n-                                        \"displayName\": \"Asia Pacific (Seoul)\",\n-                                        \"value\": \"ap-northeast-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-1\",\n-                                        \"displayName\": \"Asia Pacific (Singapore)\",\n-                                        \"value\": \"ap-southeast-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-southeast-2\",\n-                                        \"displayName\": \"Asia Pacific (Sydney)\",\n-                                        \"value\": \"ap-southeast-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ap-northeast-1\",\n-                                        \"displayName\": \"Asia Pacific (Tokyo)\",\n-                                        \"value\": \"ap-northeast-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ca-central-1\",\n-                                        \"displayName\": \"Canada (Central)\",\n-                                        \"value\": \"ca-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : ca-west-1\",\n-                                        \"displayName\": \"Canada West (Calgary)\",\n-                                        \"value\": \"ca-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : cn-north-1\",\n-                                        \"displayName\": \"China (Beijing)\",\n-                                        \"value\": \"cn-north-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : cn-northwest-1\",\n-                                        \"displayName\": \"China (Ningxia)\",\n-                                        \"value\": \"cn-northwest-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-central-1\",\n-                                        \"displayName\": \"Europe (Frankfurt)\",\n-                                        \"value\": \"eu-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-west-1\",\n-                                        \"displayName\": \"Europe (Ireland)\",\n-                                        \"value\": \"eu-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-west-2\",\n-                                        \"displayName\": \"Europe (London)\",\n-                                        \"value\": \"eu-west-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-south-1\",\n-                                        \"displayName\": \"Europe (Milan)\",\n-                                        \"value\": \"eu-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-west-3\",\n-                                        \"displayName\": \"Europe (Paris)\",\n-                                        \"value\": \"eu-west-3\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-south-2\",\n-                                        \"displayName\": \"Europe (Spain)\",\n-                                        \"value\": \"eu-south-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-north-1\",\n-                                        \"displayName\": \"Europe (Stockholm)\",\n-                                        \"value\": \"eu-north-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : eu-central-2\",\n-                                        \"displayName\": \"Europe (Zurich)\",\n-                                        \"value\": \"eu-central-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : il-central-1\",\n-                                        \"displayName\": \"Israel (Tel Aviv)\",\n-                                        \"value\": \"il-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : me-south-1\",\n-                                        \"displayName\": \"Middle East (Bahrain)\",\n-                                        \"value\": \"me-south-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : me-central-1\",\n-                                        \"displayName\": \"Middle East (UAE)\",\n-                                        \"value\": \"me-central-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : sa-east-1\",\n-                                        \"displayName\": \"South America (Sao Paulo)\",\n-                                        \"value\": \"sa-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-east-1\",\n-                                        \"displayName\": \"US East (N. Virginia)\",\n-                                        \"value\": \"us-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-east-2\",\n-                                        \"displayName\": \"US East (Ohio)\",\n-                                        \"value\": \"us-east-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-iso-east-1\",\n-                                        \"displayName\": \"US ISO East\",\n-                                        \"value\": \"us-iso-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-iso-west-1\",\n-                                        \"displayName\": \"US ISO WEST\",\n-                                        \"value\": \"us-iso-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-isob-east-1\",\n-                                        \"displayName\": \"US ISOB East (Ohio)\",\n-                                        \"value\": \"us-isob-east-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-west-1\",\n-                                        \"displayName\": \"US West (N. California)\",\n-                                        \"value\": \"us-west-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : us-west-2\",\n-                                        \"displayName\": \"US West (Oregon)\",\n-                                        \"value\": \"us-west-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : aws-cn-global\",\n-                                        \"displayName\": \"aws-cn-global\",\n-                                        \"value\": \"aws-cn-global\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : aws-global\",\n-                                        \"displayName\": \"aws-global\",\n-                                        \"value\": \"aws-global\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : aws-iso-b-global\",\n-                                        \"displayName\": \"aws-iso-b-global\",\n-                                        \"value\": \"aws-iso-b-global\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AWS Region Code : aws-iso-global\",\n-                                        \"displayName\": \"aws-iso-global\",\n-                                        \"value\": \"aws-iso-global\"\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\": \"AWS Region Code : aws-us-gov-global\",\n-                                        \"displayName\": \"aws-us-gov-global\",\n-                                        \"value\": \"aws-us-gov-global\"\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\": \"us-west-2\",\n-                                \"description\": \"\",\n-                                \"displayName\": \"Region\",\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\": \"Region\",\n-                                \"required\": true,\n+                                \"name\": \"et-initial-listing-target\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\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+                            \"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\": \"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\": \"2.0.0-M3\"\n                                 }\n                             },\n-                            \"deduplication-message-id\": {\n-                                \"description\": \"The token used for deduplication of sent messages\",\n-                                \"displayName\": \"Deduplication Message 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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"deduplication-message-id\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"et-time-window\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"message-group-id\": {\n-                                \"description\": \"If using FIFO, the message group to which the FlowFile belongs\",\n-                                \"displayName\": \"Message Group ID\",\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"file-filter\",\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                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"message-group-id\",\n+                                \"name\": \"filesystem-name\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\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\": \"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\": \"include-temporary-files\",\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+                                \"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+                            \"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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"path-filter\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n                             \"proxy-configuration-service\": {\n-                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests.\",\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\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\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.aws.sqs.DeleteSQS\",\n-                            \"org.apache.nifi.processors.aws.sqs.GetSQS\"\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\": \"FlowFiles are routed to success relationship\",\n+                                \"description\": \"All FlowFiles that are received are routed to success\",\n                                 \"name\": \"success\"\n-                            },\n-                            {\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-                        \"supportsDynamicProperties\": true,\n+                        \"supportsBatching\": false,\n+                        \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"AWS\",\n-                            \"Amazon\",\n-                            \"Publish\",\n-                            \"Put\",\n-                            \"Queue\",\n-                            \"SQS\"\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.aws.sqs.PutSQS\",\n-                        \"typeDescription\": \"Publishes a message to an Amazon Simple Queuing Service Queue\",\n+                        \"type\": \"org.apache.nifi.processors.azure.storage.ListAzureDataLakeStorage\",\n+                        \"typeDescription\": \"Lists directory in an Azure Data Lake Storage Gen 2 filesystem\",\n                         \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\"\n-                    }\n-                ],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\n-        },\n-        {\n-            \"artifact\": \"nifi-mqtt-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [],\n-                \"processors\": [\n+                        \"version\": \"2.0.0-M3\",\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+                            }\n+                        ]\n+                    },\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-mqtt-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-azure-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -93175,470 +94292,527 @@\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                         \"multiProcessorUseCases\": [],\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+                            \"adls-credentials-service\": {\n+                                \"description\": \"Controller Service used to obtain Azure Credentials.\",\n+                                \"displayName\": \"ADLS Credentials\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Broker URI\",\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\": \"2.0.0-M3\"\n+                                }\n                             },\n-                            \"Client ID\": {\n-                                \"description\": \"MQTT client ID to use. If not set, a UUID will be generated.\",\n-                                \"displayName\": \"Client ID\",\n+                            \"conflict-resolution-strategy\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"fail\",\n+                                        \"value\": \"fail\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"replace\",\n+                                        \"value\": \"replace\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"ignore\",\n+                                        \"value\": \"ignore\"\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Client ID\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"conflict-resolution-strategy\",\n+                                \"required\": true,\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+                            \"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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Connection Timeout (seconds)\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"directory-name\",\n+                                \"required\": true,\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+                            \"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\": \"Group ID\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"file-name\",\n+                                \"required\": true,\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+                            \"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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Keep Alive Interval (seconds)\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"filesystem-name\",\n+                                \"required\": true,\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+                            \"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\": \"Last Will Message\",\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\": \"2.0.0-M3\"\n+                                }\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+                            \"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\": \"Last Will QoS Level\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"source-directory-name\",\n                                 \"required\": true,\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+                            \"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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Last Will Retain\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"source-filesystem-name\",\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-                            \"Last Will Topic\": {\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+                        \"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.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+                        \"useCases\": [],\n+                        \"version\": \"2.0.0-M3\",\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+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-azure-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"f2215c6\"\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+                        \"multiProcessorUseCases\": [],\n+                        \"primaryNodeOnly\": false,\n+                        \"propertyDescriptors\": {\n+                            \"Client-Side Encryption Key ID\": {\n                                 \"dependencies\": [\n                                     {\n-                                        \"propertyDisplayName\": \"Last Will Message\",\n-                                        \"propertyName\": \"Last Will Message\"\n+                                        \"dependentValues\": [\n+                                            \"LOCAL\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Client-Side Encryption Key Type\",\n+                                        \"propertyName\": \"Client-Side Encryption Key Type\"\n                                     }\n                                 ],\n-                                \"description\": \"The topic to send the client's Last Will to.\",\n-                                \"displayName\": \"Last Will Topic\",\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\": \"Last Will Topic\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Client-Side Encryption Key ID\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"MQTT Specification Version\": {\n+                            \"Client-Side Encryption Key Type\": {\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+                                        \"description\": \"Client-Side Encryption disabled\",\n+                                        \"displayName\": \"NONE\",\n+                                        \"value\": \"NONE\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"v3.1.0\",\n-                                        \"value\": \"3\"\n+                                        \"description\": \"Client-Side Encryption enabled using local key\",\n+                                        \"displayName\": \"LOCAL\",\n+                                        \"value\": \"LOCAL\"\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+                                \"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\": \"MQTT Specification Version\",\n+                                \"name\": \"Client-Side Encryption Key Type\",\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+                            \"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\": \"Max Queue Size\",\n+                                \"name\": \"Client-Side Encryption Local Key\",\n                                 \"required\": true,\n-                                \"sensitive\": false\n-                            },\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\": \"Password\",\n-                                \"required\": false,\n                                 \"sensitive\": true\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+                            \"File Resource Service\": {\n+                                \"dependencies\": [\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+                                        \"dependentValues\": [\n+                                            \"FILE_RESOURCE_SERVICE\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Resource Transfer Source\",\n+                                        \"propertyName\": \"Resource Transfer Source\"\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+                                \"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\": \"Quality of Service(QoS)\",\n+                                \"name\": \"File Resource Service\",\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+                                    \"type\": \"org.apache.nifi.fileresource.service.api.FileResourceService\",\n                                     \"version\": \"2.0.0-M3\"\n                                 }\n                             },\n-                            \"Session Expiry Interval\": {\n-                                \"defaultValue\": \"24 hrs\",\n-                                \"dependencies\": [\n+                            \"Resource Transfer Source\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"5\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"MQTT Specification Version\",\n-                                        \"propertyName\": \"MQTT Specification Version\"\n+                                        \"description\": \"The content of the incoming FlowFile provides the source for transfer\",\n+                                        \"displayName\": \"FlowFile Content\",\n+                                        \"value\": \"FLOWFILE_CONTENT\"\n                                     },\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"false\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Session state\",\n-                                        \"propertyName\": \"Session state\"\n+                                        \"description\": \"The File Resource Service provides the source for transfer\",\n+                                        \"displayName\": \"File Resource Service\",\n+                                        \"value\": \"FILE_RESOURCE_SERVICE\"\n                                     }\n                                 ],\n-                                \"description\": \"After this interval the broker will expire the client and clear the session state.\",\n-                                \"displayName\": \"Session Expiry Interval\",\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\": \"Session Expiry Interval\",\n-                                \"required\": false,\n+                                \"name\": \"Resource Transfer Source\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Session state\": {\n+                            \"blob-name\": {\n+                                \"description\": \"The full name of the blob\",\n+                                \"displayName\": \"Blob Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"blob-name\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"conflict-resolution-strategy\": {\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\": \"Fail if the blob already exists\",\n+                                        \"displayName\": \"fail\",\n+                                        \"value\": \"FAIL_RESOLUTION\"\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\": \"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\": \"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\": \"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\": \"Session state\",\n+                                \"name\": \"conflict-resolution-strategy\",\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+                            \"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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Topic Filter\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"container-name\",\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Username\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"add-attributes-as-fields\": {\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-                                \"dependencies\": [\n-                                    {\n-                                        \"propertyDisplayName\": \"Record Reader\",\n-                                        \"propertyName\": \"record-reader\"\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\": \"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\": \"add-attributes-as-fields\",\n+                                \"name\": \"create-container\",\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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+                            \"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+                                \"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\": \"2.0.0-M3\"\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+                            \"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\": \"record-writer\",\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.serialization.RecordSetWriterFactory\",\n+                                    \"type\": \"org.apache.nifi.services.azure.storage.AzureStorageCredentialsService_v12\",\n                                     \"version\": \"2.0.0-M3\"\n                                 }\n                             }\n                         },\n                         \"seeAlso\": [\n-                            \"org.apache.nifi.processors.mqtt.PublishMQTT\"\n+                            \"org.apache.nifi.processors.azure.storage.CopyAzureBlobStorage_v12\",\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\": \"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\": \"All successfully processed FlowFiles are routed to this relationship\",\n+                                \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"The MQTT message output\",\n-                                \"name\": \"Message\"\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                         \"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+                            \"azure\",\n+                            \"blob\",\n+                            \"cloud\",\n+                            \"microsoft\",\n+                            \"storage\"\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.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                         \"useCases\": [],\n                         \"version\": \"2.0.0-M3\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"The number of records received\",\n-                                \"name\": \"record.count\"\n+                                \"description\": \"The name of the Azure Blob Storage container\",\n+                                \"name\": \"azure.container\"\n                             },\n                             {\n-                                \"description\": \"MQTT broker that was the message source\",\n-                                \"name\": \"mqtt.broker\"\n+                                \"description\": \"The name of the blob on Azure Blob Storage\",\n+                                \"name\": \"azure.blobname\"\n                             },\n                             {\n-                                \"description\": \"MQTT topic on which message was received\",\n-                                \"name\": \"mqtt.topic\"\n+                                \"description\": \"Primary location of the blob\",\n+                                \"name\": \"azure.primaryUri\"\n                             },\n                             {\n-                                \"description\": \"The quality of service for this message.\",\n-                                \"name\": \"mqtt.qos\"\n+                                \"description\": \"ETag of the blob\",\n+                                \"name\": \"azure.etag\"\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+                                \"description\": \"Type of the blob (either BlockBlob, PageBlob or AppendBlob)\",\n+                                \"name\": \"azure.blobtype\"\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\": \"MIME Type of the content\",\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+                            },\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\": false,\n-                        \"artifact\": \"nifi-mqtt-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-azure-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -93651,546 +94825,1001 @@\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"multiProcessorUseCases\": [],\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"Connection Timeout (seconds)\",\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Keep Alive Interval (seconds)\",\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-                                \"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\": \"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+                            \"File Resource Service\": {\n                                 \"dependencies\": [\n                                     {\n-                                        \"propertyDisplayName\": \"Last Will Message\",\n-                                        \"propertyName\": \"Last Will Message\"\n+                                        \"dependentValues\": [\n+                                            \"FILE_RESOURCE_SERVICE\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Resource Transfer Source\",\n+                                        \"propertyName\": \"Resource Transfer Source\"\n                                     }\n                                 ],\n-                                \"description\": \"QoS level to be used when publishing the Last Will Message.\",\n-                                \"displayName\": \"Last Will QoS Level\",\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\": \"Last Will QoS Level\",\n+                                \"name\": \"File Resource 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.fileresource.service.api.FileResourceService\",\n+                                    \"version\": \"2.0.0-M3\"\n+                                }\n                             },\n-                            \"Last Will Retain\": {\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-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"propertyDisplayName\": \"Last Will Message\",\n-                                        \"propertyName\": \"Last Will Message\"\n+                                        \"description\": \"The File Resource Service provides the source for transfer\",\n+                                        \"displayName\": \"File Resource Service\",\n+                                        \"value\": \"FILE_RESOURCE_SERVICE\"\n                                     }\n                                 ],\n-                                \"description\": \"Whether to retain the client's Last Will.\",\n-                                \"displayName\": \"Last Will Retain\",\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\": \"Last Will Retain\",\n+                                \"name\": \"Resource Transfer Source\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Last Will Topic\": {\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\": \"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\": \"2.0.0-M3\"\n+                                }\n+                            },\n+                            \"base-temporary-path\": {\n+                                \"defaultValue\": \"\",\n                                 \"dependencies\": [\n                                     {\n-                                        \"propertyDisplayName\": \"Last Will Message\",\n-                                        \"propertyName\": \"Last Will Message\"\n+                                        \"dependentValues\": [\n+                                            \"WRITE_AND_RENAME\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Writing Strategy\",\n+                                        \"propertyName\": \"writing-strategy\"\n                                     }\n                                 ],\n-                                \"description\": \"The topic to send the client's Last Will to.\",\n-                                \"displayName\": \"Last Will Topic\",\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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Last Will Topic\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"base-temporary-path\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"MQTT Specification Version\": {\n+                            \"conflict-resolution-strategy\": {\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+                                        \"displayName\": \"fail\",\n+                                        \"value\": \"fail\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"v3.1.1\",\n-                                        \"value\": \"4\"\n+                                        \"displayName\": \"replace\",\n+                                        \"value\": \"replace\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"v3.1.0\",\n-                                        \"value\": \"3\"\n+                                        \"displayName\": \"ignore\",\n+                                        \"value\": \"ignore\"\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+                                \"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\": \"MQTT Specification Version\",\n+                                \"name\": \"conflict-resolution-strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Password\": {\n-                                \"description\": \"Password to use when connecting to the broker\",\n-                                \"displayName\": \"Password\",\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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Password\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"directory-name\",\n+                                \"required\": true,\n+                                \"sensitive\": false\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+                            \"file-name\": {\n+                                \"defaultValue\": \"${azure.filename}\",\n+                                \"description\": \"The filename\",\n+                                \"displayName\": \"File Name\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Quality of Service(QoS)\",\n+                                \"name\": \"file-name\",\n                                 \"required\": true,\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+                            \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Retain Message\",\n+                                \"name\": \"filesystem-name\",\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. 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.SSLContextService\",\n+                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n                                     \"version\": \"2.0.0-M3\"\n                                 }\n                             },\n-                            \"Session Expiry Interval\": {\n-                                \"defaultValue\": \"24 hrs\",\n-                                \"dependencies\": [\n+                            \"writing-strategy\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"5\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"MQTT Specification Version\",\n-                                        \"propertyName\": \"MQTT Specification Version\"\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-                                        \"dependentValues\": [\n-                                            \"false\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Session state\",\n-                                        \"propertyName\": \"Session state\"\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-                                \"description\": \"After this interval the broker will expire the client and clear the session state.\",\n-                                \"displayName\": \"Session Expiry Interval\",\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\": \"Session Expiry Interval\",\n-                                \"required\": false,\n+                                \"name\": \"writing-strategy\",\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-                            \"Session state\": {\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+                        \"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.PutAzureDataLakeStorage\",\n+                        \"typeDescription\": \"Writes the contents of a FlowFile as a file on Azure Data Lake Storage Gen 2\",\n+                        \"useCases\": [],\n+                        \"version\": \"2.0.0-M3\",\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-azure-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"f2215c6\"\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+                        \"multiProcessorUseCases\": [],\n+                        \"primaryNodeOnly\": false,\n+                        \"propertyDescriptors\": {\n+                            \"Auto Delete Messages\": {\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+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n                                         \"value\": \"true\"\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+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\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+                                \"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\": \"Session state\",\n+                                \"name\": \"Auto Delete Messages\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Topic\": {\n-                                \"description\": \"The topic to publish the message to.\",\n-                                \"displayName\": \"Topic\",\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\": \"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\": \"2.0.0-M3\"\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Message Batch Size\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Queue Name\": {\n+                                \"description\": \"Name of the Azure Storage Queue\",\n+                                \"displayName\": \"Queue Name\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Topic\",\n+                                \"name\": \"Queue Name\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Username\": {\n-                                \"description\": \"Username to use when connecting to the broker\",\n-                                \"displayName\": \"Username\",\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Username\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Request Timeout\",\n+                                \"required\": true,\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+                            \"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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"message-demarcator\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Visibility Timeout\",\n+                                \"required\": true,\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+                            \"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+                                \"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\": \"2.0.0-M3\"\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+                            \"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\": \"record-writer\",\n+                                \"name\": \"storage-endpoint-suffix\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            }\n+                        },\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.azure.storage.queue.PutAzureQueueStorage_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+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": false,\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": 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+                        \"useCases\": [],\n+                        \"version\": \"2.0.0-M3\",\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\": \"f2215c6\"\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+                        \"multiProcessorUseCases\": [],\n+                        \"primaryNodeOnly\": false,\n+                        \"propertyDescriptors\": {\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\": \"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\": \"2.0.0-M3\"\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+                            \"Queue Name\": {\n+                                \"description\": \"Name of the Azure Storage Queue\",\n+                                \"displayName\": \"Queue Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables 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\": \"Request Timeout\",\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\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.serialization.RecordSetWriterFactory\",\n+                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n                                     \"version\": \"2.0.0-M3\"\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.mqtt.ConsumeMQTT\"\n+                            \"org.apache.nifi.processors.azure.storage.queue.GetAzureQueueStorage_v12\"\n                         ],\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"FlowFiles that are sent successfully to the destination are transferred to this relationship.\",\n+                                \"description\": \"All successfully processed FlowFiles 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\": \"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                         \"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+                            \"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.mqtt.PublishMQTT\",\n-                        \"typeDescription\": \"Publishes a message to an MQTT topic\",\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                         \"useCases\": [],\n                         \"version\": \"2.0.0-M3\"\n                     }\n                 ],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\n-        },\n-        {\n-            \"artifact\": \"nifi-http-context-map-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [\n+                \"reportingTasks\": [\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-http-context-map-nar\",\n+                        \"artifact\": \"nifi-azure-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\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+                            \"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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Application ID\",\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                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Maximum Outstanding Requests\",\n+                                \"name\": \"Batch Size\",\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+                            \"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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Instance ID\",\n+                                \"required\": true,\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Instance URL\",\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Job Name\",\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Log Analytics Custom Log Name\",\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Log Analytics URL Endpoint Format\",\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Platform\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\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\": \"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\": \"Request Expiration\",\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, UPLOAD, 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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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, UPLOAD, 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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"s2s-prov-task-id-filter\",\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"s2s-prov-task-id-filter-exclude\",\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"s2s-prov-task-name-filter\",\n+                                \"required\": false,\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"s2s-prov-task-name-filter-exclude\",\n+                                \"required\": false,\n+                                \"sensitive\": false\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"s2s-prov-task-type-filter\",\n+                                \"required\": false,\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"s2s-prov-task-type-filter-exclude\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\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\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"start-position\",\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\": \"2.0.0-M3\"\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                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"http\",\n-                            \"request\",\n-                            \"response\"\n+                            \"azure\",\n+                            \"log analytics\",\n+                            \"provenace\",\n+                            \"reporting\"\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+                        \"type\": \"org.apache.nifi.reporting.azure.loganalytics.AzureLogAnalyticsProvenanceReportingTask\",\n+                        \"typeDescription\": \"Publishes Provenance events to to a Azure Log Analytics workspace.\",\n                         \"version\": \"2.0.0-M3\"\n-                    }\n-                ],\n-                \"processors\": [],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"2.0.0-M3\"\n-        },\n-        {\n-            \"artifact\": \"nifi-box-services-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [\n+                    },\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-box-services-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-azure-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"1 min\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\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+                            \"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\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"app-config-file\",\n+                                \"name\": \"Application ID\",\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Instance ID\",\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Job Name\",\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+                            \"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\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"app-config-json\",\n+                                \"name\": \"Log Analytics Custom Log Name\",\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Log Analytics URL Endpoint Format\",\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Log Analytics Workspace Id\",\n+                                \"required\": true,\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+                            \"Log Analytics Workspace Key\": {\n+                                \"description\": \"Azure Log Analytic Worskspace Key\",\n+                                \"displayName\": \"Log Analytics Workspace Key\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"box-account-id\",\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Process group ID(s)\",\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+                            \"Send JVM Metrics\": {\n+                                \"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\": \"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\": \"2.0.0-M3\"\n-                                }\n+                                \"name\": \"Send JVM Metrics\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             }\n                         },\n-                        \"providedApiImplementations\": [\n-                            {\n-                                \"artifact\": \"nifi-box-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.box.controllerservices.BoxClientService\",\n-                                \"version\": \"2.0.0-M3\"\n-                            }\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\n                         ],\n                         \"supportsDynamicProperties\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"box\",\n-                            \"client\",\n-                            \"provider\"\n+                            \"azure\",\n+                            \"log analytics\",\n+                            \"metrics\",\n+                            \"reporting\"\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.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\": \"2.0.0-M3\"\n                     }\n-                ],\n-                \"processors\": [],\n-                \"reportingTasks\": []\n+                ]\n             },\n             \"group\": \"org.apache.nifi\",\n             \"version\": \"2.0.0-M3\"\n         },\n         {\n             \"artifact\": \"nifi-dbcp-service-nar\",\n             \"componentManifest\": {\n@@ -94303,16 +95932,16 @@\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n                                 \"name\": \"database-driver-locations\",\n                                 \"required\": false,\n                                 \"resourceDefinition\": {\n                                     \"cardinality\": \"MULTIPLE\",\n                                     \"resourceTypes\": [\n                                         \"FILE\",\n-                                        \"DIRECTORY\",\n-                                        \"URL\"\n+                                        \"URL\",\n+                                        \"DIRECTORY\"\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@@ -94542,16 +96171,16 @@\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n                                 \"name\": \"hikaricp-driver-locations\",\n                                 \"required\": false,\n                                 \"resourceDefinition\": {\n                                     \"cardinality\": \"MULTIPLE\",\n                                     \"resourceTypes\": [\n                                         \"FILE\",\n-                                        \"DIRECTORY\",\n-                                        \"URL\"\n+                                        \"URL\",\n+                                        \"DIRECTORY\"\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@@ -94608,1948 +96237,380 @@\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"hikaricp-validation-query\",\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\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-dbcp-service-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"f2215c6\"\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables 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\": \"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\": \"2.0.0-M3\"\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"db-record-sink-quoted-identifiers\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"db-record-sink-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-                                \"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\": \"Environment variables 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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"db-record-sink-table-name\",\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-                            {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.record.sink.RecordSinkService\",\n-                                \"version\": \"2.0.0-M3\"\n-                            }\n-                        ],\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"connection\",\n-                            \"database\",\n-                            \"db\",\n-                            \"jdbc\",\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-                        \"version\": \"2.0.0-M3\"\n-                    }\n-                ],\n-                \"processors\": [],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"2.0.0-M3\"\n-        },\n-        {\n-            \"artifact\": \"nifi-shopify-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [],\n-                \"processors\": [\n-                    {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-shopify-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"f2215c6\"\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-                        \"multiProcessorUseCases\": [],\n-                        \"primaryNodeOnly\": true,\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"CUSTOMERS\",\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"DISCOUNTS\",\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"INVENTORY\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\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\": \"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-                                    },\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\": \"ORDERS\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"PRODUCT\",\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"SALES_CHANNELS\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\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\": \"STORE_PROPERTIES\",\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"api-version\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"incremental-delay\",\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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 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\": \"is-incremental\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"object-category\": {\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-                                    },\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-                                \"description\": \"Shopify object category\",\n-                                \"displayName\": \"Object Category\",\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"result-limit\",\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"2.0.0-M3\"\n-                                }\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-                                \"name\": \"success\"\n-                            }\n-                        ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"shopify\"\n-                        ],\n-                        \"triggerSerially\": true,\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-                        \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\",\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\": \"2.0.0-M3\"\n-        },\n-        {\n-            \"artifact\": \"nifi-apicurio-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-apicurio-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"f2215c6\"\n-                        },\n-                        \"group\": \"org.apache.nifi\",\n-                        \"propertyDescriptors\": {\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. The cache size must be a non-negative integer. When it is set to 0, the cache is effectively disabled.\",\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 Group ID\": {\n-                                \"defaultValue\": \"default\",\n-                                \"description\": \"The artifact Group ID for the schemas\",\n-                                \"displayName\": \"Schema Group ID\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"Schema Group ID\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Schema Registry URL\": {\n-                                \"description\": \"The URL of the Schema Registry e.g. http://localhost:8080\",\n-                                \"displayName\": \"Schema Registry URL\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Schema Registry 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-                                \"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\": \"2.0.0-M3\"\n-                                }\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\": \"2.0.0-M3\"\n-                            }\n-                        ],\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"apicurio\",\n-                            \"avro\",\n-                            \"registry\",\n-                            \"schema\"\n-                        ],\n-                        \"type\": \"org.apache.nifi.apicurio.schemaregistry.ApicurioSchemaRegistry\",\n-                        \"typeDescription\": \"Provides a Schema Registry that interacts with the Apicurio Schema Registry so that those Schemas that are stored in the Apicurio Schema Registry can be used in NiFi. When a Schema is looked up by name by this registry, it will find a Schema in the Apicurio Schema Registry with their artifact identifiers.\",\n-                        \"version\": \"2.0.0-M3\"\n-                    }\n-                ],\n-                \"processors\": [],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\n-        },\n-        {\n-            \"artifact\": \"nifi-gcp-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-gcp-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"f2215c6\"\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-                                \"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-                            \"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-                            \"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\": \"2.0.0-M3\"\n-                                }\n-                            },\n-                            \"service-account-json\": {\n-                                \"description\": \"The raw JSON containing a Service Account keyfile.\",\n-                                \"displayName\": \"Service Account JSON\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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-                                \"artifact\": \"nifi-gcp-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.gcp.credentials.service.GCPCredentialsService\",\n-                                \"version\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-gcp-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"f2215c6\"\n-                        },\n-                        \"group\": \"org.apache.nifi\",\n-                        \"propertyDescriptors\": {\n-                            \"Bucket\": {\n-                                \"defaultValue\": \"${gcs.bucket}\",\n-                                \"description\": \"Bucket of the object.\",\n-                                \"displayName\": \"Bucket\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Bucket\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Name\": {\n-                                \"defaultValue\": \"${filename}\",\n-                                \"description\": \"Name of the object.\",\n-                                \"displayName\": \"Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"Name\",\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\": \"2.0.0-M3\"\n-                                }\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-                                \"version\": \"2.0.0-M3\"\n-                            }\n-                        ],\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.gcp.storage.FetchGCSObject\"\n-                        ],\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"file\",\n-                            \"gcs\",\n-                            \"resource\"\n-                        ],\n-                        \"type\": \"org.apache.nifi.processors.gcp.storage.GCSFileResourceService\",\n-                        \"typeDescription\": \"Provides a Google Compute Storage (GCS) file resource for other components.\",\n-                        \"version\": \"2.0.0-M3\"\n-                    }\n-                ],\n-                \"processors\": [\n-                    {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-gcp-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"f2215c6\"\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-                        \"multiProcessorUseCases\": [],\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\": \"2.0.0-M3\"\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"bigquery-api-endpoint\",\n-                                \"required\": true,\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-                                \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"bq.dataset\",\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-                                \"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\": \"2.0.0-M3\"\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\": \"Environment variables 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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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-                            \"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\": \"2.0.0-M3\"\n-                                }\n-                            }\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-                            },\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-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\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.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-                        \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\",\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\": \"f2215c6\"\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-                        \"multiProcessorUseCases\": [\n-                            {\n-                                \"configurations\": [\n-                                    {\n-                                        \"configuration\": \"The \\\"Folder ID\\\" property should be set to the ID of the Google Drive folder that files reside in.     See processor documentation / additional details for more information on how to determine a Google Drive folder's ID.\\n    If the flow being built is to be reused elsewhere, it's a good idea to parameterize     this property by setting it to something like `#{GOOGLE_DRIVE_FOLDER_ID}`.\\n\\nThe \\\"GCP Credentials Provider Service\\\" property should specify an instance of the GCPCredentialsService in order to provide credentials for accessing the folder.\\n\\nThe 'success' Relationship of this Processor is then connected to FetchGoogleDrive.\\n\",\n-                                        \"processorClassName\": \"org.apache.nifi.processors.gcp.drive.ListGoogleDrive\"\n-                                    },\n-                                    {\n-                                        \"configuration\": \"\\\"File ID\\\" = \\\"${drive.id}\\\"\\n\\nThe \\\"GCP Credentials Provider Service\\\" property should specify an instance of the GCPCredentialsService in order to provide credentials for accessing the bucket.\\n\",\n-                                        \"processorClassName\": \"org.apache.nifi.processors.gcp.drive.FetchGoogleDrive\"\n-                                    }\n-                                ],\n-                                \"description\": \"Retrieve all files in a Google Drive folder\",\n-                                \"keywords\": [\n-                                    \"google\",\n-                                    \"drive\",\n-                                    \"google cloud\",\n-                                    \"state\",\n-                                    \"retrieve\",\n-                                    \"fetch\",\n-                                    \"all\",\n-                                    \"stream\"\n-                                ],\n-                                \"notes\": \"\"\n-                            }\n-                        ],\n-                        \"primaryNodeOnly\": false,\n-                        \"propertyDescriptors\": {\n-                            \"Google Doc Export 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-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Web Page (HTML)\",\n-                                        \"value\": \"application/zip\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"EPUB\",\n-                                        \"value\": \"application/epub+zip\"\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Google Doc Export Type\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Google Drawing Export Type\": {\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-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SVG\",\n-                                        \"value\": \"image/svg+xml\"\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Google Drawing Export Type\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Google Presentation Export Type\": {\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-                                    },\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\": \"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\": \"Google Presentation Export Type\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\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\": \"Microsoft Excel\",\n-                                        \"value\": \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\"\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-                                    {\n-                                        \"description\": \"\",\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\": \"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\": \"Google Spreadsheet Export Type\",\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables 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\": \"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\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\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-                        \"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-                        \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\",\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\": \"f2215c6\"\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-                        \"multiProcessorUseCases\": [],\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-                                \"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\": \"2.0.0-M3\"\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+                            \"hikaricp-password\": {\n+                                \"description\": \"The password for the database user\",\n+                                \"displayName\": \"Password\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"et-time-window\",\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"hikaricp-username\",\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+                            \"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\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"folder-id\",\n-                                \"required\": true,\n+                                \"name\": \"hikaricp-validation-query\",\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\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-dbcp-service-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"f2215c6\"\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"db-record-sink-catalog-name\",\n+                                \"required\": false,\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+                            \"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\": \"gcp-credentials-provider-service\",\n+                                \"name\": \"db-record-sink-dcbp-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.dbcp.DBCPService\",\n                                     \"version\": \"2.0.0-M3\"\n                                 }\n                             },\n-                            \"listing-strategy\": {\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"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+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\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\": \"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\": \"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\": \"listing-strategy\",\n-                                \"required\": true,\n+                                \"name\": \"db-record-sink-quoted-identifiers\",\n+                                \"required\": false,\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+                            \"db-record-sink-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                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"min-age\",\n-                                \"required\": true,\n+                                \"name\": \"db-record-sink-quoted-table-identifiers\",\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+                            \"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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"proxy-configuration-service\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"db-record-sink-schema-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.proxy.ProxyConfigurationService\",\n-                                    \"version\": \"2.0.0-M3\"\n-                                }\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+                            \"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\": \"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\": \"2.0.0-M3\"\n-                                }\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"db-record-sink-table-name\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             },\n-                            \"recursive-search\": {\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\": \"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+                                \"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\": \"recursive-search\",\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.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+                        \"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.record.sink.RecordSinkService\",\n+                                \"version\": \"2.0.0-M3\"\n                             }\n                         ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"drive\",\n-                            \"google\",\n-                            \"storage\"\n+                            \"connection\",\n+                            \"database\",\n+                            \"db\",\n+                            \"jdbc\",\n+                            \"record\"\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-                        \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\",\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+                        \"type\": \"org.apache.nifi.record.sink.db.DatabaseRecordSink\",\n+                        \"typeDescription\": \"Provides a service to write records using a configured database connection.\",\n+                        \"version\": \"2.0.0-M3\"\n+                    }\n+                ],\n+                \"processors\": [],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\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\": \"f2215c6\"\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"access-token\",\n+                                \"required\": true,\n+                                \"sensitive\": true\n                             },\n-                            {\n-                                \"description\": \"The MIME type of the file\",\n-                                \"name\": \"mime.type\"\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"app-key\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             },\n-                            {\n-                                \"description\": \"The size of the file\",\n-                                \"name\": \"drive.size\"\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"refresh-token\",\n+                                \"required\": true,\n+                                \"sensitive\": true\n+                            }\n+                        },\n+                        \"providedApiImplementations\": [\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+                                \"artifact\": \"nifi-dropbox-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.dropbox.credentials.service.DropboxCredentialService\",\n+                                \"version\": \"2.0.0-M3\"\n                             }\n-                        ]\n-                    },\n+                        ],\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"credentials\",\n+                            \"dropbox\",\n+                            \"provider\"\n+                        ],\n+                        \"type\": \"org.apache.nifi.services.dropbox.StandardDropboxCredentialService\",\n+                        \"typeDescription\": \"Defines credentials for Dropbox processors.\",\n+                        \"version\": \"2.0.0-M3\"\n+                    }\n+                ],\n+                \"processors\": [],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"2.0.0-M3\"\n+        },\n+        {\n+            \"artifact\": \"nifi-workday-processors-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n+                \"processors\": [\n                     {\n                         \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-gcp-nar\",\n+                        \"artifact\": \"nifi-workday-processors-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -96558,775 +96619,863 @@\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                         \"multiProcessorUseCases\": [],\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+                            \"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\": \"chunked-upload-threshold\",\n-                                \"required\": false,\n-                                \"sensitive\": 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.web.client.provider.api.WebClientServiceProvider\",\n+                                    \"version\": \"2.0.0-M3\"\n+                                }\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+                            \"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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"conflict-resolution-strategy\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"Workday Password\",\n                                 \"required\": true,\n-                                \"sensitive\": false\n+                                \"sensitive\": true\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+                            \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"file-name\",\n+                                \"name\": \"Workday Report URL\",\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+                            \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"folder-id\",\n+                                \"name\": \"Workday 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+                            \"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\": \"gcp-credentials-provider-service\",\n-                                \"required\": true,\n+                                \"name\": \"record-reader\",\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.serialization.RecordReaderFactory\",\n                                     \"version\": \"2.0.0-M3\"\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+                            \"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\": \"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\": \"2.0.0-M3\"\n                                 }\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+                        \"sideEffectFree\": true,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"Files that have been successfully written to Google Drive are transferred to this relationship.\",\n+                                \"description\": \"Response FlowFiles transferred when receiving HTTP responses with a status code between 200 and 299.\",\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+                                \"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 200 and 299.\",\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                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"drive\",\n-                            \"google\",\n-                            \"put\",\n-                            \"storage\"\n+                            \"Workday\",\n+                            \"report\"\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.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                         \"useCases\": [],\n                         \"version\": \"2.0.0-M3\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"The id of the file\",\n-                                \"name\": \"drive.id\"\n+                                \"description\": \"The Java exception class raised when the processor fails\",\n+                                \"name\": \"getworkdayreport.java.exception.class\"\n                             },\n                             {\n-                                \"description\": \"The name of the file\",\n-                                \"name\": \"filename\"\n+                                \"description\": \"The Java exception message raised when the processor fails\",\n+                                \"name\": \"getworkdayreport.java.exception.message\"\n                             },\n                             {\n-                                \"description\": \"The MIME type of the file\",\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 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 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\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\n+        },\n+        {\n+            \"artifact\": \"nifi-proxy-configuration-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-gcp-nar\",\n+                        \"artifact\": \"nifi-proxy-configuration-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\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-                        \"multiProcessorUseCases\": [],\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\": \"2.0.0-M3\"\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+                            \"proxy-server-host\": {\n+                                \"description\": \"Proxy server hostname or ip-address.\",\n+                                \"displayName\": \"Proxy Server Host\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"api-endpoint\",\n-                                \"required\": true,\n+                                \"name\": \"proxy-server-host\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"gcp-project-id\": {\n-                                \"description\": \"Google Cloud Project ID\",\n-                                \"displayName\": \"Project ID\",\n+                            \"proxy-server-port\": {\n+                                \"description\": \"Proxy server port number.\",\n+                                \"displayName\": \"Proxy Server Port\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"gcp-project-id\",\n+                                \"name\": \"proxy-server-port\",\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+                            \"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\": \"gcp-pubsub-publish-batch-size\",\n+                                \"name\": \"proxy-type\",\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+                            \"proxy-user-name\": {\n+                                \"description\": \"The name of the proxy client for user authentication.\",\n+                                \"displayName\": \"Proxy User Name\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"gcp-pubsub-subscription\",\n-                                \"required\": true,\n+                                \"name\": \"proxy-user-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: HTTP + AuthN\",\n-                                \"displayName\": \"Proxy Configuration Service\",\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"proxy-user-password\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n+                            },\n+                            \"socks-version\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SOCKS4\",\n+                                        \"value\": \"SOCKS4\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SOCKS5\",\n+                                        \"value\": \"SOCKS5\"\n+                                    }\n+                                ],\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\": \"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\": \"2.0.0-M3\"\n-                                }\n+                                \"name\": \"socks-version\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             }\n                         },\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.gcp.pubsub.PublishGCPubSub\"\n-                        ],\n-                        \"sideEffectFree\": false,\n-                        \"supportedRelationships\": [\n+                        \"providedApiImplementations\": [\n                             {\n-                                \"description\": \"FlowFiles are routed to this relationship after a successful Google Cloud Pub/Sub operation.\",\n-                                \"name\": \"success\"\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n+                                \"version\": \"2.0.0-M3\"\n                             }\n                         ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"consume\",\n-                            \"gcp\",\n-                            \"google\",\n-                            \"google-cloud\",\n-                            \"message\",\n-                            \"pubsub\"\n+                            \"Proxy\"\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-                        \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\",\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+                        \"type\": \"org.apache.nifi.proxy.StandardProxyConfigurationService\",\n+                        \"typeDescription\": \"Provides a set of configurations for different NiFi components to use a proxy server.\",\n+                        \"version\": \"2.0.0-M3\"\n+                    }\n+                ],\n+                \"processors\": [],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"2.0.0-M3\"\n+        },\n+        {\n+            \"artifact\": \"nifi-registry-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-gcp-nar\",\n+                        \"artifact\": \"nifi-registry-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\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+                                \"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-                        \"multiProcessorUseCases\": [],\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\": \"2.0.0-M3\"\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+                            \"avro-reg-validated-field-names\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"FLOWFILE_ORIENTED\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Message Derivation Strategy\",\n-                                        \"propertyName\": \"Message Derivation Strategy\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\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+                                \"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\": \"Maximum Message Size\",\n+                                \"name\": \"avro-reg-validated-field-names\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n-                            },\n-                            \"Message Derivation Strategy\": {\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\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-registry-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"f2215c6\"\n+                        },\n+                        \"dynamicProperties\": [\n+                            {\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+                        \"propertyDescriptors\": {\n+                            \"JSON Schema Version\": {\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\": \"Draft Version 4\",\n+                                        \"displayName\": \"Draft 4\",\n+                                        \"value\": \"DRAFT_4\"\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+                                        \"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\": \"FLOWFILE_ORIENTED\",\n-                                \"description\": \"The strategy used to publish the incoming FlowFile to the Google Cloud PubSub endpoint.\",\n-                                \"displayName\": \"Message Derivation Strategy\",\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\": \"Message Derivation Strategy\",\n+                                \"name\": \"JSON Schema Version\",\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.JsonSchemaRegistry\",\n+                                \"version\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\n+                    }\n+                ],\n+                \"processors\": [],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"2.0.0-M3\"\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\": \"f2215c6\"\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Keystore Filename\",\n+                                \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"SINGLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\"\n+                                    ]\n+                                },\n+                                \"sensitive\": false\n                             },\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+                            \"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\": \"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\": \"2.0.0-M3\"\n-                                }\n+                                \"name\": \"Keystore Password\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n                             },\n-                            \"Record Writer\": {\n-                                \"dependencies\": [\n+                            \"Keystore Type\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"RECORD_ORIENTED\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Message Derivation Strategy\",\n-                                        \"propertyName\": \"Message Derivation Strategy\"\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 Record Writer to use in order to serialize the data before sending to GCPubSub endpoint\",\n-                                \"displayName\": \"Record Writer\",\n+                                \"description\": \"The Type of the Keystore\",\n+                                \"displayName\": \"Keystore 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\": \"2.0.0-M3\"\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"api-endpoint\",\n-                                \"required\": true,\n+                                \"name\": \"Keystore Type\",\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+                            \"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                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"gcp-batch-bytes\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"SSL Protocol\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"gcp-project-id\": {\n-                                \"description\": \"Google Cloud Project ID\",\n-                                \"displayName\": \"Project ID\",\n+                            \"Truststore Filename\": {\n+                                \"description\": \"The fully-qualified filename of the Truststore\",\n+                                \"displayName\": \"Truststore Filename\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"gcp-project-id\",\n+                                \"name\": \"Truststore Filename\",\n                                 \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"SINGLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\"\n+                                    ]\n+                                },\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+                            \"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\": \"gcp-pubsub-publish-batch-delay\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n+                                \"name\": \"Truststore Password\",\n+                                \"required\": false,\n+                                \"sensitive\": true\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+                            \"Truststore 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 Truststore\",\n+                                \"displayName\": \"Truststore Type\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"gcp-pubsub-topic\",\n-                                \"required\": true,\n+                                \"name\": \"Truststore Type\",\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+                            \"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\": \"proxy-configuration-service\",\n+                                \"name\": \"key-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\": \"2.0.0-M3\"\n-                                }\n+                                \"sensitive\": true\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+                        \"providedApiImplementations\": [\n                             {\n-                                \"description\": \"FlowFiles are routed to this relationship if the Google Cloud Pub/Sub operation fails.\",\n-                                \"name\": \"failure\"\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.ssl.RestrictedSSLContextService\",\n+                                \"version\": \"2.0.0-M3\"\n                             },\n                             {\n-                                \"description\": \"FlowFiles are routed to this relationship after a successful Google Cloud Pub/Sub operation.\",\n-                                \"name\": \"success\"\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n+                                \"version\": \"2.0.0-M3\"\n                             }\n                         ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": true,\n-                        \"supportsDynamicRelationships\": false,\n+                        \"supportsDynamicProperties\": 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+                            \"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.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-                        \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\",\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.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\": \"2.0.0-M3\"\n                     },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-gcp-nar\",\n+                        \"artifact\": \"nifi-ssl-context-service-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\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-                        \"multiProcessorUseCases\": [],\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+                            \"Keystore Filename\": {\n+                                \"description\": \"The fully-qualified filename of the Keystore\",\n+                                \"displayName\": \"Keystore Filename\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Keystore Filename\",\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                                 \"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\": \"2.0.0-M3\"\n-                                }\n+                                \"name\": \"Keystore Password\",\n+                                \"required\": false,\n+                                \"sensitive\": true\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+                            \"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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"gcp-bytes-outstanding\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Keystore Type\",\n+                                \"required\": false,\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+                            \"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                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"gcp-messages-outstanding\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"SSL Protocol\",\n+                                \"required\": false,\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+                            \"Truststore Filename\": {\n+                                \"description\": \"The fully-qualified filename of the Truststore\",\n+                                \"displayName\": \"Truststore Filename\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"gcp-pubsub-subscription\",\n-                                \"required\": true,\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\": \"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 Truststore\",\n+                                \"displayName\": \"Truststore Type\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\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-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.gcp.pubsub.lite.PublishGCPubSubLite\"\n-                        ],\n-                        \"sideEffectFree\": false,\n-                        \"supportedRelationships\": [\n+                        \"providedApiImplementations\": [\n                             {\n-                                \"description\": \"FlowFiles are routed to this relationship after a successful Google Cloud Pub/Sub operation.\",\n-                                \"name\": \"success\"\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n+                                \"version\": \"2.0.0-M3\"\n                             }\n                         ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"consume\",\n-                            \"gcp\",\n-                            \"google\",\n-                            \"google-cloud\",\n-                            \"lite\",\n-                            \"message\",\n-                            \"pubsub\"\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.gcp.pubsub.lite.ConsumeGCPubSubLite\",\n-                        \"typeDescription\": \"Consumes message from the configured Google Cloud PubSub Lite subscription.\",\n-                        \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\",\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\": \"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-                            {\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+                        \"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\": \"2.0.0-M3\"\n+                    }\n+                ],\n+                \"processors\": [],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"2.0.0-M3\"\n+        },\n+        {\n+            \"artifact\": \"nifi-standard-shared-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n+                \"processors\": [],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"2.0.0-M3\"\n+        },\n+        {\n+            \"artifact\": \"nifi-jslt-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n+                \"processors\": [\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-gcp-nar\",\n+                        \"artifact\": \"nifi-jslt-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -97334,313 +97483,353 @@\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                         \"multiProcessorUseCases\": [],\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+                            \"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\": \"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\": \"2.0.0-M3\"\n-                                }\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"gcp-batch-bytes\",\n+                                \"name\": \"jslt-transform-cache-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+                            \"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                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"gcp-ordering-key\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"jslt-transform-pretty_print\",\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+                            \"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\": \"gcp-pubsub-publish-batch-delay\",\n+                                \"name\": \"jslt-transform-result-filter\",\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+                            \"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\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"gcp-pubsub-publish-batch-size\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"jslt-transform-transformation\",\n                                 \"required\": true,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"SINGLE\",\n+                                    \"resourceTypes\": [\n+                                        \"TEXT\",\n+                                        \"FILE\"\n+                                    ]\n+                                },\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+                            \"jslt-transform-transformation-strategy\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Apply transformation to entire FlowFile content JSON\",\n+                                        \"displayName\": \"Entire FlowFile\",\n+                                        \"value\": \"ENTIRE_FLOWFILE\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Apply transformation each JSON Object in an array\",\n+                                        \"displayName\": \"Each JSON Object\",\n+                                        \"value\": \"EACH_OBJECT\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"EACH_OBJECT\",\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"gcp-pubsub-topic\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"jslt-transform-transformation-strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.gcp.pubsub.lite.ConsumeGCPubSubLite\"\n-                        ],\n-                        \"sideEffectFree\": false,\n+                        \"sideEffectFree\": true,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"FlowFiles are routed to this relationship after a successful Google Cloud Pub/Sub operation.\",\n+                                \"description\": \"The FlowFile with transformed content will be routed to this relationship\",\n                                 \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"FlowFiles are routed to this relationship if the Google Cloud Pub/Sub operation fails.\",\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                         ],\n-                        \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": true,\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": 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+                                \"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-                            \"gcp\",\n-                            \"google\",\n-                            \"google-cloud\",\n-                            \"lite\",\n-                            \"message\",\n-                            \"publish\",\n-                            \"pubsub\"\n+                            \"jslt\",\n+                            \"json\",\n+                            \"transform\"\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.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                         \"useCases\": [],\n                         \"version\": \"2.0.0-M3\",\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+                                \"description\": \"Always set to application/json\",\n+                                \"name\": \"mime.type\"\n                             }\n                         ]\n-                    },\n+                    }\n+                ],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"2.0.0-M3\"\n+        },\n+        {\n+            \"artifact\": \"nifi-opentelemetry-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n+                \"processors\": [\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-gcp-nar\",\n+                        \"artifact\": \"nifi-opentelemetry-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\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                         \"multiProcessorUseCases\": [],\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+                            \"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\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"GCP Credentials Provider Service\",\n+                                \"name\": \"Address\",\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\": \"2.0.0-M3\"\n-                                }\n-                            },\n-                            \"gcp-project-id\": {\n-                                \"description\": \"Google Cloud Project ID\",\n-                                \"displayName\": \"Project ID\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"gcp-project-id\",\n-                                \"required\": false,\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+                            \"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\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"gcp-retry-count\",\n+                                \"name\": \"Batch Size\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"gcs-bucket\": {\n-                                \"defaultValue\": \"${gcs.bucket}\",\n-                                \"description\": \"Bucket of the object.\",\n-                                \"displayName\": \"Bucket\",\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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"gcs-bucket\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Client Authentication\",\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+                                \"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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"gcs-generation\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\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+                            \"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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"gcs-key\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Queue Capacity\",\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+                            \"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\": \"proxy-configuration-service\",\n-                                \"required\": false,\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.proxy.ProxyConfigurationService\",\n+                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n                                     \"version\": \"2.0.0-M3\"\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+                            \"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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"storage-api-url\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Worker Threads\",\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\": \"Export Service Requests containing OTLP Telemetry\",\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+                        \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"delete\",\n-                            \"gcs\",\n-                            \"google\",\n-                            \"google cloud\",\n-                            \"storage\"\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.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+                        \"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                         \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\"\n-                    },\n+                        \"version\": \"2.0.0-M3\",\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\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\n+        },\n+        {\n+            \"artifact\": \"nifi-compress-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n+                \"processors\": [\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-gcp-nar\",\n+                        \"artifact\": \"nifi-compress-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -97650,1353 +97839,828 @@\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-                        \"multiProcessorUseCases\": [\n-                            {\n-                                \"configurations\": [\n+                        \"multiProcessorUseCases\": [],\n+                        \"primaryNodeOnly\": false,\n+                        \"propertyDescriptors\": {\n+                            \"Input Compression Strategy\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"configuration\": \"The \\\"Bucket\\\" property should be set to the name of the GCS bucket that files reside in. If the flow being built is to be reused elsewhere, it's a good idea to parameterize     this property by setting it to something like `#{GCS_SOURCE_BUCKET}`.\\nConfigure the \\\"Project ID\\\" property to reflect the ID of your Google Compute Cloud Project.\\n\\nThe \\\"GCP Credentials Provider Service\\\" property should specify an instance of the GCPCredentialsService in order to provide credentials for accessing the bucket.\\n\\nThe 'success' Relationship of this Processor is then connected to FetchGCSObject.\\n\",\n-                                        \"processorClassName\": \"org.apache.nifi.processors.gcp.storage.ListGCSBucket\"\n+                                        \"description\": \"No Compression\",\n+                                        \"displayName\": \"no compression\",\n+                                        \"value\": \"no compression\"\n                                     },\n                                     {\n-                                        \"configuration\": \"\\\"Bucket\\\" = \\\"${gcs.bucket}\\\"\\n\\\"Name\\\" = \\\"${filename}\\\"\\n\\nThe \\\"GCP Credentials Provider Service\\\" property should specify an instance of the GCPCredentialsService in order to provide credentials for accessing the bucket.\\n\",\n-                                        \"processorClassName\": \"org.apache.nifi.processors.gcp.storage.FetchGCSObject\"\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+                                    },\n+                                    {\n+                                        \"description\": \"ZSTD\",\n+                                        \"displayName\": \"zstd\",\n+                                        \"value\": \"zstd\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Brotli\",\n+                                        \"displayName\": \"brotli\",\n+                                        \"value\": \"brotli\"\n                                     }\n                                 ],\n-                                \"description\": \"Retrieve all files in a Google Compute Storage (GCS) bucket\",\n-                                \"keywords\": [\n-                                    \"gcp\",\n-                                    \"gcs\",\n-                                    \"google cloud\",\n-                                    \"google compute storage\",\n-                                    \"state\",\n-                                    \"retrieve\",\n-                                    \"fetch\",\n-                                    \"all\",\n-                                    \"stream\"\n-                                ],\n-                                \"notes\": \"\"\n-                            }\n-                        ],\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+                                \"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\": \"GCP Credentials Provider Service\",\n+                                \"name\": \"Input Compression 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\": \"2.0.0-M3\"\n-                                }\n-                            },\n-                            \"gcp-project-id\": {\n-                                \"description\": \"Google Cloud Project ID\",\n-                                \"displayName\": \"Project ID\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"gcp-project-id\",\n-                                \"required\": false,\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+                            \"Output 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\": \"Output Compression Strategy\",\n+                                        \"propertyName\": \"Output Compression Strategy\"\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                                 \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"gcs-bucket\",\n+                                \"name\": \"Output Compression Level\",\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\": \"Environment variables 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\": \"Key\",\n+                            \"Output Compression Strategy\": {\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+                                    },\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\": \"no compression\",\n+                                \"description\": \"The strategy to use for compressing output FlowFiles\",\n+                                \"displayName\": \"Output Compression Strategy\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"gcs-key\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Output Compression Strategy\",\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\": \"Environment variables 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\": \"Environment variables 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\": \"Environment variables 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. Supported proxies: HTTP + AuthN\",\n-                                \"displayName\": \"Proxy Configuration Service\",\n+                            \"Output Filename Strategy\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Retain the filename attribute value from the input FlowFile\",\n+                                        \"displayName\": \"Original\",\n+                                        \"value\": \"ORIGINAL\"\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+                                    }\n+                                ],\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\": \"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\": \"2.0.0-M3\"\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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"storage-api-url\",\n-                                \"required\": false,\n+                                \"name\": \"Output Filename Strategy\",\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.ListGCSBucket\",\n-                            \"org.apache.nifi.processors.gcp.storage.PutGCSObject\"\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\": false,\n+                        \"sideEffectFree\": true,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"FlowFiles are routed to this relationship after a successful Google Cloud Storage operation.\",\n+                                \"description\": \"FlowFiles will be transferred to the success relationship on compression modification success\",\n                                 \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"FlowFiles are routed to this relationship if the Google Cloud Storage operation fails.\",\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                         \"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-                            \"fetch\",\n-                            \"gcs\",\n-                            \"google\",\n-                            \"google cloud\",\n-                            \"storage\"\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.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.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                         \"useCases\": [],\n                         \"version\": \"2.0.0-M3\",\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+                                \"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\": \"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+                ],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\n+        },\n+        {\n+            \"artifact\": \"nifi-redis-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-gcp-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-redis-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\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-                        \"multiProcessorUseCases\": [],\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+                            \"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\": \"GCP Credentials Provider Service\",\n+                                \"name\": \"Cluster Max Redirects\",\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\": \"2.0.0-M3\"\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-                            \"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+                            \"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\": \"et-state-cache\",\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\": \"2.0.0-M3\"\n-                                }\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-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"et-time-window\",\n+                                \"name\": \"Communication Timeout\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"gcp-project-id\": {\n-                                \"description\": \"Google Cloud Project ID\",\n-                                \"displayName\": \"Project ID\",\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\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"gcp-project-id\",\n-                                \"required\": false,\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+                                \"name\": \"Connection String\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"gcs-bucket\": {\n-                                \"description\": \"Bucket of the object.\",\n-                                \"displayName\": \"Bucket\",\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\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"gcs-bucket\",\n+                                \"name\": \"Database Index\",\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+                            \"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\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"gcs-prefix\",\n+                                \"name\": \"Password\",\n                                 \"required\": false,\n-                                \"sensitive\": false\n+                                \"sensitive\": true\n                             },\n-                            \"gcs-use-generations\": {\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\": \"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+                                \"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\": \"gcs-use-generations\",\n+                                \"name\": \"Pool - Block When Exhausted\",\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+                            \"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\": \"listing-strategy\",\n+                                \"name\": \"Pool - Max Idle\",\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+                            \"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\": \"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\": \"2.0.0-M3\"\n-                                }\n+                                \"name\": \"Pool - Max Total\",\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+                            \"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\": \"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\": \"2.0.0-M3\"\n-                                }\n+                                \"name\": \"Pool - Max Wait Time\",\n+                                \"required\": true,\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+                            \"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\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"storage-api-url\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Pool - Min Evictable Idle Time\",\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.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-                                \"name\": \"success\"\n-                            }\n-                        ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"gcs\",\n-                            \"google\",\n-                            \"google cloud\",\n-                            \"list\",\n-                            \"storage\"\n-                        ],\n-                        \"triggerSerially\": true,\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-                        \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\",\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-                            },\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\": false,\n-                        \"artifact\": \"nifi-gcp-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"f2215c6\"\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 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-                        \"multiProcessorUseCases\": [],\n-                        \"primaryNodeOnly\": false,\n-                        \"propertyDescriptors\": {\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+                            \"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\": \"File Resource Service\",\n+                                \"name\": \"Pool - Min Idle\",\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\": \"2.0.0-M3\"\n-                                }\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+                            \"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\": \"GCP Credentials Provider Service\",\n+                                \"name\": \"Pool - Num Tests Per Eviction Run\",\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\": \"2.0.0-M3\"\n-                                }\n+                                \"sensitive\": false\n                             },\n-                            \"Resource Transfer Source\": {\n+                            \"Pool - Test On Borrow\": {\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\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\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\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\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-                            \"gcp-project-id\": {\n-                                \"description\": \"Google Cloud Project ID\",\n-                                \"displayName\": \"Project ID\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"gcp-project-id\",\n-                                \"required\": false,\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\": \"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\": \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"gcs-bucket\",\n+                                \"name\": \"Pool - Test On Borrow\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"gcs-content-disposition-type\": {\n+                            \"Pool - Test On Create\": {\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\": \"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\": \"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\": \"Environment variables 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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"gcs-key\",\n+                                \"name\": \"Pool - Test On Create\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"gcs-object-acl\": {\n+                            \"Pool - Test On Return\": {\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-                                    },\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-                                    },\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+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\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\": \"false\",\n+                                        \"value\": \"false\"\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\": \"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\": \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"gcs-object-crc32c\",\n-                                \"required\": false,\n+                                \"name\": \"Pool - Test On Return\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"gcs-overwrite-object\": {\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\": \"true\",\n-                                \"description\": \"If false, the upload to GCS will succeed only if the object does not exist.\",\n-                                \"displayName\": \"Overwrite Object\",\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\": \"gcs-overwrite-object\",\n+                                \"name\": \"Pool - Test While Idle\",\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+                            \"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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables 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\": \"Pool - Time Between Eviction Runs\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             },\n-                            \"gzip.content.enabled\": {\n+                            \"Redis Mode\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"description\": \"A single standalone Redis instance.\",\n+                                        \"displayName\": \"Standalone\",\n+                                        \"value\": \"Standalone\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\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\": \"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\": \"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\": \"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\": \"gzip.content.enabled\",\n-                                \"required\": false,\n+                                \"name\": \"Redis Mode\",\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+                            \"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\": \"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\": \"2.0.0-M3\"\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+                            \"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\": \"ENVIRONMENT\",\n                                 \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n-                                \"name\": \"storage-api-url\",\n+                                \"name\": \"Sentinel Master\",\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\": \"FlowFiles are routed to this relationship after a successful Google Cloud Storage operation.\",\n-                                \"name\": \"success\"\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Sentinel Username\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n                             },\n+                            \"Username\": {\n+                                \"description\": \"The username used to authenticate to the Redis server.\",\n+                                \"displayName\": \"Username\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"Username\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            }\n+                        },\n+                        \"providedApiImplementations\": [\n                             {\n-                                \"description\": \"FlowFiles are routed to this relationship if the Google Cloud Storage operation fails.\",\n-                                \"name\": \"failure\"\n+                                \"artifact\": \"nifi-redis-service-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.redis.RedisConnectionPool\",\n+                                \"version\": \"2.0.0-M3\"\n                             }\n                         ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": true,\n-                        \"supportsDynamicRelationships\": false,\n+                        \"supportsDynamicProperties\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"archive\",\n-                            \"gcs\",\n-                            \"google\",\n-                            \"google cloud\",\n-                            \"put\"\n+                            \"cache\",\n+                            \"redis\"\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-                        \"useCases\": [],\n-                        \"version\": \"2.0.0-M3\",\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.redis.service.RedisConnectionPoolService\",\n+                        \"typeDescription\": \"A service that provides connections to Redis.\",\n+                        \"version\": \"2.0.0-M3\"\n                     },\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-gcp-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-redis-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\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-                        \"multiProcessorUseCases\": [],\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+                            \"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\": \"gcp-credentials-provider-service\",\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-gcp-services-api-nar\",\n+                                    \"artifact\": \"nifi-redis-service-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.gcp.credentials.service.GCPCredentialsService\",\n+                                    \"type\": \"org.apache.nifi.redis.RedisConnectionPool\",\n                                     \"version\": \"2.0.0-M3\"\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\": \"Environment variables 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-                            {\n-                                \"description\": \"FlowFiles are routed to success relationship\",\n-                                \"name\": \"success\"\n-                            },\n+                        \"providedApiImplementations\": [\n                             {\n-                                \"description\": \"FlowFiles are routed to failure relationship\",\n-                                \"name\": \"failure\"\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.distributed.cache.client.DistributedMapCacheClient\",\n+                                \"version\": \"2.0.0-M3\"\n                             },\n                             {\n-                                \"description\": \"Upon successful completion, the original FlowFile will be routed to this relationship.\",\n-                                \"name\": \"original\"\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.distributed.cache.client.AtomicDistributedMapCacheClient\",\n+                                \"version\": \"2.0.0-M3\"\n                             }\n                         ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"Cloud\",\n-                            \"Google\",\n-                            \"Machine Learning\",\n-                            \"Vision\"\n+                            \"cache\",\n+                            \"distributed\",\n+                            \"map\",\n+                            \"redis\"\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-                        \"useCases\": [],\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\": \"2.0.0-M3\"\n                     },\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-gcp-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-redis-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\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-                        \"multiProcessorUseCases\": [],\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+                            \"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\": \"gcp-credentials-provider-service\",\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-gcp-services-api-nar\",\n+                                    \"artifact\": \"nifi-redis-service-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.gcp.credentials.service.GCPCredentialsService\",\n+                                    \"type\": \"org.apache.nifi.redis.RedisConnectionPool\",\n                                     \"version\": \"2.0.0-M3\"\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\": \"Environment variables 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-                        \"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-                            },\n-                            {\n-                                \"description\": \"FlowFiles are routed to failure relationship\",\n-                                \"name\": \"failure\"\n-                            },\n+                        \"providedApiImplementations\": [\n                             {\n-                                \"description\": \"Upon successful completion, the original FlowFile will be routed to this relationship.\",\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\": \"2.0.0-M3\"\n                             }\n                         ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"Cloud\",\n-                            \"Google\",\n-                            \"Machine Learning\",\n-                            \"Vision\"\n+                            \"cache\",\n+                            \"distributed\",\n+                            \"map\",\n+                            \"redis\"\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-                        \"useCases\": [],\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\": \"2.0.0-M3\"\n-                    },\n+                    }\n+                ],\n+                \"processors\": [\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-gcp-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-redis-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -99005,111 +98669,136 @@\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                         \"multiProcessorUseCases\": [],\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+                            \"charset\": {\n+                                \"defaultValue\": \"UTF-8\",\n+                                \"description\": \"Specifies the character set to use when storing record field values as strings. All fields will be converted to strings using this character set before being stored in Redis.\",\n+                                \"displayName\": \"Character Set\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n+                                \"name\": \"charset\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"data-record-path\": {\n+                                \"defaultValue\": \"/\",\n+                                \"description\": \"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 Redis instead of sending the entire incoming Record. The property defaults to the root '/' which corresponds to a 'flat' record (all fields/values at the top level of  the Record.\",\n+                                \"displayName\": \"Data Record Path\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"gcp-credentials-provider-service\",\n+                                \"name\": \"data-record-path\",\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\": \"2.0.0-M3\"\n-                                }\n+                                \"sensitive\": false\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+                            \"hash-value-record-path\": {\n+                                \"description\": \"Specifies a RecordPath to evaluate against each Record in order to determine the hash value associated with all the record fields/values (see 'hset' in Redis documentation for more details). The RecordPath must point at exactly one field or an error will occur.\",\n+                                \"displayName\": \"Hash Value Record Path\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"json-payload\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"hash-value-record-path\",\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 parsing incoming data and determining the data's schema\",\n+                                \"displayName\": \"Record Reader\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"output-bucket\",\n-                                \"required\": false,\n-                                \"sensitive\": 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\": \"2.0.0-M3\"\n+                                }\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+                            \"redis-connection-pool\": {\n+                                \"description\": \"\",\n+                                \"displayName\": \"Redis Connection Pool\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"vision-feature-type\",\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\": \"2.0.0-M3\"\n+                                }\n                             }\n                         },\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.gcp.vision.GetGcpVisionAnnotateFilesOperationStatus\"\n-                        ],\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"FlowFiles are routed to success relationship\",\n+                                \"description\": \"FlowFiles having all Records stored in Redis will be routed to this relationship\",\n                                 \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"FlowFiles are routed to failure relationship\",\n+                                \"description\": \"FlowFiles containing Records with processing errors 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                         \"supportsDynamicRelationships\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"Cloud\",\n-                            \"Google\",\n-                            \"Machine Learning\",\n-                            \"Vision\"\n+                            \"hash\",\n+                            \"put\",\n+                            \"record\",\n+                            \"redis\"\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.redis.processor.PutRedisHashRecord\",\n+                        \"typeDescription\": \"Puts record field data into Redis using a specified hash value, which is determined by a RecordPath to a field in each record containing the hash value. The record fields and values are stored as key/value pairs associated by the hash value. NOTE: Neither the evaluated hash value nor any of the field values can be null. If the hash value is null, the FlowFile will be routed to failure. For each of the field values, if the value is null that field will be not set in Redis.\",\n                         \"useCases\": [],\n                         \"version\": \"2.0.0-M3\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"A unique identifier of the operation returned by the Vision server.\",\n-                                \"name\": \"operationKey\"\n+                                \"description\": \"Number of records written to Redis\",\n+                                \"name\": \"redis.success.record.count\"\n                             }\n                         ]\n-                    },\n+                    }\n+                ],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"2.0.0-M3\"\n+        },\n+        {\n+            \"artifact\": \"nifi-cdc-mysql-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n+                \"processors\": [\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-gcp-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-cdc-mysql-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"f2215c6\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -99117,134 +98806,445 @@\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                         \"multiProcessorUseCases\": [],\n-                        \"primaryNodeOnly\": false,\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+                            \"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\": \"gcp-credentials-provider-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\": \"2.0.0-M3\"\n+                                }\n+                            },\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\": \"SSL Mode\",\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"capture-change-mysql-db-name-pattern\",\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+                                \"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-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\": \"2.0.0-M3\"\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+                            \"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\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"json-payload\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"capture-change-mysql-driver-locations\",\n                                 \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"MULTIPLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\",\n+                                        \"URL\",\n+                                        \"DIRECTORY\"\n+                                    ]\n+                                },\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+                            \"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\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"output-bucket\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"capture-change-mysql-hosts\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"capture-change-mysql-include-begin-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\": \"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\": \"capture-change-mysql-include-begin-commit\",\n+                                \"required\": true,\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"capture-change-mysql-include-ddl-events\",\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 environment properties.\",\n+                                \"displayName\": \"Initial Binlog Filename\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"capture-change-mysql-init-binlog-filename\",\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+                            \"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 environment properties.\",\n+                                \"displayName\": \"Initial Binlog Position\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Environment variables and FlowFile Attributes\",\n-                                \"name\": \"vision-feature-type\",\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"capture-change-mysql-init-binlog-position\",\n+                                \"required\": false,\n+                                \"sensitive\": false\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 environment properties.\",\n+                                \"displayName\": \"Initial Binlog GTID\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"capture-change-mysql-name-pattern\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"capture-change-mysql-password\": {\n+                                \"description\": \"Password to access the MySQL cluster\",\n+                                \"displayName\": \"Password\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\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\": \"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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"capture-change-mysql-retrieve-all-records\",\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"capture-change-mysql-server-id\",\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+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"capture-change-mysql-state-update-interval\",\n+                                \"required\": true,\n+                                \"sensitive\": false\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\": \"capture-change-mysql-use-gtid\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"capture-change-mysql-username\": {\n+                                \"description\": \"Username to access the MySQL cluster\",\n+                                \"displayName\": \"Username\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"capture-change-mysql-username\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n+                            },\n+                            \"events-per-flowfile-strategy\": {\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+                                    },\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+                                    }\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\": \"ENVIRONMENT\",\n+                                \"expressionLanguageScopeDescription\": \"Environment variables defined at JVM level and system properties\",\n+                                \"name\": \"number-of-events-per-flowfile\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             }\n                         },\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.gcp.vision.GetGcpVisionAnnotateImagesOperationStatus\"\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\": \"FlowFiles are routed to success relationship\",\n+                                \"description\": \"Successfully created FlowFile from SQL query result set.\",\n                                 \"name\": \"success\"\n-                            },\n-                            {\n-                                \"description\": \"FlowFiles are routed to 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                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"Cloud\",\n-                            \"Google\",\n-                            \"Machine Learning\",\n-                            \"Vision\"\n+                            \"cdc\",\n+                            \"event\",\n+                            \"jdbc\",\n+                            \"mysql\",\n+                            \"sql\",\n+                            \"transaction\"\n                         ],\n-                        \"triggerSerially\": false,\n+                        \"triggerSerially\": true,\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+                        \"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                         \"useCases\": [],\n                         \"version\": \"2.0.0-M3\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"A unique identifier of the operation returned by the Vision server.\",\n-                                \"name\": \"operationKey\"\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\": \"2.0.0-M3\"\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\": \"2.0.0-M3\"\n-        },\n-        {\n-            \"artifact\": \"nifi-provenance-repository-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [],\n-                \"processors\": [],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"2.0.0-M3\"\n         }\n     ],\n     \"identifier\": \"apache-nifi\",\n     \"schedulingDefaults\": {\n         \"defaultConcurrentTasksBySchedulingStrategy\": {\n             \"CRON_DRIVEN\": 1,\n             \"TIMER_DRIVEN\": 1\n"}]}]}
